summaryrefslogtreecommitdiffstats
path: root/usr.bin/split/split.c
diff options
context:
space:
mode:
authoreadler <eadler@FreeBSD.org>2013-05-10 04:23:03 +0000
committereadler <eadler@FreeBSD.org>2013-05-10 04:23:03 +0000
commit926f1ce0ab9c00b334b0adc38304cd5f8c1d70ac (patch)
tree49532e4bf36e8fad3fea5bf09911abb4690151d4 /usr.bin/split/split.c
parent7eb6dc1bda304d1c84dbbf27c0198269c94e580b (diff)
downloadFreeBSD-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
Diffstat (limited to 'usr.bin/split/split.c')
-rw-r--r--usr.bin/split/split.c28
1 files changed, 23 insertions, 5 deletions
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';
OpenPOWER on IntegriCloud