diff --git a/c/input/lrec_reader_mmap_dkvp.c b/c/input/lrec_reader_mmap_dkvp.c index 639cc5024..448e21469 100644 --- a/c/input/lrec_reader_mmap_dkvp.c +++ b/c/input/lrec_reader_mmap_dkvp.c @@ -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); } } diff --git a/c/todo.txt b/c/todo.txt index cd3482390..44b249305 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -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