UDF iterate (fmgr propagate bigdiff)

This commit is contained in:
John Kerl 2016-09-05 11:14:16 -04:00
parent 1069bc51be
commit a82172498f
7 changed files with 197 additions and 172 deletions

View file

@ -366,7 +366,7 @@ void fmgr_list_all_functions_raw(fmgr_t* pfmgr, FILE* output_stream) {
// ================================================================
rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_ast_node_t* pnode,
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table)
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table) // xxx elim tbl arg
{
if ((pnode->type != MD_AST_NODE_TYPE_NON_SIGIL_NAME) && (pnode->type != MD_AST_NODE_TYPE_OPERATOR)) {
@ -394,7 +394,7 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
pevaluator = rval_evaluator_alloc_from_zary_func_name(func_name);
} else if (user_provided_arity == 1) {
mlr_dsl_ast_node_t* parg1_node = pnode->pchildren->phead->pvvalue;
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_unary_func_name(func_name, parg1);
} else if (user_provided_arity == 2) {
@ -403,12 +403,12 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
int type2 = parg2_node->type;
if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_binary_regex_arg2_func_name(func_name,
parg1, parg2_node->text, FALSE);
} else if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_binary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
TYPE_INFER_STRING_FLOAT_INT);
@ -416,9 +416,9 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
// the regexes will be compiled record-by-record rather than once at alloc time, which will
// be slower.
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_binary_func_name(func_name, parg1, parg2);
}
@ -431,18 +431,18 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
// sub/gsub-regex special case:
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
FALSE, parg3);
} else if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
// sub/gsub-regex special case:
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
TYPE_INFER_STRING_FLOAT_INT, parg3);
@ -451,11 +451,11 @@ rval_evaluator_t* fmgr_alloc_from_operator_or_function(fmgr_t* pfmgr, mlr_dsl_as
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
// the regexes will be compiled record-by-record rather than once at alloc time, which will
// be slower.
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
rval_evaluator_t* parg1 = rval_evaluator_alloc_from_ast_aux(parg1_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
rval_evaluator_t* parg2 = rval_evaluator_alloc_from_ast_aux(parg2_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
rval_evaluator_t* parg3 = rval_evaluator_alloc_from_ast_aux(parg3_node, pfmgr, type_inferencing,
context_flags, fcn_lookup_table);
pevaluator = rval_evaluator_alloc_from_ternary_func_name(func_name, parg1, parg2, parg3);
}

View file

@ -5,6 +5,7 @@
#include "mapping/context_flags.h"
#include "mapping/mlr_dsl_cst.h"
#include "mapping/rval_evaluators.h"
#include "mapping/function_manager.h"
#include "mapping/mappers.h"
#include "dsls/mlr_dsl_wrapper.h"
#include "cli/argparse.h"
@ -14,6 +15,7 @@ typedef struct _mapper_filter_state_t {
char* mlr_dsl_expression;
char* comment_stripped_mlr_dsl_expression;
mlr_dsl_ast_node_t* past;
fmgr_t* pfmgr;
mlhmmv_t* poosvars;
rval_evaluator_t* pevaluator;
int do_exclude;
@ -155,7 +157,8 @@ static mapper_t* mapper_filter_alloc(ap_state_t* pargp, char* mlr_dsl_expression
pstate->mlr_dsl_expression = mlr_dsl_expression;
pstate->comment_stripped_mlr_dsl_expression = comment_stripped_mlr_dsl_expression;
pstate->past = past;
pstate->pevaluator = rval_evaluator_alloc_from_ast(past, type_inferencing, context_flags);
pstate->pfmgr = fmgr_alloc();
pstate->pevaluator = rval_evaluator_alloc_from_ast(past, pstate->pfmgr, type_inferencing, context_flags);
pstate->poosvars = mlhmmv_alloc();
pstate->do_exclude = do_exclude;
@ -173,6 +176,7 @@ static void mapper_filter_free(mapper_t* pmapper) {
pstate->pevaluator->pfree_func(pstate->pevaluator);
ap_free(pstate->pargp);
mlr_dsl_ast_node_free(pstate->past);
fmgr_free(pstate->pfmgr);
mlhmmv_free(pstate->poosvars);
free(pstate->mlr_dsl_expression);
free(pstate->comment_stripped_mlr_dsl_expression);

View file

@ -16,43 +16,45 @@
static mlr_dsl_ast_node_t* get_list_for_block(mlr_dsl_ast_node_t* pnode);
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags);
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags);
static mlr_dsl_cst_statement_t* alloc_blank();
static void cst_statement_free(mlr_dsl_cst_statement_t* pstatement);
// ti = type_inferencing
// cf = context_flags
// dfp = do_full_prefixing
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp);
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp);
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* p, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* p, int ti, int cf, char* print_terminator);
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, int dfp);
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, int dfp);
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf);
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* p, fmgr_t* m, int ti, int cf, char* print_terminator);
static file_output_mode_t file_output_mode_from_ast_node_type(mlr_dsl_ast_node_type_t mlr_dsl_ast_node_type);
static mlr_dsl_cst_statement_t* alloc_if_item(
mlr_dsl_ast_node_t* pexprnode,
mlr_dsl_ast_node_t* plistnode,
fmgr_t* pfmgr,
int type_inferencing,
int context_flags);
@ -62,8 +64,8 @@ static mlr_dsl_cst_statement_vararg_t* mlr_dsl_cst_statement_vararg_alloc(
rval_evaluator_t* pemitf_arg_evaluator,
sllv_t* punset_oosvar_keylist_evaluators);
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags);
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags);
static void cst_statement_vararg_free(mlr_dsl_cst_statement_vararg_t* pvararg);
@ -249,6 +251,7 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
pcst->pbegin_statements = sllv_alloc();
pcst->pmain_statements = sllv_alloc();
pcst->pend_statements = sllv_alloc();
pcst->pfmgr = fmgr_alloc();
mlr_dsl_ast_node_t* plistnode = NULL;
for (sllve_t* pe = pnode->proot->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pnode = pe->pvvalue;
@ -257,7 +260,7 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
plistnode = get_list_for_block(pnode);
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pchild = pe->pvvalue;
sllv_append(pcst->pbegin_statements, alloc_cst_statement(pchild, type_inferencing,
sllv_append(pcst->pbegin_statements, alloc_cst_statement(pchild, pcst->pfmgr, type_inferencing,
context_flags | IN_BEGIN_OR_END));
}
break;
@ -265,12 +268,12 @@ mlr_dsl_cst_t* mlr_dsl_cst_alloc(mlr_dsl_ast_t* pnode, int type_inferencing) {
plistnode = get_list_for_block(pnode);
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pchild = pe->pvvalue;
sllv_append(pcst->pend_statements, alloc_cst_statement(pchild, type_inferencing,
sllv_append(pcst->pend_statements, alloc_cst_statement(pchild, pcst->pfmgr, type_inferencing,
context_flags | IN_BEGIN_OR_END));
}
break;
default:
sllv_append(pcst->pmain_statements, alloc_cst_statement(pnode, type_inferencing,
sllv_append(pcst->pmain_statements, alloc_cst_statement(pnode, pcst->pfmgr, type_inferencing,
context_flags));
break;
}
@ -340,7 +343,7 @@ void mlr_dsl_cst_free(mlr_dsl_cst_t* pcst) {
// unset. Most right-hand sides are set up in rval_expr_evaluators.c so the context_flags are
// passed through to there as well.
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, int type_inferencing,
static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing,
int context_flags)
{
switch(pnode->type) {
@ -355,23 +358,23 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
break;
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK:
return alloc_conditional_block(pnode, type_inferencing, context_flags);
return alloc_conditional_block(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_IF_HEAD:
return alloc_if_head(pnode, type_inferencing, context_flags);
return alloc_if_head(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_WHILE:
return alloc_while(pnode, type_inferencing, context_flags | IN_BREAKABLE);
return alloc_while(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE);
break;
case MD_AST_NODE_TYPE_DO_WHILE:
return alloc_do_while(pnode, type_inferencing, context_flags | IN_BREAKABLE);
return alloc_do_while(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE);
break;
case MD_AST_NODE_TYPE_FOR_SREC:
return alloc_for_srec(pnode, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
return alloc_for_srec(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
break;
case MD_AST_NODE_TYPE_FOR_OOSVAR:
return alloc_for_oosvar(pnode, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
return alloc_for_oosvar(pnode, pfmgr, type_inferencing, context_flags | IN_BREAKABLE | IN_BINDABLE);
break;
case MD_AST_NODE_TYPE_BREAK:
@ -380,7 +383,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_break(pnode, type_inferencing, context_flags);
return alloc_break(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_CONTINUE:
if (!(context_flags & IN_BREAKABLE)) {
@ -388,7 +391,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_continue(pnode, type_inferencing, context_flags);
return alloc_continue(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_SREC_ASSIGNMENT:
@ -397,7 +400,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_srec_assignment(pnode, type_inferencing, context_flags);
return alloc_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT:
if (context_flags & IN_BEGIN_OR_END) {
@ -405,10 +408,10 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_indirect_srec_assignment(pnode, type_inferencing, context_flags);
return alloc_indirect_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT:
return alloc_oosvar_assignment(pnode, type_inferencing, context_flags);
return alloc_oosvar_assignment(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT:
if (context_flags & IN_BEGIN_OR_END) {
@ -416,7 +419,7 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_oosvar_from_full_srec_assignment(pnode, type_inferencing, context_flags);
return alloc_oosvar_from_full_srec_assignment(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT:
if (context_flags & IN_BEGIN_OR_END) {
@ -424,51 +427,51 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i
MLR_GLOBALS.bargv0);
exit(1);
}
return alloc_full_srec_from_oosvar_assignment(pnode, type_inferencing, context_flags);
return alloc_full_srec_from_oosvar_assignment(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_UNSET:
return alloc_unset(pnode, type_inferencing, context_flags);
return alloc_unset(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_TEE:
return alloc_tee(pnode, type_inferencing, context_flags);
return alloc_tee(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_EMITF:
return alloc_emitf(pnode, type_inferencing, context_flags);
return alloc_emitf(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_EMITP:
return alloc_emit(pnode, type_inferencing, context_flags, TRUE);
return alloc_emit(pnode, pfmgr, type_inferencing, context_flags, TRUE);
break;
case MD_AST_NODE_TYPE_EMIT:
return alloc_emit(pnode, type_inferencing, context_flags, FALSE);
return alloc_emit(pnode, pfmgr, type_inferencing, context_flags, FALSE);
break;
case MD_AST_NODE_TYPE_EMITP_LASHED:
return alloc_emit_lashed(pnode, type_inferencing, context_flags, TRUE);
return alloc_emit_lashed(pnode, pfmgr, type_inferencing, context_flags, TRUE);
break;
case MD_AST_NODE_TYPE_EMIT_LASHED:
return alloc_emit_lashed(pnode, type_inferencing, context_flags, FALSE);
return alloc_emit_lashed(pnode, pfmgr, type_inferencing, context_flags, FALSE);
break;
case MD_AST_NODE_TYPE_FILTER:
return alloc_filter(pnode, type_inferencing, context_flags);
return alloc_filter(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_DUMP:
return alloc_dump(pnode, type_inferencing, context_flags);
return alloc_dump(pnode, pfmgr, type_inferencing, context_flags);
break;
case MD_AST_NODE_TYPE_PRINT:
return alloc_print(pnode, type_inferencing, context_flags, "\n");
return alloc_print(pnode, pfmgr, type_inferencing, context_flags, "\n");
break;
case MD_AST_NODE_TYPE_PRINTN:
return alloc_print(pnode, type_inferencing, context_flags, "");
return alloc_print(pnode, pfmgr, type_inferencing, context_flags, "");
break;
default:
return alloc_bare_boolean(pnode, type_inferencing, context_flags);
return alloc_bare_boolean(pnode, pfmgr, type_inferencing, context_flags);
break;
}
}
@ -508,8 +511,8 @@ static mlr_dsl_cst_statement_t* alloc_blank() {
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -534,7 +537,7 @@ static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode,
pstatement->pnode_handler = handle_srec_assignment;
pstatement->srec_lhs_field_name = pleft->text;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
return pstatement;
}
@ -547,8 +550,8 @@ static mlr_dsl_cst_statement_t* alloc_srec_assignment(mlr_dsl_ast_node_t* pnode,
// text="x", type=string_literal.
// text="1", type=strnum_literal.
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -562,14 +565,14 @@ static mlr_dsl_cst_statement_t* alloc_indirect_srec_assignment(mlr_dsl_ast_node_
mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue;
pstatement->pnode_handler = handle_indirect_srec_assignment;
pstatement->psrec_lhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
pstatement->psrec_lhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -582,12 +585,12 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnod
exit(1);
}
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, type_inferencing,
context_flags);
sllv_t* poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, pfmgr,
type_inferencing, context_flags);
if (pleft->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST && pright->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
pstatement->pnode_handler = handle_oosvar_to_oosvar_assignment;
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright, pfmgr,
type_inferencing, context_flags);
} else {
pstatement->pnode_handler = handle_oosvar_assignment;
@ -595,14 +598,14 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_assignment(mlr_dsl_ast_node_t* pnod
}
pstatement->poosvar_lhs_keylist_evaluators = poosvar_lhs_keylist_evaluators;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags)
mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -621,13 +624,13 @@ static mlr_dsl_cst_statement_t* alloc_oosvar_from_full_srec_assignment(
}
pstatement->pnode_handler = handle_oosvar_from_full_srec_assignment;
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft,
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pleft, pfmgr,
type_inferencing, context_flags);
return pstatement;
}
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -646,13 +649,13 @@ static mlr_dsl_cst_statement_t* alloc_full_srec_from_oosvar_assignment(mlr_dsl_a
}
pstatement->pnode_handler = handle_full_srec_from_oosvar_assignment;
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright,
pstatement->poosvar_rhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pright, pfmgr,
type_inferencing, context_flags);
return pstatement;
}
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -698,7 +701,8 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
}
sllv_append(pstatement->pvarargs, mlr_dsl_cst_statement_vararg_alloc(
NULL,
rval_evaluator_alloc_from_ast(pnode->pchildren->phead->pvvalue, type_inferencing, context_flags),
rval_evaluator_alloc_from_ast(pnode->pchildren->phead->pvvalue, pfmgr,
type_inferencing, context_flags),
NULL,
NULL));
@ -707,7 +711,7 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
NULL,
NULL,
NULL,
allocate_keylist_evaluators_from_oosvar_node(pnode, type_inferencing, context_flags)));
allocate_keylist_evaluators_from_oosvar_node(pnode, pfmgr, type_inferencing, context_flags)));
} else {
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
@ -719,8 +723,8 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* pnode, int type_
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -732,19 +736,20 @@ static mlr_dsl_cst_statement_t* alloc_while(mlr_dsl_ast_node_t* pnode, int type_
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
type_inferencing, context_flags);
sllv_append(pblock_statements, pstatement);
}
pstatement->pnode_handler = handle_while;
pstatement->pblock_handler = handle_statement_list_with_break_continue;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
pstatement->pblock_statements = pblock_statements;
return pstatement;
}
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -756,13 +761,14 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int ty
for (sllve_t* pe = pleft->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
type_inferencing, context_flags);
sllv_append(pblock_statements, pstatement);
}
pstatement->pnode_handler = handle_do_while;
pstatement->pblock_handler = handle_statement_list_with_break_continue;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, pfmgr, type_inferencing, context_flags);
pstatement->pblock_statements = pblock_statements;
return pstatement;
}
@ -783,8 +789,8 @@ static mlr_dsl_cst_statement_t* alloc_do_while(mlr_dsl_ast_node_t* pnode, int ty
// text="y", type=field_name.
// text="2", type=strnum_literal.
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -807,7 +813,7 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int ty
sllv_t* pblock_statements = sllv_alloc();
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, pfmgr, type_inferencing, context_flags));
}
pstatement->pnode_handler = handle_for_srec;
@ -851,8 +857,8 @@ static mlr_dsl_cst_statement_t* alloc_for_srec(mlr_dsl_ast_node_t* pnode, int ty
// text="8", type=field_name.
// text="9", type=strnum_literal.
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -900,12 +906,12 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int
hss_free(pnameset);
pstatement->poosvar_lhs_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(
pmiddle, type_inferencing, context_flags);
pmiddle, pfmgr, type_inferencing, context_flags);
sllv_t* pblock_statements = sllv_alloc();
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags));
sllv_append(pblock_statements, alloc_cst_statement(pbody_ast_node, pfmgr, type_inferencing, context_flags));
}
pstatement->pblock_statements = pblock_statements;
pstatement->pbound_variables = lhmsmv_alloc();
@ -916,16 +922,16 @@ static mlr_dsl_cst_statement_t* alloc_for_oosvar(mlr_dsl_ast_node_t* pnode, int
return pstatement;
}
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
pstatement->pnode_handler = handle_break;
return pstatement;
}
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
pstatement->pnode_handler = handle_continue;
@ -933,7 +939,7 @@ static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int ty
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnode,
static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -946,7 +952,8 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
mlr_dsl_ast_node_t* pright = pnode->pchildren->phead->pnext->pvvalue;
for (sllve_t* pe = pright->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
type_inferencing, context_flags);
sllv_append(pblock_statements, pstatement);
}
@ -954,7 +961,7 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
pstatement->pblock_handler = (context_flags & IN_BREAKABLE)
? handle_statement_list_with_break_continue
: mlr_dsl_cst_handle_statement_list;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pleft, pfmgr, type_inferencing, context_flags);
pstatement->pblock_statements = pblock_statements;
return pstatement;
}
@ -1006,8 +1013,8 @@ static mlr_dsl_cst_statement_t* alloc_conditional_block(mlr_dsl_ast_node_t* pnod
// x (field_name).
// 16 (strnum_literal).
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1030,7 +1037,7 @@ static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int typ
}
sllv_append(pif_chain_statements, alloc_if_item(pexprnode, plistnode,
type_inferencing, context_flags));
pfmgr, type_inferencing, context_flags));
}
pstatement->pnode_handler = handle_if_head;
@ -1042,7 +1049,7 @@ static mlr_dsl_cst_statement_t* alloc_if_head(mlr_dsl_ast_node_t* pnode, int typ
}
static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
mlr_dsl_ast_node_t* plistnode, int type_inferencing, int context_flags)
mlr_dsl_ast_node_t* plistnode, fmgr_t* pfmgr, int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1050,45 +1057,47 @@ static mlr_dsl_cst_statement_t* alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
for (sllve_t* pe = plistnode->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, type_inferencing, context_flags);
mlr_dsl_cst_statement_t *pstatement = alloc_cst_statement(pbody_ast_node, pfmgr,
type_inferencing, context_flags);
sllv_append(pblock_statements, pstatement);
}
pstatement->pnode_handler = NULL; // handled by the containing if-head evaluator
pstatement->prhs_evaluator = pexprnode != NULL
? rval_evaluator_alloc_from_ast(pexprnode, type_inferencing, context_flags) // if-statement or elif-statement
? rval_evaluator_alloc_from_ast(pexprnode, pfmgr,
type_inferencing, context_flags) // if-statement or elif-statement
: rval_evaluator_alloc_from_boolean(TRUE); // else-statement
pstatement->pblock_statements = pblock_statements;
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
mlr_dsl_ast_node_t* pchild = pnode->pchildren->phead->pvvalue;
pstatement->pnode_handler = handle_filter;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pchild, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pchild, pfmgr, type_inferencing, context_flags);
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
pstatement->pnode_handler = handle_bare_boolean;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, pfmgr, type_inferencing, context_flags);
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1099,7 +1108,7 @@ static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_in
pstatement->pnode_handler = handle_tee_to_stdfp;
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pnode_handler = handle_tee_to_file;
@ -1109,7 +1118,9 @@ static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* pnode, int type_in
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) {
static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
mlr_dsl_ast_node_t* pnamesnode = pnode->pchildren->phead->pvvalue;
@ -1123,7 +1134,7 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
sllv_append(pstatement->pvarargs, mlr_dsl_cst_statement_vararg_alloc(
pchild->text,
NULL,
rval_evaluator_alloc_from_ast(pwalker, type_inferencing, context_flags),
rval_evaluator_alloc_from_ast(pwalker, pfmgr, type_inferencing, context_flags),
NULL));
}
@ -1139,7 +1150,7 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
pstatement->pnode_handler = handle_emitf_to_stdfp;
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pnode_handler = handle_emitf_to_file;
@ -1176,8 +1187,8 @@ static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* pnode, int type_
// text="z", type=strnum_literal.
// text="stream", type=stream:
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags, int do_full_prefixing)
static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags, int do_full_prefixing)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1198,7 +1209,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
sllv_append(pemit_oosvar_namelist_evaluators,
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
}
}
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
@ -1206,7 +1217,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
} else if (pkeylist_node->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
pstatement->pemit_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node,
type_inferencing, context_flags);
pfmgr, type_inferencing, context_flags);
sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc();
if (pemit_node->pchildren->length == 2) {
@ -1214,7 +1225,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
sllv_append(pemit_oosvar_namelist_evaluators,
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
}
}
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
@ -1237,7 +1248,7 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
pstatement->pnode_handler = output_all ? handle_emit_all_to_stdfp : handle_emit_to_stdfp;
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pnode_handler = output_all ? handle_emit_all_to_file : handle_emit_to_file;
@ -1247,8 +1258,8 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags, int do_full_prefixing)
static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags, int do_full_prefixing)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1264,7 +1275,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
for (sllve_t* pe = pkeylists_node->pchildren->phead; pe != NULL; pe = pe->pnext, i++) {
mlr_dsl_ast_node_t* pkeylist_node = pe->pvvalue;
pstatement->ppemit_keylist_evaluators[i] = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node,
type_inferencing, context_flags);
pfmgr, type_inferencing, context_flags);
}
sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc();
@ -1273,7 +1284,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_ast_node_t* pkeynode = pe->pvvalue;
sllv_append(pemit_oosvar_namelist_evaluators,
rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
rval_evaluator_alloc_from_ast(pkeynode, pfmgr, type_inferencing, context_flags));
}
}
pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators;
@ -1290,7 +1301,7 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
pstatement->pnode_handler = handle_emit_lashed_to_stdfp;
pstatement->stdfp = (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) ? stdout : stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pnode_handler = handle_emit_lashed_to_file;
@ -1300,8 +1311,8 @@ static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* pnode, int
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
@ -1314,7 +1325,7 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i
pstatement->pnode_handler = handle_dump;
pstatement->stdfp = stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pmulti_out = multi_out_alloc();
@ -1325,8 +1336,8 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags,
char* print_terminator)
static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags, char* print_terminator)
{
if ((pnode->pchildren == NULL) || (pnode->pchildren->length != 2)) {
fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
@ -1335,7 +1346,7 @@ static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_
}
mlr_dsl_cst_statement_t* pstatement = alloc_blank();
mlr_dsl_ast_node_t* pvalue_node = pnode->pchildren->phead->pvvalue;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, type_inferencing, context_flags);
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, pfmgr, type_inferencing, context_flags);
pstatement->print_terminator = print_terminator;
mlr_dsl_ast_node_t* poutput_node = pnode->pchildren->phead->pnext->pvvalue;
@ -1345,7 +1356,7 @@ static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_
} else if (pfilename_node->type == MD_AST_NODE_TYPE_STDERR) {
pstatement->stdfp = stderr;
} else {
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node,
pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, pfmgr,
type_inferencing, context_flags);
pstatement->file_output_mode = file_output_mode_from_ast_node_type(poutput_node->type);
pstatement->pmulti_out = multi_out_alloc();
@ -2574,8 +2585,8 @@ static void handle_print(
// text="stream", type=stream:
// pnode is input; pkeylist_evaluators is appended to.
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, int type_inferencing,
int context_flags)
static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
sllv_t* pkeylist_evaluators = sllv_alloc();
@ -2584,7 +2595,8 @@ static sllv_t* allocate_keylist_evaluators_from_oosvar_node(mlr_dsl_ast_node_t*
if (pkeynode->type == MD_AST_NODE_TYPE_STRING_LITERAL) {
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_string(pkeynode->text));
} else {
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, pfmgr,
type_inferencing, context_flags));
}
}
return pkeylist_evaluators;

