Blob Blame History Raw
diff -urNp coreutils-6.10-orig/src/sort.c coreutils-6.10/src/sort.c
--- coreutils-6.10-orig/src/sort.c	2008-01-22 00:33:25.000000000 +0100
+++ coreutils-6.10/src/sort.c	2009-02-27 11:19:35.000000000 +0100
@@ -1390,7 +1390,6 @@ begfield_uni (const struct line *line, c
   char *ptr = line->text, *lim = ptr + line->length - 1;
   size_t sword = key->sword;
   size_t schar = key->schar;
-  size_t remaining_bytes;
 
   /* The leading field separator itself is included in a field when -t
      is absent.  */
@@ -1416,12 +1415,7 @@ begfield_uni (const struct line *line, c
     while (ptr < lim && blanks[to_uchar (*ptr)])
       ++ptr;
 
-  /* Advance PTR by SCHAR (if possible), but no further than LIM.  */
-  remaining_bytes = lim - ptr;
-  if (schar < remaining_bytes)
-    ptr += schar;
-  else
-    ptr = lim;
+  ptr = MIN (lim, ptr + schar);
 
   return ptr;
 }
@@ -1493,7 +1487,9 @@ limfield_uni (const struct line *line, c
 {
   char *ptr = line->text, *lim = ptr + line->length - 1;
   size_t eword = key->eword, echar = key->echar;
-  size_t remaining_bytes;
+
+  if (echar == 0)
+    eword++; /* Skip all of end field.  */
 
   /* Move PTR past EWORD fields or to one past the last byte on LINE,
      whichever comes first.  If there are more than EWORD fields, leave
@@ -1566,19 +1566,13 @@ limfield_uni (const struct line *line, c
     }
 #endif
 
-  /* If we're ignoring leading blanks when computing the End
-     of the field, don't start counting bytes until after skipping
-     past any leading blanks. */
-  if (key->skipeblanks)
-    while (ptr < lim && blanks[to_uchar (*ptr)])
-      ++ptr;
-
-  /* Advance PTR by ECHAR (if possible), but no further than LIM.  */
-  remaining_bytes = lim - ptr;
-  if (echar < remaining_bytes)
-    ptr += echar;
-  else
-    ptr = lim;
+  if (echar != 0) /* We need to skip over a portion of the end field.  */
+    {
+      if (key->skipeblanks) /* blanks not counted in echar.  */
+       while (ptr < lim && blanks[to_uchar (*ptr)])
+         ++ptr;
+      ptr = MIN (lim, ptr + echar);
+    }
 
   return ptr;
 }
@@ -3582,12 +3579,9 @@ main (int argc, char **argv)
 		  badfieldspec (optarg, N_("field number is zero"));
 		}
 	      if (*s == '.')
-		s = parse_field_count (s + 1, &key->echar,
-				       N_("invalid number after `.'"));
-	      else
 		{
-		  /* `-k 2,3' is equivalent to `+1 -3'.  */
-		  key->eword++;
+		    s = parse_field_count (s + 1, &key->echar,
+                                        N_("invalid number after `.'"));
 		}
 	      s = set_ordering (s, key, bl_end);
 	    }
diff -urNp coreutils-6.10-orig/tests/sort/sort-tests coreutils-6.10/tests/sort/sort-tests
--- coreutils-6.10-orig/tests/sort/sort-tests	2008-01-22 00:33:25.000000000 +0100
+++ coreutils-6.10/tests/sort/sort-tests	2009-02-27 11:19:35.000000000 +0100
@@ -1008,6 +1008,24 @@ else
   esac
 fi
 test -s 07d.E || rm -f 07d.E
