diff options
author | eadler <eadler@FreeBSD.org> | 2013-05-10 04:23:03 +0000 |
---|---|---|
committer | eadler <eadler@FreeBSD.org> | 2013-05-10 04:23:03 +0000 |
commit | 926f1ce0ab9c00b334b0adc38304cd5f8c1d70ac (patch) | |
tree | 49532e4bf36e8fad3fea5bf09911abb4690151d4 | |
parent | 7eb6dc1bda304d1c84dbbf27c0198269c94e580b (diff) | |
download | FreeBSD-src-926f1ce0ab9c00b334b0adc38304cd5f8c1d70ac.zip FreeBSD-src-926f1ce0ab9c00b334b0adc38304cd5f8c1d70ac.tar.gz |
Implement 'split -d' which allows a numeric suffix instead of an
alphabetic one.
PR: bin/116209
Submitted by: Marcin Gryszkalis <mg@fork.pl> (adapted from)
Reviewed by: will
MFC after: 1 week
-rw-r--r-- | usr.bin/split/split.1 | 6 | ||||
-rw-r--r-- | usr.bin/split/split.c | 28 |
2 files changed, 29 insertions, 5 deletions
diff --git a/usr.bin/split/split.1 b/usr.bin/split/split.1 index 308b016..f6056bb 100644 --- a/usr.bin/split/split.1 +++ b/usr.bin/split/split.1 @@ -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 diff --git a/usr.bin/split/split.c b/usr.bin/split/split.c index be4befe..561113e 100644 --- a/usr.bin/split/split.c +++ b/usr.bin/split/split.c @@ -51,6 +51,7 @@ static const char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94"; #include <inttypes.h> #include <limits.h> #include <locale.h> +#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> @@ -70,6 +71,7 @@ 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); @@ -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,9 +367,19 @@ 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 ((maxfiles *= pattlen) <= 0) errx(EX_USAGE, "suffix is too long (max %ld)", i); if (fnum == maxfiles) @@ -371,8 +389,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'; |