summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Miller <cbm@whatexit.org>2009-06-11 18:30:32 +0100
committerPádraig Brady <P@draigBrady.com>2009-06-13 01:25:06 +0100
commit24c727d3c26122c4f1c29381e7c6f5d96985ccca (patch)
tree24443f3009e77d0ae83758b8f17147c0955d80ac
parentba1c5239bc4b9719a20cedd35a313fa4237e7151 (diff)
downloadcoreutils-24c727d3c26122c4f1c29381e7c6f5d96985ccca.tar.xz
sort: Ignore fields where end position is before the start position
* NEWS: Mention the fix * THANKS: Add Cliff Miller * src/sort.c (keycompare): Ensure lima >= texta * tests/misc/sort: Add 3 corresponding tests Signed-off-by: Pádraig Brady <P@draigBrady.com>
-rw-r--r--NEWS5
-rw-r--r--THANKS1
-rw-r--r--src/sort.c8
-rwxr-xr-xtests/misc/sort4
4 files changed, 16 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 0455d592d..d7695e4a2 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,11 @@ GNU coreutils NEWS -*- outline -*-
truncate -s failed to skip all whitespace in the option argument in
some locales.
+ sort now correctly ignores fields whose ending position is specified
+ before the start position. Previously in numeric mode the remaining
+ part of the line after the start position was used as the sort key.
+ [This bug appears to have been present in "the beginning".]
+
** Changes in behavior
ls --color: files with multiple hard links are no longer colored differently
diff --git a/THANKS b/THANKS
index 4392f04fd..bcd88f087 100644
--- a/THANKS
+++ b/THANKS
@@ -112,6 +112,7 @@ Christophe LYON christophe.lyon@st.com
Chuck Hedrick hedrick@klinzhai.rutgers.edu
Clark Morgan cmorgan@aracnet.com
Clement Wang clem.wang@overture.com
+Cliff Miller cbm@whatexit.org
Colin Plumb colin@nyx.net
Colin Watson cjw44@riva.ucam.org
Collin Rogowski collin@rogowski.de
diff --git a/src/sort.c b/src/sort.c
index d571ddf02..6acec070d 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -1998,9 +1998,13 @@ keycompare (const struct line *a, const struct line *b)
char const *translate = key->translate;
bool const *ignore = key->ignore;
+ /* Treat field ends before field starts as empty fields. */
+ lima = MAX (texta, lima);
+ limb = MAX (textb, limb);
+
/* Find the lengths. */
- size_t lena = lima <= texta ? 0 : lima - texta;
- size_t lenb = limb <= textb ? 0 : limb - textb;
+ size_t lena = lima - texta;
+ size_t lenb = limb - textb;
/* Actually compare the fields. */
diff --git a/tests/misc/sort b/tests/misc/sort
index ae3bd8e49..21e7af8e9 100755
--- a/tests/misc/sort
+++ b/tests/misc/sort
@@ -134,6 +134,10 @@ my @Tests =
["07d", '+1 -3', {IN=>"y k b\nz k a\n"}, {OUT=>"z k a\ny k b\n"}],
# ensure a character position of 0 includes whole field
["07e", '-k 2,3.0', {IN=>"a a b\nz a a\n"}, {OUT=>"z a a\na a b\n"}],
+# ensure fields with end position before start are ignored
+["07f", '-n -k1.3,1.1', {IN=>"a 2\nb 1\n"}, {OUT=>"a 2\nb 1\n"}],
+["07g", '-n -k2.2,1.2', {IN=>"aa 2\nbb 1\n"}, {OUT=>"aa 2\nbb 1\n"}],
+["07h", '-k1.3nb,1.3', {IN=>" a 2\n b 1\n"}, {OUT=>" a 2\n b 1\n"}],
#
# report an error for `.' without following char spec
["08a", '-k 2.,3', {EXIT=>2},