MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / expr_free

Function expr_free

src/cypher/cypher.c:769–812  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

767/* ── Expression tree helpers ────────────────────────────────────── */
768
769static void expr_free(cbm_expr_t *e) {
770 enum { EXPR_FREE_STACK = 128 };
771 cbm_expr_t *stack[EXPR_FREE_STACK];
772 int top = 0;
773 if (e) {
774 stack[top++] = e;
775 }
776 while (top > 0) {
777 cbm_expr_t *cur = stack[--top];
778 if (cur->type == EXPR_CONDITION) {
779 safe_str_free(&cur->cond.variable);
780 safe_str_free(&cur->cond.property);
781 safe_str_free(&cur->cond.op);
782 safe_str_free(&cur->cond.value);
783 safe_str_free(&cur->cond.coalesce_default);
784 for (int i = 0; i < cur->cond.in_value_count; i++) {
785 safe_str_free(&cur->cond.in_values[i]);
786 }
787 free(cur->cond.in_values);
788 safe_str_free(&cur->cond.func);
789 for (int i = 0; i < cur->cond.arg_count; i++) {
790 safe_str_free(&cur->cond.args[i].variable);
791 safe_str_free(&cur->cond.args[i].property);
792 safe_str_free(&cur->cond.args[i].literal);
793 }
794 free(cur->cond.args);
795 }
796 if (cur->right) {
797 if (top < EXPR_FREE_STACK) {
798 stack[top++] = cur->right;
799 } else {
800 expr_free(cur->right); /* recurse when stack overflows */
801 }
802 }
803 if (cur->left) {
804 if (top < EXPR_FREE_STACK) {
805 stack[top++] = cur->left;
806 } else {
807 expr_free(cur->left); /* recurse when stack overflows */
808 }
809 }
810 free(cur);
811 }
812}
813
814static cbm_expr_t *expr_leaf(cbm_condition_t c) {
815 cbm_expr_t *e = calloc(CBM_ALLOC_ONE, sizeof(cbm_expr_t));

Callers 6

parse_and_exprFunction · 0.85
parse_xor_exprFunction · 0.85
parse_or_exprFunction · 0.85
parse_case_exprFunction · 0.85
free_whereFunction · 0.85
free_case_exprFunction · 0.85

Calls 1

safe_str_freeFunction · 0.85

Tested by

no test coverage detected