mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-28 18:21:52 +00:00
cst-federation iterate: condish statements
This commit is contained in:
parent
b20789bede
commit
3590c0a90c
3 changed files with 67 additions and 44 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue