diff options
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 48 |
1 files changed, 41 insertions, 7 deletions
@@ -253,11 +253,20 @@ grecs_tree_free(struct grecs_node *node) static int -fake_callback(enum grecs_callback_command cmd, - grecs_locus_t *locus, - void *varptr, - grecs_value_t *value, - void *cb_data) +fake_callback( +#if GRECS_TREE_API + enum grecs_callback_command cmd, + grecs_node_t *node, + void *varptr, + void *cb_data +#else + enum grecs_callback_command cmd, + grecs_locus_t *locus, + void *varptr, + grecs_value_t *value, + void *cb_data +#endif + ) { return 0; } @@ -692,13 +701,24 @@ grecs_process_ident(struct grecs_keyword *kwp, grecs_value_t *value, target = target_ptr(kwp, (char *) base); - if (kwp->callback) + if (kwp->callback) { +#if GRECS_TREE_API + struct grecs_node node = { 0 }; + node.locus = *locus; + node.v.value = value; + node.ident = (char*) kwp->ident; + kwp->callback(grecs_callback_set_value, + &node, + target, + &kwp->callback_data); +#else kwp->callback(grecs_callback_set_value, locus, target, value, &kwp->callback_data); - else if (kwp->type == grecs_type_void || target == NULL) +#endif + } else if (kwp->type == grecs_type_void || target == NULL) return; else if (!value) { grecs_error(locus, 0, "%s has no value", kwp->ident); @@ -815,11 +835,18 @@ stmt_begin(struct nodeproc_closure *clos, target = target_ptr(kwp, CURRENT_BASE(clos)); clos->cursect = kwp; if (kwp->callback) { +#if GRECS_TREE_API + if (kwp->callback(grecs_callback_section_begin, + node, + target, + &kwp->callback_data)) +#else if (kwp->callback(grecs_callback_section_begin, &node->locus, target, node->v.value, &kwp->callback_data)) +#endif clos->cursect = &fake; } else kwp->callback_data = target; @@ -844,11 +871,18 @@ stmt_end(struct nodeproc_closure *clos, struct grecs_node *node) if (!clos->cursect) abort(); if (callback) +#if GRECS_TREE_API + callback(grecs_callback_section_end, + node, + kwp ? target_ptr(kwp, CURRENT_BASE(clos)) : NULL, + dataptr); +#else callback(grecs_callback_section_end, &node->locus, kwp ? target_ptr(kwp, CURRENT_BASE(clos)) : NULL, NULL, dataptr); +#endif if (kwp) kwp->callback_data = NULL; } |