// ---------------------------------------------------------------- static void mlr_dsl_ast_node_print_aux(mlr_dsl_ast_node_t* pnode, int level) { if (pnode == NULL) return; for (int i = 0; i < level; i++) printf(" "); printf("%s (%s)%s\n", pnode->text, mlr_dsl_ast_node_describe_type(pnode->type), (pnode->pchildren != NULL) ? ":" : "."); if (pnode->pchildren != NULL) { for (sllve_t* pe = pnode->pchildren->phead; pe != NULL; pe = pe->pnext) { mlr_dsl_ast_node_print_aux(pe->pvdata, level + 1); } } }
// xxx comment me ... static mapper_t* mapper_put_alloc(sllv_t* pasts) { mapper_put_state_t* pstate = mlr_malloc_or_die(sizeof(mapper_put_state_t)); pstate->num_evaluators = pasts->length; pstate->output_field_names = mlr_malloc_or_die(pasts->length * sizeof(char*)); pstate->pevaluators = mlr_malloc_or_die(pasts->length * sizeof(lrec_evaluator_t*)); int i = 0; for (sllve_t* pe = pasts->phead; pe != NULL; pe = pe->pnext, i++) { mlr_dsl_ast_node_t* past = pe->pvdata; if ((past->type != MLR_DSL_AST_NODE_TYPE_OPERATOR) || !streq(past->text, "=")) { fprintf(stderr, "Expected assignment-rooted AST; got operator \"%s\" with node type %s.\n", past->text, mlr_dsl_ast_node_describe_type(past->type)); return NULL; } else if ((past->pchildren == NULL) || (past->pchildren->length != 2)) { fprintf(stderr, "xxx write this error message please.\n"); return NULL; } mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvdata; mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvdata; if (pleft->type != MLR_DSL_AST_NODE_TYPE_FIELD_NAME) { fprintf(stderr, "xxx write this error message please.\n"); return NULL; } else if (pleft->pchildren != NULL) { fprintf(stderr, "xxx write this error message please.\n"); return NULL; } char* output_field_name = pleft->text; lrec_evaluator_t* pevaluator = lrec_evaluator_alloc_from_ast(pright); pstate->pevaluators[i] = pevaluator; pstate->output_field_names[i] = output_field_name; } mapper_t* pmapper = mlr_malloc_or_die(sizeof(mapper_t)); pmapper->pvstate = (void*)pstate; pmapper->pprocess_func = mapper_put_process; pmapper->pfree_func = mapper_put_free; return pmapper; }