Date: Thu, 24 Jan 2002 21:09:56 +1100 From: "Tim J. Robbins" <tim@robbins.dropbear.id.au> To: freebsd-standards@FreeBSD.ORG Subject: split(1) -a option patch Message-ID: <20020124210956.A13091@descent.robbins.dropbear.id.au>
next in thread | raw e-mail | index | archive | help
--5mCyUwZo2JvN/JJP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, This patch implements -a option of split command to control the number of letters used to generate filename suffix. This hopefully closes the "Add -a option to the split utility" task at http://people.freebsd.org/~mike/c99/ Tim --5mCyUwZo2JvN/JJP Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="split-sufflen.diff" diff -ru split.old/split.1 split/split.1 --- split.old/split.1 Thu Jan 24 21:07:03 2002 +++ split/split.1 Thu Jan 24 21:06:29 2002 @@ -40,6 +40,7 @@ .Nd split a file into pieces .Sh SYNOPSIS .Nm +.Op Fl a Ar suffix_length .Op Fl b Ar byte_count[k|m] .Op Fl l Ar line_count .Op Fl p Ar pattern @@ -54,6 +55,12 @@ .Pp The options are as follows: .Bl -tag -width Ds +.It Fl a +Use +.Ar suffix_length +letters to form the suffix of the file name. If +.Fl a +is not specified, two letters are used as the suffix. .It Fl b Create smaller files .Ar byte_count diff -ru split.old/split.c split/split.c --- split.old/split.c Thu Jan 24 21:07:03 2002 +++ split/split.c Thu Jan 24 21:05:07 2002 @@ -69,6 +69,7 @@ char fname[MAXPATHLEN]; /* File name prefix. */ regex_t rgx; int pflag; +int sufflen; /* File name suffix length. */ void newfile __P((void)); void split1 __P((void)); @@ -83,7 +84,7 @@ int ch; char *ep, *p; - while ((ch = getopt(argc, argv, "-0123456789b:l:p:")) != -1) + while ((ch = getopt(argc, argv, "-0123456789b:l:p:a:")) != -1) switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': @@ -130,6 +131,11 @@ errx(EX_USAGE, "%s: illegal line count", optarg); break; + case 'a': /* Suffix length */ + if ((sufflen = strtol(optarg, &ep, 10)) <= 0 || *ep) + err(EX_USAGE, + "%s: illegal suffix length", optarg); + break; default: usage(); } @@ -147,6 +153,9 @@ if (*argv != NULL) usage(); + if (strlen(fname) + sufflen >= sizeof (fname)) + err(EX_USAGE, "suffix is too long"); + if (pflag && (numlines != 0 || bytecnt != 0)) usage(); @@ -277,6 +286,7 @@ static long fnum; static int defname; static char *fpnt; + long maxfiles, i, tfnum; if (ofd == -1) { if (fname[0] == '\0') { @@ -289,19 +299,24 @@ } ofd = fileno(stdout); } + + /* maxfiles = 26^sufflen, but don't use libm */ + for (maxfiles = 1, i = 0; i < sufflen; i++) + maxfiles *= 26; + /* * Hack to increase max files; original code wandered through - * magic characters. Maximum files is 3 * 26 * 26 == 2028 + * magic characters. */ -#define MAXFILES 676 - if (fnum == MAXFILES) { + if (fnum == maxfiles) { if (!defname || fname[0] == 'z') errx(EX_DATAERR, "too many files"); ++fname[0]; fnum = 0; } - fpnt[0] = fnum / 26 + 'a'; - fpnt[1] = fnum % 26 + 'a'; + for (tfnum = fnum, i = sufflen; i != 0; i--, tfnum /= 26) + fpnt[i - 1] = tfnum % 26 + 'a'; + fpnt[sufflen] = '\0'; ++fnum; if (!freopen(fname, "w", stdout)) err(EX_IOERR, "%s", fname); @@ -312,6 +327,7 @@ usage() { (void)fprintf(stderr, -"usage: split [-b byte_count] [-l line_count] [-p pattern] [file [prefix]]\n"); +"usage: split [-a sufflen] [-b byte_count] [-l line_count] [-p pattern] \n" +"\t\t[file [prefix]]\n"); exit(EX_USAGE); } --5mCyUwZo2JvN/JJP-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-standards" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020124210956.A13091>