aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/tree.c b/src/tree.c
index abf170e..a0f8736 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -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;
}

Return to:

Send suggestions and report system problems to the System administrator.