diff options
-rw-r--r-- | src/sort.c | 28 | ||||
-rwxr-xr-x | tests/misc/sort-debug-keys | 5 |
2 files changed, 14 insertions, 19 deletions
diff --git a/src/sort.c b/src/sort.c index e02e547d2..1df711da7 100644 --- a/src/sort.c +++ b/src/sort.c @@ -2102,23 +2102,17 @@ compare_version (char *restrict texta, size_t lena, return diff; } -/* For debug mode, count tabs in the passed string - so we can adjust the widths returned by mbswidth. +/* Return the printable width of the block of memory starting at + TEXT and ending just before LIM, counting each tab as one byte. FIXME: Should we generally be counting non printable chars? */ static size_t -count_tabs (char const *text, size_t len) +debug_width (char const *text, char const *lim) { - size_t tabs = 0; - size_t tlen = strnlen (text, len); - - while (tlen--) - { - if (*text++ == '\t') - tabs++; - } - - return tabs; + size_t width = mbsnwidth (text, lim - text, 0); + while (text < lim) + width += (*text++ == '\t'); + return width; } /* For debug mode, "underline" a key at the @@ -2161,12 +2155,8 @@ debug_key (char const *sline, char const *sfield, char const *efield, } } - size_t offset = mbsnwidth (sline, sfield - sline, 0) + (sa - sfield); - offset += count_tabs (sline, sfield - sline); - - size_t width = mbsnwidth (sa, flen, 0); - width += count_tabs (sa, flen); - + size_t offset = debug_width (sline, sfield) + (sa - sfield); + size_t width = debug_width (sa, sa + flen); mark_key (offset, width); } diff --git a/tests/misc/sort-debug-keys b/tests/misc/sort-debug-keys index 36b67d27d..54bac5793 100755 --- a/tests/misc/sort-debug-keys +++ b/tests/misc/sort-debug-keys @@ -236,6 +236,8 @@ ___ _ 2b _ +>a + _ EOF ( @@ -274,6 +276,9 @@ printf "2,,3\n2.4\n" | sort -s -k1n --debug # -z means we convert \0 to \n printf "1a\x002b\x00" | sort -s -n -z --debug + +# Check that \0 and \t intermix. +printf "\0\ta\n" | sort -s -k2b,2 --debug | tr -d '\0' ) > out compare out exp || fail=1 |