Date: Thu, 31 Jan 2002 21:12:18 -0500 From: Mike Barcroft <mike@FreeBSD.ORG> To: "Tim J. Robbins" <tim@robbins.dropbear.id.au> Cc: freebsd-standards@FreeBSD.ORG Subject: Re: split(1) -a option patch Message-ID: <20020131211218.I10222@espresso.q9media.com> In-Reply-To: <20020126170422.A8594@descent.robbins.dropbear.id.au>; from tim@robbins.dropbear.id.au on Sat, Jan 26, 2002 at 05:04:22PM %2B1100 References: <20020124210956.A13091@descent.robbins.dropbear.id.au> <20020125132739.B92720@espresso.q9media.com> <20020126170422.A8594@descent.robbins.dropbear.id.au>
next in thread | previous in thread | raw e-mail | index | archive | help
Tim J. Robbins <tim@robbins.dropbear.id.au> writes: > Is this simpler? > tfnum = fnum; > i = sufflen - 1; > do { > fpnt[i] = tfnum % 26 + 'a'; > tfnum /= 26; > } while (i >= 0); Yes, but I think it's missing the i--. Could you update your patch to use this version? > Patch against -CURRENT is attached. Thanks. I found a couple more errors when I tested it. > Index: split/split.1 > =================================================================== > RCS file: /home/ncvs/src/usr.bin/split/split.1,v > retrieving revision 1.6 > diff -u -r1.6 split.1 > --- split/split.1 2001/07/15 08:01:34 1.6 > +++ split/split.1 2002/01/26 05:55:45 > @@ -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 > @@ -89,22 +96,18 @@ > If a second additional argument is specified, it is used as a prefix > for the names of the files into which the file is split. > In this case, each file into which the file is split is named by the > -prefix followed by a lexically ordered suffix in the range of > -.Dq Li aa-zz . > +prefix followed by a lexically ordered suffix using > +.Ar suffix_length > +characters in the range > +.Dq Li a-z . Please mention that the default is 2. > .Pp > If the > .Ar name > argument is not specified, the file is split into lexically ordered > -files named in the range of > -.Dq Li xaa-zzz . > +files named with prefixes in the range of > +.Dq Li x-z > +and with suffixes as above. > .Sh BUGS > -For historical reasons, if you specify > -.Ar name , > -.Nm > -can only create 676 separate > -files. > -The default naming convention allows 2028 separate files. > -.Pp These are still bugs; -a is the workaround. > The maximum line length for matching patterns is 65536. > .Sh SEE ALSO > .Xr re_format 7 > Index: split/split.c > =================================================================== > RCS file: /home/ncvs/src/usr.bin/split/split.c,v > retrieving revision 1.8 > diff -u -r1.8 split.c > --- split/split.c 2001/12/12 23:09:07 1.8 > +++ split/split.c 2002/01/26 05:55:46 > @@ -67,6 +67,7 @@ > char fname[MAXPATHLEN]; /* File name prefix. */ > regex_t rgx; > int pflag; > +long sufflen = 2; /* File name suffix length. */ > > void newfile __P((void)); > void split1 __P((void)); > @@ -81,7 +82,7 @@ > int ch; > char *ep, *p; > > - while ((ch = getopt(argc, argv, "-0123456789b:l:p:")) != -1) > + while ((ch = getopt(argc, argv, "-0123456789a:b:l:p:")) != -1) > switch (ch) { > case '0': case '1': case '2': case '3': case '4': > case '5': case '6': case '7': case '8': case '9': > @@ -106,6 +107,11 @@ > usage(); > ifd = 0; > break; > + case 'a': /* Suffix length */ > + if ((sufflen = strtol(optarg, &ep, 10)) <= 0 || *ep) > + err(EX_USAGE, > + "%s: illegal suffix length", optarg); This should be errx(). > + break; > case 'b': /* Byte count. */ > if ((bytecnt = strtoq(optarg, &ep, 10)) <= 0 || > (*ep != '\0' && *ep != 'k' && *ep != 'm')) > @@ -145,6 +151,8 @@ > if (*argv != NULL) > usage(); > > + if (strlen(fname) + (unsigned long)sufflen >= sizeof(fname)) > + err(EX_USAGE, "suffix is too long"); This should be errx(). > if (pflag && (numlines != 0 || bytecnt != 0)) > usage(); > > @@ -273,6 +281,7 @@ > void > newfile() > { > + long i, maxfiles, tfnum; > static long fnum; > static int defname; > static char *fpnt; > @@ -288,19 +297,25 @@ > } > ofd = fileno(stdout); > } > + > + /* maxfiles = 26^sufflen, but don't use libm. */ > + for (maxfiles = 1, i = 0; i < sufflen; i++) > + if ((maxfiles *= 26) <= 0) > + errx(EX_USAGE, "suffix is too long (max %ld)", i); > + > /* > * 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'; (see above) > ++fnum; > if (!freopen(fname, "w", stdout)) > err(EX_IOERR, "%s", fname); > @@ -311,6 +326,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"); > + (void)fprintf(stderr, "\t\t[file [prefix]]\n"); `\t\t' should be ` ' (7 spaces). See pax(1) for an example. > exit(EX_USAGE); > } I should be able to commit this after you fix these problems. Best regards, Mike Barcroft 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?20020131211218.I10222>