Skip site navigation (1)Skip section navigation (2)
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>