View file

@ -3,10 +3,11 @@
#include "cli/mlrcli.h"
#include "containers/mlr_dsl_ast.h"
#include "rval_evaluators.h"
#include "containers/lhmsmv.h"
#include "containers/bind_stack.h"
#include "containers/loop_stack.h"
#include "mapping/rval_evaluators.h"
#include "mapping/function_manager.h"
#include "output/multi_out.h"
#include "output/multi_lrec_writer.h"
@ -168,6 +169,9 @@ typedef struct _mlr_dsl_cst_t {
sllv_t* pbegin_statements;
sllv_t* pmain_statements;
sllv_t* pend_statements;
// Function manager for built-in functions as well as user-defined functions (which are CST-specific).
fmgr_t* pfmgr;
} mlr_dsl_cst_t;
// ----------------------------------------------------------------

View file

@ -35,15 +35,15 @@
// rval_expr_evaluators.c
// Topmost function:
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* past, int type_inferencing, int context_flags);
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags,
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* past, fmgr_t* pfmgr, int type_inferencing, int context_flags);
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags,
function_lookup_t* fcn_lookup_table);
// Next level:
rval_evaluator_t* rval_evaluator_alloc_from_field_name(char* field_name, int type_inferencing);
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags);
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags);
// This is used for evaluating strings and numbers in literal expressions, e.g. '$x = "abc"'
@ -60,7 +60,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_string(char* string);
rval_evaluator_t* rval_evaluator_alloc_from_boolean_literal(char* string);
rval_evaluator_t* rval_evaluator_alloc_from_boolean(int boolval);
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags);
rval_evaluator_t* rval_evaluator_alloc_from_NF();
rval_evaluator_t* rval_evaluator_alloc_from_NR();

