Set an edge variable in a binding */
| 2480 | |
| 2481 | /* Set an edge variable in a binding */ |
| 2482 | static void binding_set_edge(binding_t *b, const char *var, const cbm_edge_t *edge) { |
| 2483 | /* Check existing — free old fields first */ |
| 2484 | for (int i = 0; i < b->edge_var_count; i++) { |
| 2485 | if (strcmp(b->edge_var_names[i], var) == 0) { |
| 2486 | edge_fields_free(&b->edge_vars[i]); |
| 2487 | edge_deep_copy(&b->edge_vars[i], edge); |
| 2488 | return; |
| 2489 | } |
| 2490 | } |
| 2491 | if (b->edge_var_count >= CYP_MAX_EDGE_VARS) { |
| 2492 | return; |
| 2493 | } |
| 2494 | b->edge_var_names[b->edge_var_count] = var; /* not owned — points to AST string */ |
| 2495 | edge_deep_copy(&b->edge_vars[b->edge_var_count], edge); |
| 2496 | b->edge_var_count++; |
| 2497 | } |
| 2498 | |
| 2499 | /* Free all deep-copied nodes and edges in a binding */ |
| 2500 | static void binding_free(binding_t *b) { |
no test coverage detected