#include "expr.h" #include static GE_EXPRESSION **expr_list; static uint32_t expr_cap = 0; static uint32_t expr_count = 0; static GE_EXPRESSION expr0 = {""}; GE_EXPRESSION *GE_new_expression() { GE_EXPRESSION *expr; if (expr_count==expr_cap) { uint32_t n = expr_count ? 2*expr_count : 100; expr_list = (GE_EXPRESSION**)realloc(expr_list, n*sizeof(GE_EXPRESSION *)); expr_cap = n; for (; n-->expr_count;) expr_list[n] = (GE_EXPRESSION*)malloc(sizeof(GE_EXPRESSION)); } expr = expr_list[expr_count]; ++expr_count; *expr = expr0; return expr; } void GE_push_back(GE_EXPRESSION **expr) { GE_EXPRESSION *ex = *expr; if (ex) { GE_push_back(&ex->details); GE_push_back(&ex->arg); GE_push_back(&ex->next); GE_push_back(&ex->down); --expr_count; expr_list[expr_count] = ex; *expr = NULL; } } GE_EXPRESSION *expr_bottom(GE_EXPRESSION* expr) { GE_EXPRESSION *ex = 0; for (; expr; expr=expr->down) ex = expr; return ex; } GE_EXPRESSION *expr_last(GE_EXPRESSION* expr) { GE_EXPRESSION *ex = 0; for (; expr; expr=expr->next) ex = expr; return ex; }