View file

@ -20,11 +20,12 @@
// there, and (b) because we get far better control over error messages here (vs. 'syntax error').
// The context flags are used as the CST is built from the AST, for CST-build-time validation.
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) {
return rval_evaluator_alloc_from_ast_aux(pnode, type_inferencing, context_flags, FUNCTION_LOOKUP_TABLE);
// xxx elim aux
rval_evaluator_t* rval_evaluator_alloc_from_ast(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr, int type_inferencing, int context_flags) {
return rval_evaluator_alloc_from_ast_aux(pnode, pfmgr, type_inferencing, context_flags, FUNCTION_LOOKUP_TABLE);
}
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags, function_lookup_t* fcn_lookup_table)
{
if (pnode->pchildren == NULL) { // leaf node
@ -70,7 +71,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
MLR_GLOBALS.bargv0);
exit(1);
}
return rval_evaluator_alloc_from_indirect_field_name(pnode->pchildren->phead->pvvalue,
return rval_evaluator_alloc_from_indirect_field_name(pnode->pchildren->phead->pvvalue, pfmgr,
type_inferencing, context_flags);
} else if (pnode->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) {
@ -79,15 +80,15 @@ rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* pnode,
MLR_GLOBALS.bargv0, MLR_GLOBALS.bargv0);
exit(1);
}
return rval_evaluator_alloc_from_oosvar_keylist(pnode, type_inferencing, context_flags);
return rval_evaluator_alloc_from_oosvar_keylist(pnode, pfmgr, type_inferencing, context_flags);
} else if (pnode->type == MD_AST_NODE_TYPE_ENV) {
return rval_evaluator_alloc_from_environment(pnode, type_inferencing, context_flags);
return rval_evaluator_alloc_from_environment(pnode, pfmgr, type_inferencing, context_flags);
} else {
return fmgr_alloc_from_operator_or_function(NULL, pnode, type_inferencing, context_flags,
fcn_lookup_table); // xxx rework ptr args
return fmgr_alloc_from_operator_or_function(pfmgr, pnode, type_inferencing, context_flags,
fcn_lookup_table); // xxx elim tbl arg
}
}
@ -215,13 +216,13 @@ static void rval_evaluator_indirect_field_name_free(rval_evaluator_t* pevaluator
free(pevaluator);
}
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnamenode,
rval_evaluator_t* rval_evaluator_alloc_from_indirect_field_name(mlr_dsl_ast_node_t* pnamenode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
rval_evaluator_indirect_field_name_state_t* pstate = mlr_malloc_or_die(
sizeof(rval_evaluator_indirect_field_name_state_t));
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, type_inferencing, context_flags);
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, pfmgr, type_inferencing, context_flags);
rval_evaluator_t* pevaluator = mlr_malloc_or_die(sizeof(rval_evaluator_t));
pevaluator->pvstate = pstate;
@ -301,7 +302,7 @@ static void rval_evaluator_oosvar_keylist_free(rval_evaluator_t* pevaluator) {
// oosvar_keylist (oosvar_keylist):
// 5 (string_literal).
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
rval_evaluator_oosvar_keylist_state_t* pstate = mlr_malloc_or_die(
@ -314,7 +315,8 @@ rval_evaluator_t* rval_evaluator_alloc_from_oosvar_keylist(mlr_dsl_ast_node_t* p
if (pkeynode->type == MD_AST_NODE_TYPE_STRING_LITERAL) {
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_string(pkeynode->text));
} else {
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags));
sllv_append(pkeylist_evaluators, rval_evaluator_alloc_from_ast(pkeynode, pfmgr,
type_inferencing, context_flags));
}
}
pstate->poosvar_rhs_keylist_evaluators = pkeylist_evaluators;
@ -547,7 +549,7 @@ static void rval_evaluator_environment_free(rval_evaluator_t* pevaluator) {
free(pevaluator);
}
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode,
rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnode, fmgr_t* pfmgr,
int type_inferencing, int context_flags)
{
rval_evaluator_environment_state_t* pstate = mlr_malloc_or_die(sizeof(rval_evaluator_environment_state_t));
@ -555,7 +557,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_environment(mlr_dsl_ast_node_t* pnod
mlr_dsl_ast_node_t* pnamenode = pnode->pchildren->phead->pnext->pvvalue;
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, type_inferencing, context_flags);
pstate->pname_evaluator = rval_evaluator_alloc_from_ast(pnamenode, pfmgr, type_inferencing, context_flags);
pevaluator->pprocess_func = rval_evaluator_environment_func;
pevaluator->pfree_func = rval_evaluator_environment_free;

View file

@ -1,6 +1,7 @@
#include "lib/mlr_globals.h"
#include "lib/minunit.h"
#include "mapping/rval_evaluators.h"
#include "mapping/function_manager.h"
// ----------------------------------------------------------------
int tests_run = 0;
@ -148,7 +149,9 @@ static char * test_numbers() {
mlr_dsl_ast_node_t* p2logxnode = mlr_dsl_ast_node_alloc_binary("*", MD_AST_NODE_TYPE_OPERATOR,
p2node, plogxnode);
rval_evaluator_t* pastr = rval_evaluator_alloc_from_ast(p2logxnode, TYPE_INFER_STRING_FLOAT_INT, 0);
fmgr_t* pfmgr = fmgr_alloc();
rval_evaluator_t* pastr = rval_evaluator_alloc_from_ast(p2logxnode, pfmgr, TYPE_INFER_STRING_FLOAT_INT, 0);
fmgr_free(pfmgr);
lrec_t* prec = lrec_unbacked_alloc();
lhmsmv_t* ptyped_overlay = lhmsmv_alloc();