diff options
| author | jtc <jtc@NetBSD.org> | 1994-12-21 08:11:23 +0000 |
|---|---|---|
| committer | jtc <jtc@NetBSD.org> | 1994-12-21 08:11:23 +0000 |
| commit | 5233fb40266ffd8b405524fa171a342abf78c70c (patch) | |
| tree | de2f1b3be29ba7cc5357ab8d67654ef8f8ffa826 /usr.bin/split | |
| parent | fdc1920d231ad76a218ed384918ce059f71d6e58 (diff) | |
Merged with 4.4lite.
Changed to conform to NetBSD's new RCS Id convention.
Diffstat (limited to 'usr.bin/split')
| -rw-r--r-- | usr.bin/split/Makefile | 4 | ||||
| -rw-r--r-- | usr.bin/split/split.1 | 92 | ||||
| -rw-r--r-- | usr.bin/split/split.c | 286 |
3 files changed, 196 insertions, 186 deletions
diff --git a/usr.bin/split/Makefile b/usr.bin/split/Makefile index 4289937b431..8b902ffd33a 100644 --- a/usr.bin/split/Makefile +++ b/usr.bin/split/Makefile @@ -1,5 +1,5 @@ -# from: @(#)Makefile 5.2 (Berkeley) 5/11/90 -# $Id: Makefile,v 1.2 1993/07/30 23:50:57 mycroft Exp $ +# $NetBSD: Makefile,v 1.3 1994/12/21 08:20:33 jtc Exp $ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 PROG= split diff --git a/usr.bin/split/split.1 b/usr.bin/split/split.1 index 42e7b6a586b..788f1007b93 100644 --- a/usr.bin/split/split.1 +++ b/usr.bin/split/split.1 @@ -1,5 +1,7 @@ -.\" Copyright (c) 1990, 1991 Regents of the University of California. -.\" All rights reserved. +.\" $NetBSD: split.1,v 1.5 1994/12/21 08:20:35 jtc Exp $ +.\" +.\" Copyright (c) 1990, 1991, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions @@ -29,10 +31,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" from: @(#)split.1 6.4 (Berkeley) 7/29/91 -.\" $Id: split.1,v 1.4 1994/04/01 04:01:48 cgd Exp $ +.\" @(#)split.1 8.3 (Berkeley) 4/16/94 .\" -.Dd July 29, 1991 +.Dd April 16, 1994 .Dt SPLIT 1 .Os .Sh NAME @@ -40,66 +41,59 @@ .Nd split a file into pieces .Sh SYNOPSIS .Nm split -.Op Fl Ns Ar n -.Op Fl b Ar bytes +.Op Fl b Ar byte_count[k|m] +.Op Fl l Ar line_count .Op Ar file Op Ar name .Sh DESCRIPTION The .Nm split utility reads the given .Ar file -and splits it up in to -smaller files. +(or standard input if no file is specified) +and breaks it up into files of 1000 lines each. .Pp -Available options: -.Bl -tag -width "bb bytesx" -.It Fl Ns Ar lines -Create files of length -.Fl Ns Ar n -lines long. -.It Fl b Ar bytes -Create files of length -.Ar bytes . +The options are as follows: +.Bl -tag -width Ds +.It Fl b +Create smaller files +.Ar byte_count +bytes in length. +If +.Dq Li k +is appended to the number, the file is split into +.Ar byte_count +kilobyte pieces. +If +.Dq Li m +is appended to the number, the file is split into +.Ar byte_count +megabyte pieces. +.It Fl l +Create smaller files +.Ar n +lines in length. .El .Pp -If no output file length is specified, the file size -will default to a length of 1000 lines. +If additional arguments are specified, the first is used as the name +of the input file which is to be split. +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 . .Pp -Available operands: -.Bl -tag -width name -.It Fl -Read from the standard input. -.It Ar file -A pathname specifying the -.Ar file -to be split. If no -.Ar file -operand is given, -.Nm split -reads from the standard input. -.It Ar name If the .Ar name -operand is given, -the output files will begin with the prefix -.Ar name -and each sequential portion of the split file -receives a lexically ordered suffix -in the range of -.Bq Em aa-zz . -If the operand -.Ar name -is not specified, -the default prefix of -.Em x -is be used. -.Pp +argument is not specified, the file is split into lexically ordered +files named in the range of +.Dq Li xaa-zzz . .Sh BUGS -If you provide +For historical reasons, if you specify .Ar name , .Nm split can only create 676 separate -files. The default naming convention allows 2028 separate files. +files. +The default naming convention allows 2028 separate files. .Sh HISTORY A .Nm split diff --git a/usr.bin/split/split.c b/usr.bin/split/split.c index 2e9bf21b550..3e945906dab 100644 --- a/usr.bin/split/split.c +++ b/usr.bin/split/split.c @@ -1,6 +1,8 @@ +/* $NetBSD: split.c,v 1.4 1994/12/21 08:20:36 jtc Exp $ */ + /* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,246 +34,260 @@ */ #ifndef lint -char copyright[] = -"@(#) Copyright (c) 1987 Regents of the University of California.\n\ - All rights reserved.\n"; +static char copyright[] = +"@(#) Copyright (c) 1987, 1993, 1994\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -/*static char sccsid[] = "from: @(#)split.c 4.8 (Berkeley) 6/1/90";*/ -static char rcsid[] = "$Id: split.c,v 1.3 1994/04/06 00:04:09 cgd Exp $"; +#if 0 +static char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94"; +#endif +static char rcsid[] = "$NetBSD: split.c,v 1.4 1994/12/21 08:20:36 jtc Exp $"; #endif /* not lint */ #include <sys/param.h> -#include <sys/file.h> -#include <stdio.h> + #include <ctype.h> +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define DEFLINE 1000 /* Default num lines per file. */ -#define DEFLINE 1000 /* default num lines per file */ -#define ERR -1 /* general error */ -#define NO 0 /* no/false */ -#define OK 0 /* okay exit */ -#define YES 1 /* yes/true */ +long bytecnt; /* Byte count to split on. */ +long numlines; /* Line count to split on. */ +int file_open; /* If a file open. */ +int ifd = -1, ofd = -1; /* Input/output file descriptors. */ +char bfr[MAXBSIZE]; /* I/O buffer. */ +char fname[MAXPATHLEN]; /* File name prefix. */ -static long bytecnt, /* byte count to split on */ - numlines; /* lines in each file */ -static int ifd = ERR, /* input file descriptor */ - ofd = ERR; /* output file descriptor */ -static short file_open; /* if a file open */ -static char bfr[MAXBSIZE], /* I/O buffer */ - fname[MAXPATHLEN]; /* file name */ +void newfile __P((void)); +void split1 __P((void)); +void split2 __P((void)); +void usage __P((void)); +int main(argc, argv) int argc; - char **argv; + char *argv[]; { - register int cnt; - long atol(); - char *strcpy(); + int ch; + char *ep, *p; - for (cnt = 1; cnt < argc; ++cnt) { - if (argv[cnt][0] == '-') - switch(argv[cnt][1]) { - case 0: /* stdin by request */ - if (ifd != ERR) - usage(); - ifd = 0; - break; - case 'b': /* byte count split */ - if (numlines) - usage(); - if (!argv[cnt][2]) { - if (++cnt >= argc) - usage(); - bytecnt = atol(argv[cnt]); - } else - bytecnt = atol(argv[cnt] + 2); - if (bytecnt <= 0) { - fputs("split: byte count must be greater than zero.\n", stderr); - usage(); - } - break; - default: - if (!isdigit(argv[cnt][1]) || bytecnt) - usage(); - if ((numlines = atol(argv[cnt] + 1)) <= 0) { - fputs("split: line count must be greater than zero.\n", stderr); - usage(); - } - break; - } - else if (ifd == ERR) { /* input file */ - if ((ifd = open(argv[cnt], O_RDONLY, 0)) < 0) { - perror(argv[cnt]); - exit(1); + while ((ch = getopt(argc, argv, "-0123456789b:l:")) != EOF) + switch (ch) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + /* + * Undocumented kludge: split was originally designed + * to take a number after a dash. + */ + if (numlines == 0) { + p = argv[optind - 1]; + if (p[0] == '-' && p[1] == ch && !p[2]) + numlines = strtol(++p, &ep, 10); + else + numlines = + strtol(argv[optind] + 1, &ep, 10); + if (numlines <= 0 || *ep) + errx(1, + "%s: illegal line count.", optarg); } - } - else if (!*fname) /* output file prefix */ - strcpy(fname, argv[cnt]); - else + break; + case '-': /* Undocumented: historic stdin flag. */ + if (ifd != -1) + usage(); + ifd = 0; + break; + case 'b': /* Byte count. */ + if ((bytecnt = strtol(optarg, &ep, 10)) <= 0 || + *ep != '\0' && *ep != 'k' && *ep != 'm') + errx(1, "%s: illegal byte count.", optarg); + if (*ep == 'k') + bytecnt *= 1024; + else if (*ep == 'm') + bytecnt *= 1048576; + break; + case 'l': /* Line count. */ + if (numlines != 0) + usage(); + if ((numlines = strtol(optarg, &ep, 10)) <= 0 || *p) + errx(1, "%s: illegal line count.", optarg); + break; + default: usage(); - } - if (ifd == ERR) /* stdin by default */ + } + argv += optind; + argc -= optind; + + if (*argv != NULL) + if (ifd == -1) { /* Input file. */ + if ((ifd = open(*argv, O_RDONLY, 0)) < 0) + err(1, "%s", *argv); + ++argv; + } + if (*argv != NULL) /* File name prefix. */ + (void)strcpy(fname, *argv++); + if (*argv != NULL) + usage(); + + if (numlines == 0) + numlines = DEFLINE; + else if (bytecnt) + usage(); + + if (ifd == -1) /* Stdin by default. */ ifd = 0; - if (bytecnt) + + if (bytecnt) { split1(); - if (!numlines) - numlines = DEFLINE; + exit (0); + } split2(); exit(0); } /* * split1 -- - * split by bytes + * Split the input by bytes. */ +void split1() { - register long bcnt; - register int dist, len; - register char *C; + long bcnt; + int dist, len; + char *C; for (bcnt = 0;;) - switch(len = read(ifd, bfr, MAXBSIZE)) { + switch (len = read(ifd, bfr, MAXBSIZE)) { case 0: - exit(OK); - case ERR: - perror("read"); - exit(1); + exit(0); + case -1: + err(1, "read"); + /* NOTREACHED */ default: if (!file_open) { newfile(); - file_open = YES; + file_open = 1; } if (bcnt + len >= bytecnt) { dist = bytecnt - bcnt; if (write(ofd, bfr, dist) != dist) - wrerror(); + err(1, "write"); len -= dist; - for (C = bfr + dist; len >= bytecnt; len -= bytecnt, C += bytecnt) { + for (C = bfr + dist; len >= bytecnt; + len -= bytecnt, C += bytecnt) { newfile(); - if (write(ofd, C, (int)bytecnt) != bytecnt) - wrerror(); + if (write(ofd, + C, (int)bytecnt) != bytecnt) + err(1, "write"); } if (len) { newfile(); if (write(ofd, C, len) != len) - wrerror(); - } - else - file_open = NO; + err(1, "write"); + } else + file_open = 0; bcnt = len; - } - else { + } else { bcnt += len; if (write(ofd, bfr, len) != len) - wrerror(); + err(1, "write"); } } } /* * split2 -- - * split by lines + * Split the input by lines. */ +void split2() { - register char *Ce, *Cs; - register long lcnt; - register int len, bcnt; + long lcnt; + int len, bcnt; + char *Ce, *Cs; for (lcnt = 0;;) - switch(len = read(ifd, bfr, MAXBSIZE)) { + switch (len = read(ifd, bfr, MAXBSIZE)) { case 0: exit(0); - case ERR: - perror("read"); - exit(1); + case -1: + err(1, "read"); + /* NOTREACHED */ default: if (!file_open) { newfile(); - file_open = YES; + file_open = 1; } for (Cs = Ce = bfr; len--; Ce++) if (*Ce == '\n' && ++lcnt == numlines) { bcnt = Ce - Cs + 1; if (write(ofd, Cs, bcnt) != bcnt) - wrerror(); + err(1, "write"); lcnt = 0; Cs = Ce + 1; if (len) newfile(); else - file_open = NO; + file_open = 0; } if (Cs < Ce) { bcnt = Ce - Cs; if (write(ofd, Cs, bcnt) != bcnt) - wrerror(); + err(1, "write"); } } } /* * newfile -- - * open a new file + * Open a new output file. */ +void newfile() { static long fnum; - static short defname; + static int defname; static char *fpnt; - if (ofd == ERR) { - if (fname[0]) { - fpnt = fname + strlen(fname); - defname = NO; - } - else { + if (ofd == -1) { + if (fname[0] == '\0') { fname[0] = 'x'; fpnt = fname + 1; - defname = YES; + defname = 1; + } else { + fpnt = fname + strlen(fname); + defname = 0; } ofd = fileno(stdout); } /* - * hack to increase max files; original code just wandered through + * Hack to increase max files; original code wandered through * magic characters. Maximum files is 3 * 26 * 26 == 2028 */ #define MAXFILES 676 if (fnum == MAXFILES) { - if (!defname || fname[0] == 'z') { - fputs("split: too many files.\n", stderr); - exit(1); - } + if (!defname || fname[0] == 'z') + errx(1, "too many files."); ++fname[0]; fnum = 0; } fpnt[0] = fnum / 26 + 'a'; fpnt[1] = fnum % 26 + 'a'; ++fnum; - if (!freopen(fname, "w", stdout)) { - fprintf(stderr, "split: unable to write to %s.\n", fname); - exit(ERR); - } + if (!freopen(fname, "w", stdout)) + err(1, "%s", fname); } -/* - * usage -- - * print usage message and die - */ +void usage() { - fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n", stderr); - exit(1); -} - -/* - * wrerror -- - * write error - */ -wrerror() -{ - perror("split: write"); + (void)fprintf(stderr, +"usage: split [-b byte_count] [-l line_count] [file [prefix]]\n"); exit(1); } |
