diff --git a/c/containers/mlhmmv.c b/c/containers/mlhmmv.c index 6e6f7547c..43b32a1fa 100644 --- a/c/containers/mlhmmv.c +++ b/c/containers/mlhmmv.c @@ -180,6 +180,7 @@ static void json_print_string_escaped(FILE* ostream, char* s) { mlhmmv_xvalue_t mlhmmv_xvalue_alloc_empty_map() { mlhmmv_xvalue_t xval = (mlhmmv_xvalue_t) { .is_terminal = FALSE, + .terminal_mlrval= mv_absent(), .pnext_level = mlhmmv_level_alloc() }; return xval; @@ -1310,7 +1311,7 @@ void mlhmmv_level_remove(mlhmmv_level_t* plevel, sllmve_t* prestkeys) { // ================================================================ mlhmmv_root_t* mlhmmv_root_alloc() { mlhmmv_root_t* pmap = mlr_malloc_or_die(sizeof(mlhmmv_root_t)); - pmap->proot_level = mlhmmv_level_alloc(); + pmap->root_xvalue = mlhmmv_xvalue_alloc_empty_map(); return pmap; } @@ -1318,18 +1319,19 @@ mlhmmv_root_t* mlhmmv_root_alloc() { void mlhmmv_root_free(mlhmmv_root_t* pmap) { if (pmap == NULL) return; - mlhmmv_level_free(pmap->proot_level); + mlhmmv_level_free(pmap->root_xvalue.pnext_level); free(pmap); } // ---------------------------------------------------------------- void mlhmmv_root_clear(mlhmmv_root_t* pmap) { - mlhmmv_level_clear(pmap->proot_level); + mlhmmv_level_clear(pmap->root_xvalue.pnext_level); } // ---------------------------------------------------------------- mv_t* mlhmmv_root_look_up_and_ref_terminal(mlhmmv_root_t* pmap, sllmv_t* pmvkeys, int* perror) { - mlhmmv_level_entry_t* plevel_entry = mlhmmv_level_look_up_and_ref_entry(pmap->proot_level, pmvkeys->phead, perror); + mlhmmv_level_entry_t* plevel_entry = mlhmmv_level_look_up_and_ref_entry(pmap->root_xvalue.pnext_level, + pmvkeys->phead, perror); if (plevel_entry == NULL) { return NULL; } @@ -1346,24 +1348,25 @@ mv_t* mlhmmv_root_look_up_and_ref_terminal(mlhmmv_root_t* pmap, sllmv_t* pmvkeys // * level = map["a"], rest_keys = [2, "c"] // * level = map["a"][2], rest_keys = ["c"] mlhmmv_level_t* mlhmmv_root_look_up_or_create_then_ref_level(mlhmmv_root_t* pmap, sllmv_t* pmvkeys) { - return mlhmmv_level_ref_or_create(pmap->proot_level, pmvkeys->phead); + return mlhmmv_level_ref_or_create(pmap->root_xvalue.pnext_level, pmvkeys->phead); } // ---------------------------------------------------------------- // Example: keys = ["a", 2, "c"] and value = 4. void mlhmmv_root_put_terminal(mlhmmv_root_t* pmap, sllmv_t* pmvkeys, mv_t* pterminal_value) { - mlhmmv_level_put_terminal(pmap->proot_level, pmvkeys->phead, pterminal_value); + mlhmmv_level_put_terminal(pmap->root_xvalue.pnext_level, pmvkeys->phead, pterminal_value); } // ---------------------------------------------------------------- static void mlhmmv_root_put_xvalue(mlhmmv_root_t* pmap, sllmv_t* pmvkeys, mlhmmv_xvalue_t* pvalue) { - mlhmmv_level_put_xvalue(pmap->proot_level, pmvkeys->phead, pvalue); + mlhmmv_level_put_xvalue(pmap->root_xvalue.pnext_level, pmvkeys->phead, pvalue); } // ---------------------------------------------------------------- void mlhmmv_root_copy_submap(mlhmmv_root_t* pmap, sllmv_t* ptokeys, sllmv_t* pfromkeys) { int error = 0; - mlhmmv_level_entry_t* pfromentry = mlhmmv_level_look_up_and_ref_entry(pmap->proot_level, pfromkeys->phead, &error); + mlhmmv_level_entry_t* pfromentry = mlhmmv_level_look_up_and_ref_entry(pmap->root_xvalue.pnext_level, + pfromkeys->phead, &error); if (pfromentry != NULL) { mlhmmv_xvalue_t submap = mlhmmv_xvalue_copy(&pfromentry->level_xvalue); mlhmmv_root_put_xvalue(pmap, ptokeys, &submap); @@ -1371,17 +1374,19 @@ void mlhmmv_root_copy_submap(mlhmmv_root_t* pmap, sllmv_t* ptokeys, sllmv_t* pfr } // ---------------------------------------------------------------- +// xxx rm? mlhmmv_xvalue_t mlhmmv_root_copy_xvalue(mlhmmv_root_t* pmap, sllmv_t* pmvkeys) { int error; if (pmvkeys == NULL || pmvkeys->length == 0) { mlhmmv_xvalue_t root_value = (mlhmmv_xvalue_t) { .is_terminal = FALSE, - .pnext_level = pmap->proot_level, + .terminal_mlrval = mv_absent(), + .pnext_level = pmap->root_xvalue.pnext_level, }; return mlhmmv_xvalue_copy(&root_value); } else { mlhmmv_level_entry_t* pfromentry = mlhmmv_level_look_up_and_ref_entry( - pmap->proot_level, pmvkeys->phead, &error); + pmap->root_xvalue.pnext_level, pmvkeys->phead, &error); if (pfromentry != NULL) { return mlhmmv_xvalue_copy(&pfromentry->level_xvalue); } else { @@ -1400,12 +1405,13 @@ sllv_t* mlhmmv_root_copy_keys_from_submap(mlhmmv_root_t* pmap, sllmv_t* pmvkeys) if (pmvkeys->length == 0) { mlhmmv_xvalue_t root_value = (mlhmmv_xvalue_t) { .is_terminal = FALSE, - .pnext_level = pmap->proot_level, + .terminal_mlrval = mv_absent(), + .pnext_level = pmap->root_xvalue.pnext_level, }; return mlhmmv_xvalue_copy_keys_nonindexed(&root_value); } else { mlhmmv_level_entry_t* pfromentry = mlhmmv_level_look_up_and_ref_entry( - pmap->proot_level, pmvkeys->phead, &error); + pmap->root_xvalue.pnext_level, pmvkeys->phead, &error); if (pfromentry != NULL) { return mlhmmv_xvalue_copy_keys_nonindexed(&pfromentry->level_xvalue); } else { @@ -1425,11 +1431,11 @@ void mlhmmv_root_remove(mlhmmv_root_t* pmap, sllmv_t* prestkeys) { if (prestkeys == NULL) { return; } else if (prestkeys->phead == NULL) { - mlhmmv_level_free(pmap->proot_level); - pmap->proot_level = mlhmmv_level_alloc(); + mlhmmv_level_free(pmap->root_xvalue.pnext_level); + pmap->root_xvalue.pnext_level = mlhmmv_level_alloc(); return; } else { - mlhmmv_level_remove(pmap->proot_level, prestkeys->phead); + mlhmmv_level_remove(pmap->root_xvalue.pnext_level, prestkeys->phead); } } @@ -1438,7 +1444,7 @@ void mlhmmv_root_remove(mlhmmv_root_t* pmap, sllmv_t* prestkeys) { void mlhmmv_root_all_to_lrecs(mlhmmv_root_t* pmap, sllmv_t* pnames, sllv_t* poutrecs, int do_full_prefixing, char* flatten_separator) { - for (mlhmmv_level_entry_t* pentry = pmap->proot_level->phead; pentry != NULL; pentry = pentry->pnext) { + for (mlhmmv_level_entry_t* pentry = pmap->root_xvalue.pnext_level->phead; pentry != NULL; pentry = pentry->pnext) { sllmv_t* pkey = sllmv_single_no_free(&pentry->level_key); mlhmmv_root_partial_to_lrecs(pmap, pkey, pnames, poutrecs, do_full_prefixing, flatten_separator); sllmv_free(pkey); @@ -1520,7 +1526,7 @@ void mlhmmv_root_partial_to_lrecs(mlhmmv_root_t* pmap, sllmv_t* pkeys, sllmv_t* // There should be at least the oosvar basename, e.g. '@a[b][c]' or '@a[b]' or '@a' but not '@'. MLR_INTERNAL_CODING_ERROR_IF(pkeys->phead == NULL); - mlhmmv_level_to_lrecs(pmap->proot_level, pkeys, pnames, poutrecs, do_full_prefixing, flatten_separator); + mlhmmv_level_to_lrecs(pmap->root_xvalue.pnext_level, pkeys, pnames, poutrecs, do_full_prefixing, flatten_separator); } // ---------------------------------------------------------------- @@ -1538,11 +1544,11 @@ void mlhmmv_root_partial_to_lrecs(mlhmmv_root_t* pmap, sllmv_t* pkeys, sllmv_t* // } void mlhmmv_root_print_json_stacked(mlhmmv_root_t* pmap, int quote_values_always, char* line_indent, FILE* ostream) { - mlhmmv_level_print_stacked(pmap->proot_level, 0, FALSE, quote_values_always, line_indent, ostream); + mlhmmv_level_print_stacked(pmap->root_xvalue.pnext_level, 0, FALSE, quote_values_always, line_indent, ostream); } // ---------------------------------------------------------------- void mlhmmv_root_print_json_single_lines(mlhmmv_root_t* pmap, int quote_values_always, FILE* ostream) { - mlhmmv_level_print_single_line(pmap->proot_level, 0, FALSE, quote_values_always, ostream); + mlhmmv_level_print_single_line(pmap->root_xvalue.pnext_level, 0, FALSE, quote_values_always, ostream); fprintf(ostream, "\n"); } diff --git a/c/containers/mlhmmv.h b/c/containers/mlhmmv.h index bbe176c34..bc1f46bf3 100644 --- a/c/containers/mlhmmv.h +++ b/c/containers/mlhmmv.h @@ -159,7 +159,7 @@ void mlhmmv_level_print_stacked( // ---------------------------------------------------------------- typedef struct _mlhmmv_root_t { - mlhmmv_level_t* proot_level; + mlhmmv_xvalue_t root_xvalue; } mlhmmv_root_t; mlhmmv_root_t* mlhmmv_root_alloc(); diff --git a/c/dsl/mlr_dsl_cst_map_assignment_statements.c b/c/dsl/mlr_dsl_cst_map_assignment_statements.c index 83fcbbf1a..402c618e1 100644 --- a/c/dsl/mlr_dsl_cst_map_assignment_statements.c +++ b/c/dsl/mlr_dsl_cst_map_assignment_statements.c @@ -443,10 +443,10 @@ static void handle_oosvar_assignment_from_xval( if (!boxed_xval.xval.is_terminal || mv_is_present(&boxed_xval.xval.terminal_mlrval)) { if (boxed_xval.is_ephemeral) { - mlhmmv_level_put_xvalue(pvars->poosvars->proot_level, plhskeys->phead, &boxed_xval.xval); + mlhmmv_level_put_xvalue(pvars->poosvars->root_xvalue.pnext_level, plhskeys->phead, &boxed_xval.xval); } else { mlhmmv_xvalue_t copy_xval = mlhmmv_xvalue_copy(&boxed_xval.xval); - mlhmmv_level_put_xvalue(pvars->poosvars->proot_level, plhskeys->phead, ©_xval); + mlhmmv_level_put_xvalue(pvars->poosvars->root_xvalue.pnext_level, plhskeys->phead, ©_xval); } } } @@ -517,13 +517,13 @@ static void handle_full_oosvar_assignment_from_xval( mlhmmv_xvalue_free(&boxed_xval.xval); } else { if (boxed_xval.is_ephemeral) { - mlhmmv_level_free(pvars->poosvars->proot_level); - pvars->poosvars->proot_level = boxed_xval.xval.pnext_level; + mlhmmv_level_free(pvars->poosvars->root_xvalue.pnext_level); + pvars->poosvars->root_xvalue.pnext_level = boxed_xval.xval.pnext_level; } else { mlhmmv_xvalue_t copy = mlhmmv_xvalue_copy(&boxed_xval.xval); mlhmmv_root_clear(pvars->poosvars); for (mlhmmv_level_entry_t* pe = copy.pnext_level->phead; pe != NULL; pe = pe->pnext) { - mlhmmv_level_put_xvalue_singly_keyed(pvars->poosvars->proot_level, &pe->level_key, &pe->level_xvalue); + mlhmmv_level_put_xvalue_singly_keyed(pvars->poosvars->root_xvalue.pnext_level, &pe->level_key, &pe->level_xvalue); } } } diff --git a/c/dsl/mlr_dsl_cst_output_statements.c b/c/dsl/mlr_dsl_cst_output_statements.c index 1bbcd0085..b98f1f43a 100644 --- a/c/dsl/mlr_dsl_cst_output_statements.c +++ b/c/dsl/mlr_dsl_cst_output_statements.c @@ -878,11 +878,14 @@ static void record_emitter_from_local_variable( // in a parent map whose single key is the variable name. mv_t name = mv_from_string(pstate->localvar_name, NO_FREE); + // xxx libify mlhmmv_level_t* proot_level = mlhmmv_level_alloc(); mlhmmv_level_put_xvalue_singly_keyed(proot_level, &name, pmval); mlhmmv_root_t map; - map.proot_level = proot_level; + map.root_xvalue.is_terminal = FALSE; + map.root_xvalue.terminal_mlrval = mv_absent(); + map.root_xvalue.pnext_level = proot_level; sllmv_prepend_no_free(pmvkeys, &name); mlhmmv_root_partial_to_lrecs(&map, pmvkeys, pmvnames, poutrecs, pstate->do_full_prefixing, oosvar_flatten_separator); @@ -927,7 +930,9 @@ static void record_emitter_from_map_literal( mlhmmv_level_put_xvalue_singly_keyed(proot_level, &name, &boxed_xval.xval); mlhmmv_root_t map; - map.proot_level = proot_level; + map.root_xvalue.is_terminal = FALSE; + map.root_xvalue.terminal_mlrval = mv_absent(); + map.root_xvalue.pnext_level = proot_level; sllmv_prepend_no_free(pmvkeys, &name); mlhmmv_root_partial_to_lrecs(&map, pmvkeys, pmvnames, poutrecs, pstate->do_full_prefixing, oosvar_flatten_separator); diff --git a/c/dsl/rxval_expr_evaluators.c b/c/dsl/rxval_expr_evaluators.c index 71dd02f10..7dd3eaa6b 100644 --- a/c/dsl/rxval_expr_evaluators.c +++ b/c/dsl/rxval_expr_evaluators.c @@ -381,7 +381,7 @@ static boxed_xval_t rxval_evaluator_from_oosvar_keylist_func(void* pvstate, vari if (all_non_null_or_error) { int lookup_error = FALSE; - mlhmmv_xvalue_t* pxval = mlhmmv_level_look_up_and_ref_xvalue(pvars->poosvars->proot_level, + mlhmmv_xvalue_t* pxval = mlhmmv_level_look_up_and_ref_xvalue(pvars->poosvars->root_xvalue.pnext_level, pmvkeys, &lookup_error); sllmv_free(pmvkeys); if (pxval != NULL) { @@ -437,7 +437,7 @@ static boxed_xval_t rxval_evaluator_from_full_oosvar_func(void* pvstate, variabl .is_ephemeral = FALSE, .xval = (mlhmmv_xvalue_t) { .is_terminal = FALSE, - .pnext_level = pvars->poosvars->proot_level, + .pnext_level = pvars->poosvars->root_xvalue.pnext_level, }, }; }