bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#9085: 'split' feature request: an option to uses e.g. '.001' as firs


From: Jérémy Compostella
Subject: bug#9085: 'split' feature request: an option to uses e.g. '.001' as first suffix.
Date: Mon, 30 Jan 2012 19:07:49 +0100

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
---
>From 79f08eef51b5651f153e0bacaab28c1da73c6517 Mon Sep 17 00:00:00 2001
From: Jeremy Compostella <address@hidden>
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 <address@hidden>
---
 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
address@hidden --numeric-suffixes
address@hidden address@hidden
 @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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]