cut: improve detection of invalid ranges
Commit 0068ce2fa
(cut: add toybox-compatible options -O OUTSEP,
-D, -F LIST) added detection of reversed ranges. Further
improvements are possible.
- The test for reversed ranges compared the start after it had been
decremented with the end before decrement. It thus missed ranges
of the form 2-1.
- Zero isn't a valid start value for a range. (Nor is it a valid
end value, but that's caught by the test for a reversed range.)
- The code
if (!*ltok)
e = INT_MAX;
duplicates a check that's already been made.
- Display the actual range in the error message to make it easier
to find which range was at fault.
function old new delta
.rodata 100273 100287 +14
cut_main 1239 1237 -2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 14/-2) Total: 12 bytes
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
50e2b59370
commit
f020414413
2 changed files with 12 additions and 12 deletions
|
@ -278,29 +278,26 @@ int cut_main(int argc UNUSED_PARAM, char **argv)
|
||||||
if (!ntok[0]) {
|
if (!ntok[0]) {
|
||||||
s = 0;
|
s = 0;
|
||||||
} else {
|
} else {
|
||||||
s = xatoi_positive(ntok);
|
|
||||||
/* account for the fact that arrays are zero based, while
|
/* account for the fact that arrays are zero based, while
|
||||||
* the user expects the first char on the line to be char #1 */
|
* the user expects the first char on the line to be char #1 */
|
||||||
if (s != 0)
|
s = xatoi_positive(ntok) - 1;
|
||||||
s--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the end pos */
|
/* get the end pos */
|
||||||
if (ltok == NULL) {
|
if (ltok == NULL) {
|
||||||
e = s;
|
e = s;
|
||||||
} else if (!ltok[0]) {
|
} else if (!ltok[0]) {
|
||||||
|
/* if the user specified no end position,
|
||||||
|
* that means "til the end of the line" */
|
||||||
e = INT_MAX;
|
e = INT_MAX;
|
||||||
} else {
|
} else {
|
||||||
e = xatoi_positive(ltok);
|
/* again, arrays are zero based, lines are 1 based */
|
||||||
/* if the user specified and end position of 0,
|
e = xatoi_positive(ltok) - 1;
|
||||||
* that means "til the end of the line" */
|
|
||||||
if (!*ltok)
|
|
||||||
e = INT_MAX;
|
|
||||||
else if (e < s)
|
|
||||||
bb_error_msg_and_die("%d<%d", e, s);
|
|
||||||
e--; /* again, arrays are zero based, lines are 1 based */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s < 0 || e < s)
|
||||||
|
bb_error_msg_and_die("invalid range %s-%s", ntok, ltok ?: ntok);
|
||||||
|
|
||||||
/* add the new list */
|
/* add the new list */
|
||||||
cut_lists = xrealloc_vector(cut_lists, 4, nlists);
|
cut_lists = xrealloc_vector(cut_lists, 4, nlists);
|
||||||
/* NB: startpos is always >= 0 */
|
/* NB: startpos is always >= 0 */
|
||||||
|
|
|
@ -31,7 +31,10 @@ testing "-b encapsulated" "cut -b 3-8,4-6 input" "e:two:\npha:be\ne quic\n" \
|
||||||
#testing "cut -bO overlaps" \
|
#testing "cut -bO overlaps" \
|
||||||
# "cut --output-delimiter ' ' -b 1-3,2-5,7-9,9-10 input" \
|
# "cut --output-delimiter ' ' -b 1-3,2-5,7-9,9-10 input" \
|
||||||
# "one:t o:th\nalpha beta\nthe q ick \n" "$abc" ""
|
# "one:t o:th\nalpha beta\nthe q ick \n" "$abc" ""
|
||||||
testing "cut high-low error" "cut -b 8-3 abc.txt 2>/dev/null || echo err" "err\n" \
|
testing "cut high-low error" "cut -b 8-3 input 2>/dev/null || echo err" "err\n" \
|
||||||
|
"$abc" ""
|
||||||
|
|
||||||
|
testing "cut -b 2-1 error" "cut -b 2-1 input 2>/dev/null || echo err" "err\n" \
|
||||||
"$abc" ""
|
"$abc" ""
|
||||||
|
|
||||||
testing "cut -c a-b" "cut -c 4-10 input" ":two:th\nha:beta\n quick \n" "$abc" ""
|
testing "cut -c a-b" "cut -c 4-10 input" ":two:th\nha:beta\n quick \n" "$abc" ""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue