diff --git a/c/containers/mlhmmv.c b/c/containers/mlhmmv.c index a83a1958d..400ed9690 100644 --- a/c/containers/mlhmmv.c +++ b/c/containers/mlhmmv.c @@ -35,8 +35,10 @@ static mlhmmv_level_t* mlhmmv_get_or_create_level_aux_no_enlarge(mlhmmv_level_t* static mlhmmv_level_entry_t* mlhmmv_get_next_level_entry(mlhmmv_level_t* pmap, mv_t* plevel_key, int* pindex); -static void mlhmmv_to_lrecs_aux(mlhmmv_level_t* plevel, char* prefix, sllmve_t* prestnames, +static void mlhmmv_to_lrecs_aux_vert(mlhmmv_level_t* plevel, char* prefix, sllmve_t* prestnames, lrec_t* ptemplate, sllv_t* poutrecs); +static void mlhmmv_to_lrecs_aux_horiz(mlhmmv_level_t* plevel, char* prefix, + lrec_t* poutrec); static void mlhmmv_level_print_stacked(mlhmmv_level_t* plevel, int depth, int do_final_comma, int quote_values_always); @@ -646,14 +648,15 @@ void mlhmmv_to_lrecs(mlhmmv_t* pmap, sllmv_t* pkeys, sllmv_t* pnames, sllv_t* po } else { lrec_t* ptemplate = lrec_unbacked_alloc(); char* oosvar_name = mv_alloc_format_val(pfirstkey); - mlhmmv_to_lrecs_aux(ptop_entry->level_value.u.pnext_level, oosvar_name, pnames->phead, + ////printf("OON=[%s]\n", oosvar_name); + mlhmmv_to_lrecs_aux_vert(ptop_entry->level_value.u.pnext_level, oosvar_name, pnames->phead, ptemplate, poutrecs); free(oosvar_name); lrec_free(ptemplate); } } -static void mlhmmv_to_lrecs_aux( +static void mlhmmv_to_lrecs_aux_vert( mlhmmv_level_t* plevel, char* prefix, sllmve_t* prestnames, @@ -661,6 +664,7 @@ static void mlhmmv_to_lrecs_aux( sllv_t* poutrecs) { if (prestnames != NULL) { + ////printf("AUX REC\n"); for (mlhmmv_level_entry_t* pe = plevel->phead; pe != NULL; pe = pe->pnext) { mlhmmv_level_value_t* plevel_value = &pe->level_value; lrec_t* pnextrec = lrec_copy(ptemplate); @@ -671,29 +675,51 @@ static void mlhmmv_to_lrecs_aux( mv_alloc_format_val(&plevel_value->u.mlrval), FREE_ENTRY_KEY|FREE_ENTRY_VALUE); sllv_append(poutrecs, pnextrec); } else { - mlhmmv_to_lrecs_aux(pe->level_value.u.pnext_level, + mlhmmv_to_lrecs_aux_vert(pe->level_value.u.pnext_level, prefix, prestnames->pnext, pnextrec, poutrecs); lrec_free(pnextrec); } } } else { - // xxx split out vert & horiz auxes + ////printf("AUX 2 HRZ\n"); + lrec_t* pnextrec = lrec_copy(ptemplate); for (mlhmmv_level_entry_t* pe = plevel->phead; pe != NULL; pe = pe->pnext) { mlhmmv_level_value_t* plevel_value = &pe->level_value; - lrec_t* pnextrec = lrec_copy(ptemplate); - // xxx rename - char* foo = mv_alloc_format_val(&pe->level_key); - char* name = mlr_paste_3_strings(prefix, TEMP_FLATTEN_SEP, foo); - free(foo); if (plevel_value->is_terminal) { - lrec_put(pnextrec, name, + char* foo = mv_alloc_format_val(&pe->level_key); + char* name = mlr_paste_3_strings(prefix, TEMP_FLATTEN_SEP, foo); + free(foo); + lrec_put(pnextrec, mlr_strdup_or_die(name), mv_alloc_format_val(&plevel_value->u.mlrval), FREE_ENTRY_KEY|FREE_ENTRY_VALUE); - sllv_append(poutrecs, pnextrec); } else { - mlhmmv_to_lrecs_aux(plevel_value->u.pnext_level, name, NULL, pnextrec, poutrecs); - lrec_free(pnextrec); + char* foo = mv_alloc_format_val(&pe->level_key); + char* name = mlr_paste_3_strings(prefix, TEMP_FLATTEN_SEP, foo); + free(foo); + mlhmmv_to_lrecs_aux_horiz(plevel_value->u.pnext_level, name, pnextrec); } } + sllv_append(poutrecs, pnextrec); + } +} + +static void mlhmmv_to_lrecs_aux_horiz( + mlhmmv_level_t* plevel, + char* prefix, + lrec_t* poutrec) +{ + for (mlhmmv_level_entry_t* pe = plevel->phead; pe != NULL; pe = pe->pnext) { + mlhmmv_level_value_t* plevel_value = &pe->level_value; + // xxx rename + char* foo = mv_alloc_format_val(&pe->level_key); + char* name = mlr_paste_3_strings(prefix, TEMP_FLATTEN_SEP, foo); + free(foo); + if (plevel_value->is_terminal) { + ////printf("PFX=[%s] NAME=[%s] LK=[%s]\n", prefix, name, mv_alloc_format_val(&pe->level_key)); + lrec_put(poutrec, name, + mv_alloc_format_val(&plevel_value->u.mlrval), FREE_ENTRY_KEY|FREE_ENTRY_VALUE); + } else { + mlhmmv_to_lrecs_aux_horiz(plevel_value->u.pnext_level, name, poutrec); + } } } diff --git a/c/reg_test/expected/out b/c/reg_test/expected/out index 3a7e8751c..f0c1bce09 100644 --- a/c/reg_test/expected/out +++ b/c/reg_test/expected/out @@ -13089,11 +13089,7 @@ AST END STATEMENTS (1): PARAMETERIZED EMIT mlr put -q @sum[$a] = $x; end{ emit @sum; } ./reg_test/input/abixy -sum:pan=0.502626 -sum:eks=0.611784 -sum:wye=0.573289 -sum:zee=0.598554 -sum:hat=0.031442 +sum:pan=0.502626,sum:eks=0.611784,sum:wye=0.573289,sum:zee=0.598554,sum:hat=0.031442 mlr put -q @sum[$a] = $x; end{ emit @sum,"a"; } ./reg_test/input/abixy a=pan,sum=0.502626 @@ -13110,27 +13106,13 @@ a=zee,sum=0.598554 a=hat,sum=0.031442 mlr put -q @sum[$a][$b] = $x; end{ emit @sum; } ./reg_test/input/abixy -sum:pan:pan=0.346790 -sum:pan:wye=0.502626 -sum:eks:pan=0.758680 -sum:eks:wye=0.381399 -sum:eks:zee=0.611784 -sum:wye:wye=0.204603 -sum:wye:pan=0.573289 -sum:zee:pan=0.527126 -sum:zee:wye=0.598554 -sum:hat:wye=0.031442 +sum:pan:pan=0.346790,sum:pan:wye=0.502626,sum:eks:pan=0.758680,sum:eks:wye=0.381399,sum:eks:zee=0.611784,sum:wye:wye=0.204603,sum:wye:pan=0.573289,sum:zee:pan=0.527126,sum:zee:wye=0.598554,sum:hat:wye=0.031442 mlr put -q @sum[$a][$b] = $x; end{ emit @sum,"a"; } ./reg_test/input/abixy -a=pan,sum:pan=0.346790 -a=pan,sum:wye=0.502626 -a=eks,sum:pan=0.758680 -a=eks,sum:wye=0.381399 -a=eks,sum:zee=0.611784 -a=wye,sum:wye=0.204603 -a=wye,sum:pan=0.573289 -a=zee,sum:pan=0.527126 -a=zee,sum:wye=0.598554 +a=pan,sum:pan=0.346790,sum:wye=0.502626 +a=eks,sum:pan=0.758680,sum:wye=0.381399,sum:zee=0.611784 +a=wye,sum:wye=0.204603,sum:pan=0.573289 +a=zee,sum:pan=0.527126,sum:wye=0.598554 a=hat,sum:wye=0.031442 mlr put -q @sum[$a][$b] = $x; end{ emit @sum,"a","b"; } ./reg_test/input/abixy @@ -13197,25 +13179,13 @@ mlr put -q @sum += $nonesuch; end {emit @sum, "extra" } ./reg_test/input/abixy sum= mlr put -q @sum[$a] += $i; end {emit @sum } ./reg_test/input/abixy -sum:pan=11 -sum:eks=13 -sum:wye=8 -sum:zee=14 -sum:hat=9 +sum:pan=11,sum:eks=13,sum:wye=8,sum:zee=14,sum:hat=9 mlr put -q @sum[$a] += $x; end {emit @sum } ./reg_test/input/abixy -sum:pan=0.849416 -sum:eks=1.751863 -sum:wye=0.777892 -sum:zee=1.125680 -sum:hat=0.031442 +sum:pan=0.849416,sum:eks=1.751863,sum:wye=0.777892,sum:zee=1.125680,sum:hat=0.031442 mlr put -q @sum[$a] += $nonesuch; end {emit @sum } ./reg_test/input/abixy -sum:pan= -sum:eks= -sum:wye= -sum:zee= -sum:hat= +sum:pan=,sum:eks=,sum:wye=,sum:zee=,sum:hat= mlr put -q @sum[$a] += $i; end {emit @sum, "a" } ./reg_test/input/abixy a=pan,sum=11 @@ -13260,75 +13230,33 @@ a=zee,sum= a=hat,sum= mlr put -q @sum[$a][$b] += $i; end {emit @sum } ./reg_test/input/abixy -sum:pan:pan=1 -sum:pan:wye=10 -sum:eks:pan=2 -sum:eks:wye=4 -sum:eks:zee=7 -sum:wye:wye=3 -sum:wye:pan=5 -sum:zee:pan=6 -sum:zee:wye=8 -sum:hat:wye=9 +sum:pan:pan=1,sum:pan:wye=10,sum:eks:pan=2,sum:eks:wye=4,sum:eks:zee=7,sum:wye:wye=3,sum:wye:pan=5,sum:zee:pan=6,sum:zee:wye=8,sum:hat:wye=9 mlr put -q @sum[$a][$b] += $x; end {emit @sum } ./reg_test/input/abixy -sum:pan:pan=0.346790 -sum:pan:wye=0.502626 -sum:eks:pan=0.758680 -sum:eks:wye=0.381399 -sum:eks:zee=0.611784 -sum:wye:wye=0.204603 -sum:wye:pan=0.573289 -sum:zee:pan=0.527126 -sum:zee:wye=0.598554 -sum:hat:wye=0.031442 +sum:pan:pan=0.346790,sum:pan:wye=0.502626,sum:eks:pan=0.758680,sum:eks:wye=0.381399,sum:eks:zee=0.611784,sum:wye:wye=0.204603,sum:wye:pan=0.573289,sum:zee:pan=0.527126,sum:zee:wye=0.598554,sum:hat:wye=0.031442 mlr put -q @sum[$a][$b] += $nonesuch; end {emit @sum } ./reg_test/input/abixy -sum:pan:pan= -sum:pan:wye= -sum:eks:pan= -sum:eks:wye= -sum:eks:zee= -sum:wye:wye= -sum:wye:pan= -sum:zee:pan= -sum:zee:wye= -sum:hat:wye= +sum:pan:pan=,sum:pan:wye=,sum:eks:pan=,sum:eks:wye=,sum:eks:zee=,sum:wye:wye=,sum:wye:pan=,sum:zee:pan=,sum:zee:wye=,sum:hat:wye= mlr put -q @sum[$a][$b] += $i; end {emit @sum, "a" } ./reg_test/input/abixy -a=pan,sum:pan=1 -a=pan,sum:wye=10 -a=eks,sum:pan=2 -a=eks,sum:wye=4 -a=eks,sum:zee=7 -a=wye,sum:wye=3 -a=wye,sum:pan=5 -a=zee,sum:pan=6 -a=zee,sum:wye=8 +a=pan,sum:pan=1,sum:wye=10 +a=eks,sum:pan=2,sum:wye=4,sum:zee=7 +a=wye,sum:wye=3,sum:pan=5 +a=zee,sum:pan=6,sum:wye=8 a=hat,sum:wye=9 mlr put -q @sum[$a][$b] += $x; end {emit @sum, "a" } ./reg_test/input/abixy -a=pan,sum:pan=0.346790 -a=pan,sum:wye=0.502626 -a=eks,sum:pan=0.758680 -a=eks,sum:wye=0.381399 -a=eks,sum:zee=0.611784 -a=wye,sum:wye=0.204603 -a=wye,sum:pan=0.573289 -a=zee,sum:pan=0.527126 -a=zee,sum:wye=0.598554 +a=pan,sum:pan=0.346790,sum:wye=0.502626 +a=eks,sum:pan=0.758680,sum:wye=0.381399,sum:zee=0.611784 +a=wye,sum:wye=0.204603,sum:pan=0.573289 +a=zee,sum:pan=0.527126,sum:wye=0.598554 a=hat,sum:wye=0.031442 mlr put -q @sum[$a][$b] += $nonesuch; end {emit @sum, "a" } ./reg_test/input/abixy -a=pan,sum:pan= -a=pan,sum:wye= -a=eks,sum:pan= -a=eks,sum:wye= -a=eks,sum:zee= -a=wye,sum:wye= -a=wye,sum:pan= -a=zee,sum:pan= -a=zee,sum:wye= +a=pan,sum:pan=,sum:wye= +a=eks,sum:pan=,sum:wye=,sum:zee= +a=wye,sum:wye=,sum:pan= +a=zee,sum:pan=,sum:wye= a=hat,sum:wye= mlr put -q @sum[$a][$b] += $i; end {emit @sum, "a", "b" } ./reg_test/input/abixy diff --git a/c/todo.txt b/c/todo.txt index 0173aa0ff..edc193fd8 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -13,6 +13,8 @@ TOP-OF-LIST SUMMARY ! subselector emits ! horizontality of emits +* \" in string-literal reader ... fix up in the parser or in rval_expr. + * neaten/xxxes/valgrind/UT/doc for unset/tri-split-null/+=etal/parameterized emit * double-check oosvar+emit+tri-split-null by re-implementing as many mappers as possible using ossvars + emit * readme re srec vs lrec