indexed-emit iterate

This commit is contained in:
John Kerl 2016-03-07 12:13:59 -05:00
parent 86da3202a3
commit 6606e4eefb
3 changed files with 66 additions and 110 deletions

View file

@ -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);
}
}
}

View file

@ -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

View file

@ -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