Author: eadler
Date: Thu Jun 13 21:06:17 2013
New Revision: 251711
URL: http://svnweb.freebsd.org/changeset/base/251711

Log:
  MFC r227183,r229905,r250432,r250451,r250882:
  
        - Add missing static keywords to split(1)
  
        - Fix warning when compiling with gcc46:
         error: variable 'defname' set but not use
  
        - Implement 'split -d' which allows a numeric suffix instead of an
        alphabetic one.
  
        - Bump .Dd for recent content change.
        Avoid signed overflow in error handling code.
  
  PR:           bin/116209

Modified:
  stable/9/usr.bin/split/split.1
  stable/9/usr.bin/split/split.c
Directory Properties:
  stable/9/usr.bin/split/   (props changed)

Modified: stable/9/usr.bin/split/split.1
==============================================================================
--- stable/9/usr.bin/split/split.1      Thu Jun 13 21:06:17 2013        
(r251710)
+++ stable/9/usr.bin/split/split.1      Thu Jun 13 21:06:17 2013        
(r251711)
@@ -28,7 +28,7 @@
 .\"    @(#)split.1     8.3 (Berkeley) 4/16/94
 .\" $FreeBSD$
 .\"
-.Dd September 2, 2010
+.Dd May 9, 2013
 .Dt SPLIT 1
 .Os
 .Sh NAME
@@ -36,10 +36,12 @@
 .Nd split a file into pieces
 .Sh SYNOPSIS
 .Nm
+.Fl d
 .Op Fl l Ar line_count
 .Op Fl a Ar suffix_length
 .Op Ar file Op Ar prefix
 .Nm
+.Fl d
 .Fl b Ar byte_count Ns
 .Oo
 .Sm off
@@ -49,10 +51,12 @@
 .Op Fl a Ar suffix_length
 .Op Ar file Op Ar prefix
 .Nm
+.Fl d
 .Fl n Ar chunk_count
 .Op Fl a Ar suffix_length
 .Op Ar file Op Ar prefix
 .Nm
+.Fl d
 .Fl p Ar pattern
 .Op Fl a Ar suffix_length
 .Op Ar file Op Ar prefix
@@ -108,6 +112,8 @@ or
 is appended to the number, the file is split into
 .Ar byte_count
 gigabyte pieces.
+.It Fl d
+Use a numeric suffix instead of a alphabetic suffix.
 .It Fl l Ar line_count
 Create split files
 .Ar line_count

Modified: stable/9/usr.bin/split/split.c
==============================================================================
--- stable/9/usr.bin/split/split.c      Thu Jun 13 21:06:17 2013        
(r251710)
+++ stable/9/usr.bin/split/split.c      Thu Jun 13 21:06:17 2013        
(r251711)
@@ -51,6 +51,7 @@ static const char sccsid[] = "@(#)split.
 #include <inttypes.h>
 #include <limits.h>
 #include <locale.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -61,16 +62,17 @@ static const char sccsid[] = "@(#)split.
 
 #define DEFLINE        1000                    /* Default num lines per file. 
*/
 
-off_t   bytecnt;                       /* Byte count to split on. */
-off_t   chunks = 0;                    /* Chunks count to split into. */
-long    numlines;                      /* Line count to split on. */
-int     file_open;                     /* If a file open. */
-int     ifd = -1, ofd = -1;            /* Input/output file descriptors. */
-char    bfr[MAXBSIZE];                 /* I/O buffer. */
-char    fname[MAXPATHLEN];             /* File name prefix. */
-regex_t         rgx;
-int     pflag;
-long    sufflen = 2;                   /* File name suffix length. */
+static off_t    bytecnt;               /* Byte count to split on. */
+static off_t    chunks = 0;            /* Chunks count to split into. */
+static long     numlines;              /* Line count to split on. */
+static int      file_open;             /* If a file open. */
+static int      ifd = -1, ofd = -1;    /* Input/output file descriptors. */
+static char     bfr[MAXBSIZE];         /* I/O buffer. */
+static char     fname[MAXPATHLEN];     /* File name prefix. */
+static regex_t  rgx;
+static int      pflag;
+static bool     dflag;
+static long     sufflen = 2;           /* File name suffix length. */
 
 static void newfile(void);
 static void split1(void);
@@ -88,7 +90,8 @@ main(int argc, char **argv)
 
        setlocale(LC_ALL, "");
 
-       while ((ch = getopt(argc, argv, "0123456789a:b:l:n:p:")) != -1)
+       dflag = false;
+       while ((ch = getopt(argc, argv, "0123456789a:b:dl:n:p:")) != -1)
                switch (ch) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
@@ -131,6 +134,9 @@ main(int argc, char **argv)
                                errx(EX_USAGE, "%s: offset too large", optarg);
                        bytecnt = (off_t)(bytecnti * scale);
                        break;
+               case 'd':               /* Decimal suffix */
+                       dflag = true;
+                       break;
                case 'l':               /* Line count. */
                        if (numlines != 0)
                                usage();
@@ -348,6 +354,8 @@ newfile(void)
        long i, maxfiles, tfnum;
        static long fnum;
        static char *fpnt;
+       char beg, end;
+       int pattlen;
 
        if (ofd == -1) {
                if (fname[0] == '\0') {
@@ -359,10 +367,22 @@ newfile(void)
                ofd = fileno(stdout);
        }
 
-       /* maxfiles = 26^sufflen, but don't use libm. */
+       if (dflag) {
+               beg = '0';
+               end = '9';
+       }
+       else {
+               beg = 'a';
+               end = 'z';
+       }
+       pattlen = end - beg + 1;
+
+       /* maxfiles = pattlen^sufflen, but don't use libm. */
        for (maxfiles = 1, i = 0; i < sufflen; i++)
-               if ((maxfiles *= 26) <= 0)
+               if (LONG_MAX / pattlen < maxfiles)
                        errx(EX_USAGE, "suffix is too long (max %ld)", i);
+               else
+                       maxfiles *= pattlen;
 
        if (fnum == maxfiles)
                errx(EX_DATAERR, "too many files");
@@ -371,8 +391,8 @@ newfile(void)
        tfnum = fnum;
        i = sufflen - 1;
        do {
-               fpnt[i] = tfnum % 26 + 'a';
-               tfnum /= 26;
+               fpnt[i] = tfnum % pattlen + beg;
+               tfnum /= pattlen;
        } while (i-- > 0);
        fpnt[sufflen] = '\0';
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to