cst-federation iterate: condish statements

This commit is contained in:
John Kerl 2016-11-03 21:56:47 -04:00
parent b20789bede
commit 3590c0a90c
3 changed files with 67 additions and 44 deletions

View file

@ -164,9 +164,6 @@ typedef struct _mlr_dsl_cst_statement_t {
mlr_dsl_cst_statement_freer_t* pstatement_freer;
// For mlr filter
int negate_final_filter;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Specific to each statement type:
@ -382,6 +379,12 @@ mlr_dsl_cst_statement_allocator_t alloc_if_head;
mlr_dsl_cst_statement_allocator_t alloc_while;
mlr_dsl_cst_statement_allocator_t alloc_do_while;
mlr_dsl_cst_statement_allocator_t alloc_bare_boolean;
mlr_dsl_cst_statement_t* alloc_final_filter(
mlr_dsl_cst_t* pcst,
mlr_dsl_ast_node_t* pnode,
int negate_final_filter,
int type_inferencing,
int context_flags);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// mapping/mlr_dsl_cst_for_srec_statements.c

View file

@ -513,3 +513,64 @@ static void handle_bare_boolean(
if (mv_is_non_null(&val))
mv_set_boolean_strict(&val);
}
// ================================================================
typedef struct _final_filter_state_t {
rval_evaluator_t* pexpression_evaluator;
int negate_final_filter;
} final_filter_state_t;
static mlr_dsl_cst_statement_handler_t handle_final_filter;
static mlr_dsl_cst_statement_freer_t free_final_filter;
// ----------------------------------------------------------------
mlr_dsl_cst_statement_t* alloc_final_filter(
mlr_dsl_cst_t* pcst,
mlr_dsl_ast_node_t* pnode,
int negate_final_filter,
int type_inferencing,
int context_flags)
{
final_filter_state_t* pstate = mlr_malloc_or_die(sizeof(final_filter_state_t));
pstate->pexpression_evaluator = rval_evaluator_alloc_from_ast(
pnode, pcst->pfmgr, type_inferencing, context_flags);
pstate->negate_final_filter = negate_final_filter;
return mlr_dsl_cst_statement_valloc(
pnode,
handle_final_filter,
free_final_filter,
pstate);
}
// ----------------------------------------------------------------
// xxx move all frees between allocs & handles. and header-file order too.
static void free_final_filter(mlr_dsl_cst_statement_t* pstatement) { // final_filter
final_filter_state_t* pstate = pstatement->pvstate;
pstate->pexpression_evaluator->pfree_func(pstate->pexpression_evaluator);
free(pstate);
}
// ----------------------------------------------------------------
static void handle_final_filter(
mlr_dsl_cst_statement_t* pstatement,
variables_t* pvars,
cst_outputs_t* pcst_outputs)
{
final_filter_state_t* pstate = pstatement->pvstate;
rval_evaluator_t* pexpression_evaluator = pstate->pexpression_evaluator;
mv_t val = pexpression_evaluator->pprocess_func(pexpression_evaluator->pvstate, pvars);
if (mv_is_non_null(&val)) {
mv_set_boolean_strict(&val);
*pcst_outputs->pshould_emit_rec = val.u.boolv ^ pstate->negate_final_filter;
} else {
*pcst_outputs->pshould_emit_rec = FALSE;
}
}

View file

@ -62,14 +62,6 @@ static mlr_dsl_cst_statement_allocator_t alloc_break;
static mlr_dsl_cst_statement_allocator_t alloc_continue;
static mlr_dsl_cst_statement_allocator_t alloc_filter;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static mlr_dsl_cst_statement_t* alloc_final_filter(
mlr_dsl_cst_t* pcst,
mlr_dsl_ast_node_t* pnode,
int negate_final_filter,
int type_inferencing,
int context_flags);
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_handler_t handle_return_void;
static mlr_dsl_cst_statement_handler_t handle_return_value_from_local_non_map_variable;
@ -96,7 +88,6 @@ static mlr_dsl_cst_statement_handler_t handle_unset;
static mlr_dsl_cst_statement_handler_t handle_unset_all;
static mlr_dsl_cst_statement_handler_t handle_filter;
static mlr_dsl_cst_statement_handler_t handle_final_filter;
static mlr_dsl_cst_statement_handler_t handle_for_oosvar;
static mlr_dsl_cst_statement_handler_t handle_for_oosvar_key_only;
@ -577,7 +568,6 @@ static mlr_dsl_cst_statement_t* alloc_blank(mlr_dsl_ast_node_t* past_node) {
pstatement->pstatement_handler = NULL;
pstatement->pstatement_freer = NULL;
pstatement->pblock_handler = NULL;
pstatement->negate_final_filter = FALSE;
pstatement->pvstate = FALSE;
// xxx pre-federation
@ -625,7 +615,6 @@ mlr_dsl_cst_statement_t* mlr_dsl_cst_statement_valloc(
pstatement->pblock = NULL;
pstatement->pblock_handler = NULL;
pstatement->pstatement_freer = pstatement_freer;
pstatement->negate_final_filter = FALSE;
pstatement->pvstate = pvstate;
return pstatement;
}
@ -645,7 +634,6 @@ mlr_dsl_cst_statement_t* mlr_dsl_cst_statement_valloc_with_block(
pstatement->pblock = pblock;
pstatement->pblock_handler = pblock_handler;
pstatement->pstatement_freer = pstatement_freer;
pstatement->negate_final_filter = FALSE;
pstatement->pvstate = pvstate;
return pstatement;
}
@ -1317,18 +1305,6 @@ static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_cst_t* pcst, mlr_dsl_ast_no
return pstatement;
}
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* alloc_final_filter(mlr_dsl_cst_t* pcst, mlr_dsl_ast_node_t* pnode,
int negate_final_filter, int type_inferencing, int context_flags)
{
mlr_dsl_cst_statement_t* pstatement = alloc_blank(pnode);
pstatement->pstatement_handler = handle_final_filter;
pstatement->negate_final_filter = negate_final_filter;
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, pcst->pfmgr, type_inferencing, context_flags);
return pstatement;
}
// ----------------------------------------------------------------
// Example ASTs, with and without indexing on the left-hand-side oosvar name:
@ -2092,23 +2068,6 @@ static void handle_filter(
}
}
// ----------------------------------------------------------------
static void handle_final_filter(
mlr_dsl_cst_statement_t* pstatement,
variables_t* pvars,
cst_outputs_t* pcst_outputs)
{
rval_evaluator_t* prhs_evaluator = pstatement->prhs_evaluator;
mv_t val = prhs_evaluator->pprocess_func(prhs_evaluator->pvstate, pvars);
if (mv_is_non_null(&val)) {
mv_set_boolean_strict(&val);
*pcst_outputs->pshould_emit_rec = val.u.boolv ^ pstatement->negate_final_filter;
} else {
*pcst_outputs->pshould_emit_rec = FALSE;
}
}
// ----------------------------------------------------------------
static void handle_for_oosvar(
mlr_dsl_cst_statement_t* pstatement,