Package: coreutils;
Reported by: SciFi <sci-fi <at> hush.ai>
Date: Thu, 14 Jul 2011 22:35:02 UTC
Severity: wishlist
Merged with 11004
Done: Pádraig Brady <P <at> draigBrady.com>
Bug is archived. No further changes may be made.
Message #29 received at 9085 <at> debbugs.gnu.org (full text, mbox):
From: Jérémy Compostella <jeremy.compostella <at> gmail.com> To: Pádraig Brady <P <at> draigbrady.com> Cc: 9085 <at> debbugs.gnu.org, Jim Meyering <jim <at> meyering.net> Subject: Re: bug#9085: 'split' feature request: an option to uses e.g. '.001' as first suffix. Date: Mon, 30 Jan 2012 19:07:49 +0100
[Message part 1 (text/plain, inline)]
Pádraig wrotes: > On 01/30/2012 05:33 PM, Jérémy Compostella wrote: > > Pádraig, Jim, others, > > > > - Solution 1: > > Pádraig wrotes: > >> I wonder might we have a separate option, --suffix-start, and > >> theoretically that could accept alphabetic options too? I'm not > >> suggesting we do this, but it's worth discussion. > > That's was my first idea but since your first mail subject was "split > > --numeric-suffixes=N" I assumed that you already thought about it as a > > bad solution. Wrong assumption I guess. > > > > - Solution 2: > > Pádraig wrotes: > >> Thinking a bit more about it, it's probably worth to split the short > >> and long options. Have -d not take a param as before, and have > >> --numeric-suffixes take an optional param. > >> To do this, leave 'optional_argument' in the long_opts array, and just > >> remove the :: from the getopts call. > > My vote is for solution 2. > Less options = simpler interface for users. > I don't think it's too onerous to mandate, > numeric suffixes for this feature. OK, I attached the updated patch. If nobody does challenge the "Solution 2" I think we have the appropriate implementation. Note: I just received my coreutils assignment PDF file. I will print it and send it this week. Cheers, Jeremy ---
[0001-split-numeric-suffixes-new-optional-from-argument-bu.patch (text/x-diff, inline)]
From 79f08eef51b5651f153e0bacaab28c1da73c6517 Mon Sep 17 00:00:00 2001 From: Jeremy Compostella <jeremy.compostella <at> gmail.com> Date: Sun, 29 Jan 2012 15:20:31 +0100 Subject: [PATCH] split: --numeric-suffixes new optional "from" argument (bug#9085) The split command now accepts a new optional "from" argument for the --numeric-suffixes option. If this argument is specified, the numeric suffix counts from this value, otherwise, like before, it counts from 0. Signed-off-by: Jeremy Compostella <jeremy.compostella <at> gmail.com> --- NEWS | 6 +++++ doc/coreutils.texi | 5 ++- src/split.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 2b0926f..083e047 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU coreutils NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** New features + + split now accept an optional "from" value for the + --numeric-suffixes option. If this argument is specified, the + numeric suffix counts from this value, otherwise, like before, it + counts from 0. * Noteworthy changes in release 8.15 (2012-01-06) [stable] diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 0d3b739..2d2ba32 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -3084,10 +3084,11 @@ and so can be a pipe for example. Use suffixes of length @var{length}. The default @var{length} is 2. @item -d -@itemx --numeric-suffixes +@itemx --numeric-suffixes[=@var{from}] @opindex -d @opindex --numeric-suffixes -Use digits in suffixes rather than lower-case letters. +Use digits in suffixes rather than lower-case letters. The numerical +suffix counts from @var{from} if specified, 0 otherwise. @item -e @itemx --elide-empty-files diff --git a/src/split.c b/src/split.c index 5fbce0e..ca72637 100644 --- a/src/split.c +++ b/src/split.c @@ -80,6 +80,9 @@ static size_t suffix_length; /* Alphabet of characters to use in suffix. */ static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz"; +/* Numerical suffix count from value. */ +static unsigned long suffix_count_from; + /* Name of input file. May be "-". */ static char *infile; @@ -122,7 +125,7 @@ static struct option const longopts[] = {"elide-empty-files", no_argument, NULL, 'e'}, {"unbuffered", no_argument, NULL, 'u'}, {"suffix-length", required_argument, NULL, 'a'}, - {"numeric-suffixes", no_argument, NULL, 'd'}, + {"numeric-suffixes", optional_argument, NULL, 'd'}, {"filter", required_argument, NULL, FILTER_OPTION}, {"verbose", no_argument, NULL, VERBOSE_OPTION}, {"-io-blksize", required_argument, NULL, @@ -195,7 +198,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\ -a, --suffix-length=N use suffixes of length N (default %d)\n\ -b, --bytes=SIZE put SIZE bytes per output file\n\ -C, --line-bytes=SIZE put at most SIZE bytes of lines per output file\n\ - -d, --numeric-suffixes use numeric suffixes instead of alphabetic\n\ + -d, --numeric-suffixes[FROM] use numeric suffixes instead of alphabetic.\n\ + When specified, start counting from FROM, 0 otherwise\n\ -e, --elide-empty-files do not generate empty output files with '-n'\n\ --filter=COMMAND write to shell COMMAND; file name is $FILE\n\ -l, --lines=NUMBER put NUMBER lines per output file\n\ @@ -231,6 +235,7 @@ next_file_name (void) { /* Index in suffix_alphabet of each character in the suffix. */ static size_t *sufindex; + size_t i = suffix_length; if (! outfile) { @@ -243,9 +248,23 @@ next_file_name (void) outfile = xmalloc (outfile_length + 1); outfile_mid = outfile + outbase_length; memcpy (outfile, outbase, outbase_length); - memset (outfile_mid, suffix_alphabet[0], suffix_length); - outfile[outfile_length] = 0; sufindex = xcalloc (suffix_length, sizeof *sufindex); + /* Initialize the suffix index accordingly to the count from + value. */ + { + unsigned long left = suffix_count_from; + while (i-- != 0) + { + if (left) + { + sufindex[i] = left % 10; + left /= 10; + } + outfile_mid[i] = suffix_alphabet[sufindex[i]]; + } + } + + outfile[outfile_length] = 0; #if ! _POSIX_NO_TRUNC && HAVE_PATHCONF && defined _PC_NAME_MAX /* POSIX requires that if the output file name is too long for @@ -265,7 +284,6 @@ next_file_name (void) { /* Increment the suffix in place, if possible. */ - size_t i = suffix_length; while (i-- != 0) { sufindex[i]++; @@ -1142,6 +1160,18 @@ main (int argc, char **argv) case 'd': suffix_alphabet = "0123456789"; + if (optarg) + { + unsigned long tmp; + if (xstrtoul (optarg, NULL, 10, &tmp, "") != LONGINT_OK) + { + error (0, 0, _("%s: invalid count from numerical suffix number"), + optarg); + usage (EXIT_FAILURE); + } + else + suffix_count_from = tmp; + } break; case 'e': @@ -1212,6 +1242,26 @@ main (int argc, char **argv) usage (EXIT_FAILURE); } + /* Check that the suffix length is greater enough for the numerical + suffix count from value. */ + if (suffix_count_from) + { + unsigned long start = suffix_count_from; + size_t length = suffix_length; + + while (start) + { + if (length == 0) + { + error (0, 0, _("numerical suffix FROM number too hight\ + for the suffix length")); + usage (EXIT_FAILURE); + } + start /= 10; + length--; + } + } + /* Open the input file. */ if (! STREQ (infile, "-") && fd_reopen (STDIN_FILENO, infile, O_RDONLY, 0) < 0) -- 1.7.2.5
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.