mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-28 02:05:36 +00:00
oosvar root_xvalue
This commit is contained in:
parent
92a25c5d21
commit
694d149ece
5 changed files with 40 additions and 29 deletions
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue