Set an edge variable in a binding */
| 2279 | |
| 2280 | /* Set an edge variable in a binding */ |
| 2281 | static void binding_set_edge(binding_t *b, const char *var, const cbm_edge_t *edge) { |
| 2282 | /* Check existing — free old fields first */ |
| 2283 | for (int i = 0; i < b->edge_var_count; i++) { |
| 2284 | if (strcmp(b->edge_var_names[i], var) == 0) { |
| 2285 | edge_fields_free(&b->edge_vars[i]); |
| 2286 | edge_deep_copy(&b->edge_vars[i], edge); |
| 2287 | return; |
| 2288 | } |
| 2289 | } |
| 2290 | if (b->edge_var_count >= CYP_MAX_EDGE_VARS) { |
| 2291 | return; |
| 2292 | } |
| 2293 | b->edge_var_names[b->edge_var_count] = var; /* not owned — points to AST string */ |
| 2294 | edge_deep_copy(&b->edge_vars[b->edge_var_count], edge); |
| 2295 | b->edge_var_count++; |
| 2296 | } |
| 2297 | |
| 2298 | /* Free all deep-copied nodes and edges in a binding */ |
| 2299 | static void binding_free(binding_t *b) { |
no test coverage detected