⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cut.c

📁 早期freebsd实现
💻 C
字号:
/* * 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 lintstatic char copyright[] ="@(#) Copyright (c) 1989, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic 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));intmain(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];voidget_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 */voidc_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');	}}voidf_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');	}}voidusage(){	(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>#endifvoid#if __STDC__err(const char *fmt, ...)#elseerr(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 */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -