shuf: make -i 99999999990-100000000000 work even on 32 bits
No binary (build failed)
—
(log yok)
| @@ -67,9 +67,10 @@ int shuf_main(int argc, char **argv) | |
| { | |
| unsigned opts; | |
| char *opt_i_str, *opt_n_str, *opt_o_str; | |
| - | unsigned i; |
| char **lines; | |
| + | unsigned long long lo = lo; |
| unsigned numlines, outlines; | |
| + | unsigned i; |
| char eol; | |
| opts = getopt32(argv, "^" | |
| @@ -89,8 +90,8 @@ int shuf_main(int argc, char **argv) | |
| } else | |
| if (opts & OPT_i) { | |
| /* create a range of numbers */ | |
| + | unsigned long long hi; |
| char *dash; | |
| - | uintptr_t lo, hi; |
| if (argv[0]) | |
| bb_show_usage(); | |
| @@ -100,27 +101,24 @@ int shuf_main(int argc, char **argv) | |
| bb_error_msg_and_die("bad range '%s'", opt_i_str); | |
| } | |
| *dash = '\0'; | |
| - | if (sizeof(lo) == sizeof(int)) { |
| - | lo = xatou(opt_i_str); |
| - | hi = xatou(dash + 1); |
| - | } else |
| - | if (sizeof(lo) == sizeof(long)) { |
| - | lo = xatoul(opt_i_str); |
| - | hi = xatoul(dash + 1); |
| - | } else { |
| - | lo = xatoull(opt_i_str); |
| - | hi = xatoull(dash + 1); |
| - | } |
| + | lo = xatoull(opt_i_str); |
| + | hi = xatoull(dash + 1); |
| *dash = '-'; | |
| - | if (hi < lo) { |
| + | if (hi < lo) |
| bb_error_msg_and_die("bad range '%s'", opt_i_str); | |
| + | hi -= lo; |
| + | if (sizeof(size_t) > sizeof(numlines)) { |
| + | if (hi >= UINT_MAX) |
| + | bb_error_msg_and_die("bad range '%s'", opt_i_str); |
| + | } else { |
| + | if (hi >= UINT_MAX / sizeof(lines[0])) |
| + | bb_error_msg_and_die("bad range '%s'", opt_i_str); |
| } | |
| - | numlines = (hi+1) - lo; |
| - | lines = xmalloc(numlines * sizeof(lines[0])); |
| + | numlines = hi + 1; |
| + | lines = xmalloc((size_t)numlines * sizeof(lines[0])); |
| for (i = 0; i < numlines; i++) { | |
| - | lines[i] = (char*)lo; |
| - | lo++; |
| + | lines[i] = (char*)(uintptr_t)i; |
| } | |
| } else { | |
| /* default - read lines from stdin or the input file */ | |
| @@ -163,14 +161,9 @@ int shuf_main(int argc, char **argv) | |
| eol = '\0'; | |
| for (i = numlines - outlines; i < numlines; i++) { | |
| - | if (opts & OPT_i) { |
| - | if (sizeof(lines[0]) == sizeof(int)) |
| - | printf("%u%c", (unsigned)(uintptr_t)lines[i], eol); |
| - | else if (sizeof(lines[0]) == sizeof(long)) |
| - | printf("%lu%c", (unsigned long)(uintptr_t)lines[i], eol); |
| - | else |
| - | printf("%llu%c", (unsigned long long)(uintptr_t)lines[i], eol); |
| - | } else |
| + | if (opts & OPT_i) |
| + | printf("%llu%c", lo + (uintptr_t)lines[i], eol); |
| + | else |
| printf("%s%c", lines[i], eol); | |
| } | |