Index: constraint.c =================================================================== --- constraint.c (revision 36870) +++ constraint.c (revision 36871) @@ -313,7 +313,14 @@ break; case PCB_ORDC_ERROR: - printf("error!\n"); + if (ctx->error_cb == NULL) + break; + + pcb_ordc_exec_node(ctx, &a, node->ch_first); + pcb_ordc_exec_node(ctx, &b, node->ch_first->next); + ctx->error_cb(ctx, a.val.s, b.val.s); /* no need to convert; grammar ensures static strings */ + val_free(&a); + val_free(&b); break; case PCB_ORDC_CINT: Index: constraint.h =================================================================== --- constraint.h (revision 36870) +++ constraint.h (revision 36871) @@ -61,11 +61,15 @@ } val; } pcb_ordc_val_t; -typedef struct pcb_ordc_ctx_s { - int dummy; +typedef struct pcb_ordc_ctx_s pcb_ordc_ctx_t; +struct pcb_ordc_ctx_s { + void *user_data; pcb_ordc_node_t *root; -} pcb_ordc_ctx_t; + /*** application provided callbacks ***/ + void (*error_cb)(pcb_ordc_ctx_t *ctx, const char *varname, const char *msg); +}; + int pcb_ordc_parse_str(pcb_ordc_ctx_t *ctx, const char *script);