unset iterate

This commit is contained in:
John Kerl 2016-02-28 18:18:13 -05:00
parent 1bc6e34628
commit 7f273dec04
5 changed files with 16 additions and 6 deletions

View file

@ -285,7 +285,7 @@ mv_t* mlhmmv_get(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror) {
return NULL;
}
mlhmmv_level_t* plevel = pmap->proot_level;
mlhmmv_level_value_t* plevel_value = mlhmmv_level_get(plevel, &prest_keys->value);
mlhmmv_level_value_t* plevel_value = mlhmmv_get_next_level(plevel, &prest_keys->value);
while (prest_keys->pnext != NULL) {
if (plevel_value == NULL) {
return NULL;
@ -296,7 +296,7 @@ mv_t* mlhmmv_get(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror) {
}
plevel = plevel_value->u.pnext_level;
prest_keys = prest_keys->pnext;
plevel_value = mlhmmv_level_get(plevel, &prest_keys->value);
plevel_value = mlhmmv_get_next_level(plevel, &prest_keys->value);
}
if (plevel_value == NULL) {
return NULL;
@ -308,7 +308,7 @@ mv_t* mlhmmv_get(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror) {
return &plevel_value->u.mlrval;
}
mlhmmv_level_value_t* mlhmmv_level_get(mlhmmv_level_t* plevel, mv_t* plevel_key) {
mlhmmv_level_value_t* mlhmmv_get_next_level(mlhmmv_level_t* plevel, mv_t* plevel_key) {
int ideal_index = 0;
int index = mlhmmv_level_find_index_for_key(plevel, plevel_key, &ideal_index);
mlhmmv_level_entry_t* pentry = &plevel->entries[index];

View file

@ -77,7 +77,7 @@ void mlhmmv_put(mlhmmv_t* pmap, sllmv_t* pmvkeys, mv_t* pterminal_value);
mv_t* mlhmmv_get(mlhmmv_t* pmap, sllmv_t* pmvkeys, int* perror);
// Made public for the oosvar-emitter.
mlhmmv_level_value_t* mlhmmv_level_get(mlhmmv_level_t* pmap, mv_t* plevel_key);
mlhmmv_level_value_t* mlhmmv_get_next_level(mlhmmv_level_t* pmap, mv_t* plevel_key);
void mlhmmv_print_json_stacked(mlhmmv_t* pmap, int quote_values_always);
void mlhmmv_print_json_single_line(mlhmmv_t* pmap, int quote_values_always);

View file

@ -505,6 +505,15 @@ md_emit(A) ::= MD_TOKEN_EMIT(O) md_oosvar_name(B) MD_TOKEN_COMMA md_emit_args(C)
B = mlr_dsl_ast_node_prepend_arg(C, B);
A = mlr_dsl_ast_node_set_function_name(B, O->text);
}
md_emit(A) ::= MD_TOKEN_EMIT(O) md_keyed_oosvar_name(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B);
}
md_emit(A) ::= MD_TOKEN_EMIT(O) md_keyed_oosvar_name(B) MD_TOKEN_COMMA md_emit_args(C). {
B = mlr_dsl_ast_node_prepend_arg(C, B);
A = mlr_dsl_ast_node_set_function_name(B, O->text);
}
md_emit_args(A) ::= md_rhs(B). {
A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_EMIT, B);
}

View file

@ -590,7 +590,7 @@ static void mlr_dsl_cst_node_evaluate_emit(
// xxx alloc once & keep in item struct. or not. no huge impact (and, zero-copy).
mv_t mv0 = mv_from_string_no_free(pitem->output_field_name);
mlhmmv_level_value_t* proot_value = mlhmmv_level_get(poosvars->proot_level, &mv0);
mlhmmv_level_value_t* proot_value = mlhmmv_get_next_level(poosvars->proot_level, &mv0);
if (proot_value == NULL) {
mv_free(&mv0);
return;

View file

@ -55,7 +55,8 @@ UNSET
PARAMETERIZED EMIT
!! need submaps:
mlr put -v 'emit @a["sums"]'
o mlr put -v 'emit @a["sums"]'
o various-level emit and emitf. only req't for emitf is all args must be single at that level.
* evolve & extend the UTs
* handle too-short, too-long, just-right cases