mmap-page-boundary iterate

This commit is contained in:
John Kerl 2016-01-19 22:02:26 -05:00
parent 47abfabdc4
commit db4eb7d443
2 changed files with 30 additions and 33 deletions

View file

@ -165,46 +165,42 @@ lrec_t* lrec_parse_mmap_dkvp_single_irs_single_others(file_reader_mmap_state_t *
phandle->sol = p+1;
idx++;
if (allow_repeat_ifs && *key == 0 && *value == 0)
return prec;
// There are two ways out of that loop: saw IRS, or saw end of file.
if (saw_rs) {
// Easy and simple case: we read until end of line.
if (allow_repeat_ifs && *key == 0 && *value == 0) {
; // OK
} else {
if (*key == 0 || value <= key) {
char free_flags = 0;
if (value >= phandle->eof)
lrec_put(prec, make_nidx_key(idx, &free_flags), "", free_flags);
else
lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags);
}
else {
if (value >= phandle->eof)
lrec_put(prec, key, "", NO_FREE);
else
lrec_put(prec, key, value, NO_FREE);
}
if (*key == 0 || value <= key) {
char free_flags = 0;
if (value >= phandle->eof)
lrec_put(prec, make_nidx_key(idx, &free_flags), "", free_flags);
else
lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags);
}
else {
if (value >= phandle->eof)
lrec_put(prec, key, "", NO_FREE);
else
lrec_put(prec, key, value, NO_FREE);
}
} else {
// Messier case: we read to end of file without seeing end of line.
if (allow_repeat_ifs && *key == 0 && *value == 0) {
; // OK
} else {
if (*key == 0 || value <= key) {
char free_flags = 0;
if (value >= phandle->eof)
lrec_put(prec, make_nidx_key(idx, &free_flags), "", free_flags);
else
lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags);
}
else {
if (value >= phandle->eof)
lrec_put(prec, key, "", NO_FREE);
else
lrec_put(prec, key, value, NO_FREE);
}
if (*key == 0 || value <= key) {
char free_flags = 0;
if (value >= phandle->eof)
lrec_put(prec, make_nidx_key(idx, &free_flags), "", free_flags);
else
lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags);
}
else {
if (value >= phandle->eof)
lrec_put(prec, key, "", NO_FREE);
else
lrec_put(prec, key, value, NO_FREE);
}
}

View file

@ -5,7 +5,8 @@ BUGFIXES
- not as much a corner case as it may sound: it happens in "some-writer > file &" and "mlr ... file" where (multiples
of) stdio buffer sizes align with mmap page sizes.
- need to copy out final key or key+value at missing final IRS
- blksz UTs x 6
- blksz UTs
for x in reg_test/input/page-aligned-*; do echo; echo $x; mlr tail $x; done
- impl x 4 for mmap dkvp
- check other formats