diff options
author | Jim Meyering <jim@meyering.net> | 2007-05-22 13:56:34 +0200 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2007-05-22 13:56:34 +0200 |
commit | ae5717158f1b9f31b986b0f4416582684039ec55 (patch) | |
tree | 7f78f3c1ba976c139d7ee42d08eff33c6dc0b70f /src/cut.c | |
parent | 607614ae962f0e76ccaf2df132eff3e4864f75cc (diff) | |
download | coreutils-ae5717158f1b9f31b986b0f4416582684039ec55.tar.gz coreutils-ae5717158f1b9f31b986b0f4416582684039ec55.tar.bz2 coreutils-ae5717158f1b9f31b986b0f4416582684039ec55.zip |
"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.
Diffstat (limited to 'src/cut.c')
-rw-r--r-- | src/cut.c | 31 |
1 files changed, 19 insertions, 12 deletions
@@ -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"); |