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