+_POSIX2_VERSION=199209 $xx -k 2,3.0 $srcdir/07e.I > 07e.O 2> 07e.E
+code=$?
+if test $code != 0; then
+  $echo "Test 07e(_POSIX2_VERSION=199209) failed: $xx return code $code differs from expected value 0" 1>&2
+  errors=`expr $errors + 1`
+else
+  cmp 07e.O $srcdir/07e.X > /dev/null 2>&1
+  case $? in
+    0) if test "$VERBOSE"; then $echo "passed 07d(_POSIX2_VERSION=199209)"; fi;;
+    1) $echo "Test 07e(_POSIX2_VERSION=199209) failed: files 07e.O and $srcdir/07e.X differ" 1>&2
+       (diff -c 07e.O $srcdir/07e.X) 2> /dev/null
+       errors=`expr $errors + 1`;;
+    2) $echo "Test 07e(_POSIX2_VERSION=199209) may have failed." 1>&2
+       $echo The command "cmp 07e.O $srcdir/07e.X" failed. 1>&2
+       errors=`expr $errors + 1`;;
+  esac
+fi
+test -s 07e.E || rm -f 07e.E
 _POSIX2_VERSION=199209 $xx -k 2.,3 $srcdir/08a.I > 08a.O 2> 08a.E
 code=$?
 if test $code != 2; then
@@ -1728,6 +1746,24 @@ else
   esac
 fi
 test -s 18e.E || rm -f 18e.E
+_POSIX2_VERSION=199209 $xx -k1,1b $srcdir/18f.I > 18f.O 2> 18f.E
+code=$?
+if test $code != 0; then
+  $echo "Test 18f(_POSIX2_VERSION=199209) failed: $xx return code $code differs from expected value 0" 1>&2
+  errors=`expr $errors + 1`
+else
+  cmp 18f.O $srcdir/18f.X > /dev/null 2>&1
+  case $? in
+    0) if test "$VERBOSE"; then $echo "passed 18f(_POSIX2_VERSION=199209)"; fi;;
+    1) $echo "Test 18f(_POSIX2_VERSION=199209) failed: files 18f.O and $srcdir/18f.X differ" 1>&2
+       (diff -c 18f.O $srcdir/18f.X) 2> /dev/null
+       errors=`expr $errors + 1`;;
+    2) $echo "Test 18f(_POSIX2_VERSION=199209) may have failed." 1>&2
+       $echo The command "cmp 18f.O $srcdir/18f.X" failed. 1>&2
+       errors=`expr $errors + 1`;;
+  esac
+fi
+test -s 18f.E || rm -f 18f.E
 _POSIX2_VERSION=199209 $xx +0 +1nr $srcdir/19a.I > 19a.O 2> 19a.E
 code=$?
 if test $code != 0; then
diff -urNp coreutils-6.10-orig/tests/sort/07e.I coreutils-6.10/tests/sort/07e.I
--- coreutils-6.10-orig/tests/sort/07e.I	1970-01-01 01:00:00.000000000 +0100
+++ coreutils-6.10/tests/sort/07e.I	2009-02-27 11:21:24.000000000 +0100
@@ -0,0 +1,2 @@
+a a b
+z a a
diff -urNp coreutils-6.10-orig/tests/sort/07e.X coreutils-6.10/tests/sort/07e.X
--- coreutils-6.10-orig/tests/sort/07e.X	1970-01-01 01:00:00.000000000 +0100
+++ coreutils-6.10/tests/sort/07e.X	2009-02-27 11:21:10.000000000 +0100
@@ -0,0 +1,2 @@
+z a a
+a a b
diff -urNp coreutils-6.10-orig/tests/sort/18f.I coreutils-6.10/tests/sort/18f.I
--- coreutils-6.10-orig/tests/sort/18f.I	1970-01-01 01:00:00.000000000 +0100
+++ coreutils-6.10/tests/sort/18f.I	2009-02-27 11:14:41.000000000 +0100
@@ -0,0 +1,2 @@
+a  y
+a z
diff -urNp coreutils-6.10-orig/tests/sort/18f.X coreutils-6.10/tests/sort/18f.X
--- coreutils-6.10-orig/tests/sort/18f.X	1970-01-01 01:00:00.000000000 +0100
+++ coreutils-6.10/tests/sort/18f.X	2009-02-27 11:15:07.000000000 +0100
@@ -0,0 +1,2 @@
+a  y
+a z