summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2007-05-22 13:56:34 +0200
committerJim Meyering <jim@meyering.net>2007-05-22 13:56:34 +0200
commitae5717158f1b9f31b986b0f4416582684039ec55 (patch)
tree7f78f3c1ba976c139d7ee42d08eff33c6dc0b70f
parent607614ae962f0e76ccaf2df132eff3e4864f75cc (diff)
downloadcoreutils-ae5717158f1b9f31b986b0f4416582684039ec55.tar.xz
"cut -f 2-0" now fails; before, it was equivalent to "cut -f 2-"
Also, diagnose the '-' in "cut -f -" as an invalid range, rather than interpreting it as the unlimited range, "1-". * NEWS: Mention these changes. * src/cut.c (set_fields): Don't interpret an accumulator "value" of 0 as an unspecified range endpoint. Give better diagnostics. Adjust a comment so that it is true also for 64-bit size_t. * tests/cut/Test.pm: Add tests for the above.
-rw-r--r--ChangeLog10
-rw-r--r--NEWS5
-rw-r--r--src/cut.c31
-rwxr-xr-xtests/cut/Test.pm9
4 files changed, 42 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index b7a504b4d..c1fe87205 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2007-05-22 Jim Meyering <jim@meyering.net>
+ "cut -f 2-0" now fails; before, it was equivalent to "cut -f 2-"
+ Also, diagnose the '-' in "cut -f -" as an invalid range, rather
+ than interpreting it as the unlimited range, "1-".
+ * NEWS: Mention these changes.
+ * src/cut.c (set_fields): Don't interpret an accumulator "value"
+ of 0 as an unspecified range endpoint.
+ Give better diagnostics.
+ Adjust a comment so that it is true also for 64-bit size_t.
+ * tests/cut/Test.pm: Add tests for the above.
+
stty: fix a harmless syntax nit
* src/stty.c (visible): Use ";" as the statement terminator
between two assignments, not ",".
diff --git a/NEWS b/NEWS
index 0000a2bf7..03266813d 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,11 @@ GNU coreutils NEWS -*- outline -*-
** Bug fixes
+ "cut -f 2-0" now fails; before, it was equivalent to "cut -f 2-"
+
+ cut now diagnoses the '-' in "cut -f -" as an invalid range, rather
+ than interpreting it as the unlimited range, "1-".
+
ls -x DIR would sometimes output the wrong string in place of the
first entry. [introduced in coreutils-6.8]
diff --git a/src/cut.c b/src/cut.c
index 0883e72d9..ab14abcb2 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -342,6 +342,8 @@ set_fields (const char *fieldstr)
{
size_t initial = 1; /* Value of first number in a range. */
size_t value = 0; /* If nonzero, a number being accumulated. */
+ bool lhs_specified = false;
+ bool rhs_specified = false;
bool dash_found = false; /* True if a '-' is found in this field. */
bool field_found = false; /* True if at least one field spec
has been processed. */
@@ -366,13 +368,8 @@ set_fields (const char *fieldstr)
dash_found = true;
fieldstr++;
- if (value)
- {
- initial = value;
- value = 0;
- }
- else
- initial = 1;
+ initial = (lhs_specified ? value : 1);
+ value = 0;
}
else if (*fieldstr == ',' || isblank (*fieldstr) || *fieldstr == '\0')
{
@@ -382,9 +379,12 @@ set_fields (const char *fieldstr)
{
dash_found = false;
- /* A range. Possibilites: -n, m-n, n-.
+ if (!lhs_specified && !rhs_specified)
+ FATAL_ERROR (_("invalid range with no endpoint: -"));
+
+ /* A range. Possibilities: -n, m-n, n-.
In any case, `initial' contains the start of the range. */
- if (value == 0)
+ if (!rhs_specified)
{
/* `n-'. From `initial' to end of line. */
eol_range_start = initial;
@@ -394,7 +394,7 @@ set_fields (const char *fieldstr)
{
/* `m-n' or `-n' (1-n). */
if (value < initial)
- FATAL_ERROR (_("invalid byte or field list"));
+ FATAL_ERROR (_("invalid decreasing range"));
/* Is there already a range going to end of line? */
if (eol_range_start != 0)
@@ -432,7 +432,7 @@ set_fields (const char *fieldstr)
value = 0;
}
}
- else if (value != 0)
+ else
{
/* A simple field number, not a range. */
ADD_RANGE_PAIR (rp, value, value);
@@ -446,6 +446,8 @@ set_fields (const char *fieldstr)
}
fieldstr++;
+ lhs_specified = false;
+ rhs_specified = false;
}
else if (ISDIGIT (*fieldstr))
{
@@ -456,10 +458,15 @@ set_fields (const char *fieldstr)
num_start = fieldstr;
in_digits = true;
+ if (dash_found)
+ rhs_specified = 1;
+ else
+ lhs_specified = 1;
+
/* Detect overflow. */
if (!DECIMAL_DIGIT_ACCUMULATE (value, *fieldstr - '0', size_t))
{
- /* In case the user specified -c4294967296,22,
+ /* In case the user specified -c$(echo 2^64|bc),22,
complain only about the first number. */
/* Determine the length of the offending number. */
size_t len = strspn (num_start, "0123456789");
diff --git a/tests/cut/Test.pm b/tests/cut/Test.pm
index b4cd4e509..109a13f42 100755
--- a/tests/cut/Test.pm
+++ b/tests/cut/Test.pm
@@ -1,6 +1,6 @@
# Test 'cut'.
-# Copyright (C) 1996, 1997, 1998, 1999, 2003, 2004 Free Software
+# Copyright (C) 1996, 1997, 1998, 1999, 2003, 2004, 2007 Free Software
# Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@@ -113,6 +113,13 @@ my @tv = (
['od-overlap4', '-b1-3,2-3 --output-d=:', "abcd\n", "abc\n", 0],
['od-overlap5', '-b1-3,1-4 --output-d=:', "abcde\n", "abcd\n", 0],
+# None of the following invalid ranges provoked an error before coreutils-6.10.
+['inval1', '-f 2-0', '', '', 1],
+['inval2', '-f -', '', '', 1],
+['inval3', '-f 4,-', '', '', 1],
+['inval4', '-f 1-2,-', '', '', 1],
+['inval5', '-f 1-,-', '', '', 1],
+['inval6', '-f -1,-', '', '', 1],
);
# Don't use a pipe for failing tests. Otherwise, sometimes they