diff options
Diffstat (limited to 'usr.bin/cut/cut.c')
-rw-r--r-- | usr.bin/cut/cut.c | 296 |
1 files changed, 0 insertions, 296 deletions
diff --git a/usr.bin/cut/cut.c b/usr.bin/cut/cut.c deleted file mode 100644 index 25ffdd3..0000000 --- a/usr.bin/cut/cut.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Adam S. Moskowitz of Menlo Consulting and Marciano Pitargue. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1989, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)cut.c 8.1 (Berkeley) 6/6/93"; -#endif /* not lint */ - -#include <ctype.h> -#include <errno.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -int cflag; -char dchar; -int dflag; -int fflag; -int sflag; - -void c_cut __P((FILE *, char *)); -void err __P((const char *, ...)); -void f_cut __P((FILE *, char *)); -void get_list __P((char *)); -void usage __P((void)); - -int -main(argc, argv) - int argc; - char *argv[]; -{ - FILE *fp; - void (*fcn) __P((FILE *, char *)); - int ch; - - dchar = '\t'; /* default delimiter is \t */ - - while ((ch = getopt(argc, argv, "c:d:f:s")) != EOF) - switch(ch) { - case 'c': - fcn = c_cut; - get_list(optarg); - cflag = 1; - break; - case 'd': - dchar = *optarg; - dflag = 1; - break; - case 'f': - get_list(optarg); - fcn = f_cut; - fflag = 1; - break; - case 's': - sflag = 1; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - if (fflag) { - if (cflag) - usage(); - } else if (!cflag || dflag || sflag) - usage(); - - if (*argv) - for (; *argv; ++argv) { - if (!(fp = fopen(*argv, "r"))) - err("%s: %s\n", *argv, strerror(errno)); - fcn(fp, *argv); - (void)fclose(fp); - } - else - fcn(stdin, "stdin"); - exit(0); -} - -int autostart, autostop, maxval; - -char positions[_POSIX2_LINE_MAX + 1]; - -void -get_list(list) - char *list; -{ - register int setautostart, start, stop; - register char *pos; - char *p; - - /* - * set a byte in the positions array to indicate if a field or - * column is to be selected; use +1, it's 1-based, not 0-based. - * This parser is less restrictive than the Draft 9 POSIX spec. - * POSIX doesn't allow lists that aren't in increasing order or - * overlapping lists. We also handle "-3-5" although there's no - * real reason too. - */ - for (; p = strtok(list, ", \t"); list = NULL) { - setautostart = start = stop = 0; - if (*p == '-') { - ++p; - setautostart = 1; - } - if (isdigit(*p)) { - start = stop = strtol(p, &p, 10); - if (setautostart && start > autostart) - autostart = start; - } - if (*p == '-') { - if (isdigit(p[1])) - stop = strtol(p + 1, &p, 10); - if (*p == '-') { - ++p; - if (!autostop || autostop > stop) - autostop = stop; - } - } - if (*p) - err("[-cf] list: illegal list value\n"); - if (!stop || !start) - err("[-cf] list: values may not include zero\n"); - if (stop > _POSIX2_LINE_MAX) - err("[-cf] list: %d too large (max %d)\n", - stop, _POSIX2_LINE_MAX); - if (maxval < stop) - maxval = stop; - for (pos = positions + start; start++ <= stop; *pos++ = 1); - } - - /* overlapping ranges */ - if (autostop && maxval > autostop) - maxval = autostop; - - /* set autostart */ - if (autostart) - memset(positions + 1, '1', autostart); -} - -/* ARGSUSED */ -void -c_cut(fp, fname) - FILE *fp; - char *fname; -{ - register int ch, col; - register char *pos; - - for (;;) { - pos = positions + 1; - for (col = maxval; col; --col) { - if ((ch = getc(fp)) == EOF) - return; - if (ch == '\n') - break; - if (*pos++) - (void)putchar(ch); - } - if (ch != '\n') - if (autostop) - while ((ch = getc(fp)) != EOF && ch != '\n') - (void)putchar(ch); - else - while ((ch = getc(fp)) != EOF && ch != '\n'); - (void)putchar('\n'); - } -} - -void -f_cut(fp, fname) - FILE *fp; - char *fname; -{ - register int ch, field, isdelim; - register char *pos, *p, sep; - int output; - char lbuf[_POSIX2_LINE_MAX + 1]; - - for (sep = dchar, output = 0; fgets(lbuf, sizeof(lbuf), fp);) { - for (isdelim = 0, p = lbuf;; ++p) { - if (!(ch = *p)) - err("%s: line too long.\n", fname); - /* this should work if newline is delimiter */ - if (ch == sep) - isdelim = 1; - if (ch == '\n') { - if (!isdelim && !sflag) - (void)printf("%s", lbuf); - break; - } - } - if (!isdelim) - continue; - - pos = positions + 1; - for (field = maxval, p = lbuf; field; --field, ++pos) { - if (*pos) { - if (output++) - (void)putchar(sep); - while ((ch = *p++) != '\n' && ch != sep) - (void)putchar(ch); - } else - while ((ch = *p++) != '\n' && ch != sep); - if (ch == '\n') - break; - } - if (ch != '\n') - if (autostop) { - if (output) - (void)putchar(sep); - for (; (ch = *p) != '\n'; ++p) - (void)putchar(ch); - } else - for (; (ch = *p) != '\n'; ++p); - (void)putchar('\n'); - } -} - -void -usage() -{ - (void)fprintf(stderr, -"usage:\tcut -c list [file1 ...]\n\tcut -f list [-s] [-d delim] [file ...]\n"); - exit(1); -} - -#if __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -void -#if __STDC__ -err(const char *fmt, ...) -#else -err(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - va_list ap; -#if __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - (void)fprintf(stderr, "cut: "); - (void)vfprintf(stderr, fmt, ap); - va_end(ap); - (void)fprintf(stderr, "\n"); - exit(1); - /* NOTREACHED */ -} |