mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-19 17:35:16 +00:00
mmap-page-boundary iterate
This commit is contained in:
parent
47abfabdc4
commit
db4eb7d443
2 changed files with 30 additions and 33 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue