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/split.c | |
| parent | fdc1920d231ad76a218ed384918ce059f71d6e58 (diff) | |
Merged with 4.4lite.
Changed to conform to NetBSD's new RCS Id convention.
Diffstat (limited to 'usr.bin/split/split.c')
| -rw-r--r-- | usr.bin/split/split.c | 286 |
1 files changed, 151 insertions, 135 deletions
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); } |
