diff options
author | Pádraig Brady <P@draigBrady.com> | 2015-05-06 01:48:40 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2015-05-13 12:43:40 +0100 |
commit | 703747f892d3ec4713b97d4bff770a80122cd1ef (patch) | |
tree | 97caf65ccdb43c5f01785ade78dbaf29c3cfc9ae /src | |
parent | 79111d1553ff6603199b9e8e5f27269d55b095fb (diff) | |
download | coreutils-703747f892d3ec4713b97d4bff770a80122cd1ef.tar.xz |
split: auto set suffix len for --numeric-suffixes=<N --number=N
Supporting `split --numeric-suffixes=1 -n100` for example.
* doc/coreutils.texi (split invocation): Mention the two
use cases for the FROM parameter, and the consequences on
the suffix length determination.
* src/split.c (set_suffix_length): Use the --numeric-suffixes
FROM parameter in the suffix width calculation, when it's
less than the number of files specified in --number.
* tests/split/suffix-auto-length.sh: Add test cases.
Fixes http://bugs.gnu.org/20511
Diffstat (limited to 'src')
-rw-r--r-- | src/split.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/split.c b/src/split.c index 5d6043f70..b6fe2ddef 100644 --- a/src/split.c +++ b/src/split.c @@ -39,6 +39,7 @@ #include "sig2str.h" #include "xfreopen.h" #include "xdectoint.h" +#include "xstrtol.h" /* The official name of this program (e.g., no 'g' prefix). */ #define PROGRAM_NAME "split" @@ -173,9 +174,26 @@ set_suffix_length (uintmax_t n_units, enum Split_type split_type) if (split_type == type_chunk_bytes || split_type == type_chunk_lines || split_type == type_rr) { + uintmax_t n_units_end = n_units; + if (numeric_suffix_start) + { + uintmax_t n_start; + strtol_error e = xstrtoumax (numeric_suffix_start, NULL, 10, + &n_start, ""); + if (e == LONGINT_OK && n_start <= UINTMAX_MAX - n_units) + { + /* Restrict auto adjustment so we don't keep + incrementing a suffix size arbitrarily, + as that would break sort order for files + generated from multiple split runs. */ + if (n_start < n_units) + n_units_end += n_start; + } + + } size_t alphabet_len = strlen (suffix_alphabet); - bool alphabet_slop = (n_units % alphabet_len) != 0; - while (n_units /= alphabet_len) + bool alphabet_slop = (n_units_end % alphabet_len) != 0; + while (n_units_end /= alphabet_len) suffix_needed++; suffix_needed += alphabet_slop; suffix_auto = false; |