mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-21 02:23:20 +00:00
xvfuncs iterate
This commit is contained in:
parent
e3a0a716c4
commit
ffef9d1bf3
5 changed files with 44 additions and 10 deletions
|
|
@ -16,7 +16,7 @@ boxed_xval_t b_x_haskey_xfunc(boxed_xval_t* pmapval, boxed_xval_t* pkeyval) {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
boxed_xval_t b_x_length_xfunc(boxed_xval_t* pxval1) {
|
||||
boxed_xval_t i_x_length_xfunc(boxed_xval_t* pxval1) {
|
||||
if (pxval1->xval.is_terminal) {
|
||||
return box_ephemeral_val(
|
||||
mv_from_int(1)
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ static inline boxed_xval_t b_x_typeof_xfunc(boxed_xval_t* pbxval1) {
|
|||
// ----------------------------------------------------------------
|
||||
boxed_xval_t b_x_haskey_xfunc(boxed_xval_t* pmapval, boxed_xval_t* pkeyval);
|
||||
|
||||
boxed_xval_t b_x_length_xfunc(boxed_xval_t* pbxval1);
|
||||
boxed_xval_t i_x_length_xfunc(boxed_xval_t* pbxval1);
|
||||
|
||||
// xxx to do (non-inline):
|
||||
//boxed_xval_t i_m_depth_xfunc(boxed_xval_t* pbxval1);
|
||||
|
|
|
|||
|
|
@ -1149,17 +1149,15 @@ static rxval_evaluator_t* fmgr_alloc_xevaluator_from_variadic_func_name(
|
|||
// ----------------------------------------------------------------
|
||||
static rxval_evaluator_t* fmgr_alloc_xevaluator_from_unary_func_name(char* fnnm, rxval_evaluator_t* parg1) {
|
||||
if (streq(fnnm, "ismap")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
return rxval_evaluator_alloc_from_b_x_func(b_x_ismap_xfunc, parg1);
|
||||
} else if (streq(fnnm, "isscalar")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
return rxval_evaluator_alloc_from_b_m_func(b_x_isscalar_xfunc, parg1);
|
||||
} else if (streq(fnnm, "isemptymap")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
return rxval_evaluator_alloc_from_b_m_func(b_x_isemptymap_xfunc, parg1);
|
||||
} else if (streq(fnnm, "isnonemptymap")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
} else if (streq(fnnm, "haskey")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
return rxval_evaluator_alloc_from_b_m_func(b_x_isnonemptymap_xfunc, parg1);
|
||||
} else if (streq(fnnm, "length")) {
|
||||
return rxval_evaluator_alloc_from_b_m_func(NULL/*xxx temp*/, parg1);
|
||||
return rxval_evaluator_alloc_from_b_m_func(i_x_length_xfunc, parg1);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1170,7 +1168,7 @@ static rxval_evaluator_t* fmgr_alloc_xevaluator_from_binary_func_name(char* fnnm
|
|||
rxval_evaluator_t* parg2)
|
||||
{
|
||||
if (streq(fnnm, "haskey")) {
|
||||
return rxval_evaluator_alloc_from_b_mx_func(NULL/*xxx temp*/, parg1, parg2);
|
||||
return rxval_evaluator_alloc_from_b_mx_func(b_x_haskey_xfunc, parg1, parg2);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -1198,6 +1196,8 @@ static void resolve_func_callsite(fmgr_t* pfmgr, rval_evaluator_t* pev) {
|
|||
|
||||
// xxx XXX builtin xev
|
||||
|
||||
// xxx XXX need to differentiate between map-in,map-out, map-in,scalar-out, and scalar-in,scalar-out
|
||||
|
||||
pevaluator = construct_builtin_function_callsite_evaluator(pfmgr, pcallsite);
|
||||
if (pevaluator != NULL) {
|
||||
*pev = *pevaluator;
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@ rxval_evaluator_t* rxval_evaluator_alloc_wrapping_rval(
|
|||
// rxval_func_evaluators.c
|
||||
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_variadic_func(xv_variadic_func_t* pfunc, rxval_evaluator_t** pargs, int nargs);
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_b_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1);
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_b_m_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1);
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_b_mx_func(xv_binary_func_t* pfunc, rxval_evaluator_t* parg1,
|
||||
rxval_evaluator_t* parg2);
|
||||
|
|
|
|||
|
|
@ -67,6 +67,39 @@ rxval_evaluator_t* rxval_evaluator_alloc_from_variadic_func(
|
|||
return pxevaluator;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
typedef struct _rxval_evaluator_b_x_state_t {
|
||||
xv_unary_func_t* pfunc;
|
||||
rxval_evaluator_t* parg1;
|
||||
} rxval_evaluator_b_x_state_t;
|
||||
|
||||
static boxed_xval_t rxval_evaluator_b_x_func(void* pvstate, variables_t* pvars) {
|
||||
rxval_evaluator_b_x_state_t* pstate = pvstate;
|
||||
boxed_xval_t bxval1 = pstate->parg1->pprocess_func(pstate->parg1->pvstate, pvars);
|
||||
|
||||
return pstate->pfunc(&bxval1);
|
||||
}
|
||||
|
||||
static void rxval_evaluator_b_x_free(rxval_evaluator_t* pxevaluator) {
|
||||
rxval_evaluator_b_x_state_t* pstate = pxevaluator->pvstate;
|
||||
pstate->parg1->pfree_func(pstate->parg1);
|
||||
free(pstate);
|
||||
free(pxevaluator);
|
||||
}
|
||||
|
||||
rxval_evaluator_t* rxval_evaluator_alloc_from_b_x_func(xv_unary_func_t* pfunc, rxval_evaluator_t* parg1) {
|
||||
rxval_evaluator_b_x_state_t* pstate = mlr_malloc_or_die(sizeof(rxval_evaluator_b_x_state_t));
|
||||
pstate->pfunc = pfunc;
|
||||
pstate->parg1 = parg1;
|
||||
|
||||
rxval_evaluator_t* pxevaluator = mlr_malloc_or_die(sizeof(rxval_evaluator_t));
|
||||
pxevaluator->pvstate = pstate;
|
||||
pxevaluator->pprocess_func = rxval_evaluator_b_x_func;
|
||||
pxevaluator->pfree_func = rxval_evaluator_b_x_free;
|
||||
|
||||
return pxevaluator;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
typedef struct _rxval_evaluator_b_m_state_t {
|
||||
xv_unary_func_t* pfunc;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue