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

📄 main.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
GNU General Public License for more details.\n\\n";	static char blurb_part3[] ="You should have received a copy of the GNU General Public License\n\along with this program; if not, write to the Free Software\n\Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n";	version();	fputs(blurb_part1, stderr);	fputs(blurb_part2, stderr);	fputs(blurb_part3, stderr);	fflush(stderr);}static voidcmdline_fs(str)char *str;{	register NODE **tmp;	int len = strlen(str);	tmp = get_lhs(FS_node, (Func_ptr *) 0);	unref(*tmp);	/*	 * Only if in full compatibility mode check for the stupid special	 * case so -F\t works as documented in awk even though the shell	 * hands us -Ft.  Bleah!	 *	 * Thankfully, Posix didn't propogate this "feature".	 */	if (str[0] == 't' && str[1] == '\0') {		if (do_lint)			warning("-Ft does not set FS to tab in POSIX awk");		if (do_unix && ! do_posix)			str[0] = '\t';	}	*tmp = make_str_node(str, len, SCAN);	/* do process escapes */	set_FS();}static voidinit_args(argc0, argc, argv0, argv)int argc0, argc;char *argv0;char **argv;{	int i, j;	NODE **aptr;	ARGV_node = install("ARGV", node(Nnull_string, Node_var, (NODE *)NULL));	aptr = assoc_lookup(ARGV_node, tmp_number(0.0));	*aptr = make_string(argv0, strlen(argv0));	(*aptr)->flags |= MAYBE_NUM;	for (i = argc0, j = 1; i < argc; i++) {		aptr = assoc_lookup(ARGV_node, tmp_number((AWKNUM) j));		*aptr = make_string(argv[i], strlen(argv[i]));		(*aptr)->flags |= MAYBE_NUM;		j++;	}	ARGC_node = install("ARGC",			node(make_number((AWKNUM) j), Node_var, (NODE *) NULL));}/* * Set all the special variables to their initial values. */struct varinit {	NODE **spec;	char *name;	NODETYPE type;	char *strval;	AWKNUM numval;	Func_ptr assign;};static struct varinit varinit[] = {{&NF_node,	"NF",		Node_NF,		0,	-1, set_NF },{&FIELDWIDTHS_node, "FIELDWIDTHS", Node_FIELDWIDTHS,	"",	0,  0 },{&NR_node,	"NR",		Node_NR,		0,	0,  set_NR },{&FNR_node,	"FNR",		Node_FNR,		0,	0,  set_FNR },{&FS_node,	"FS",		Node_FS,		" ",	0,  0 },{&RS_node,	"RS",		Node_RS,		"\n",	0,  set_RS },{&IGNORECASE_node, "IGNORECASE", Node_IGNORECASE,	0,	0,  set_IGNORECASE },{&FILENAME_node, "FILENAME",	Node_var,		"-",	0,  0 },{&OFS_node,	"OFS",		Node_OFS,		" ",	0,  set_OFS },{&ORS_node,	"ORS",		Node_ORS,		"\n",	0,  set_ORS },{&OFMT_node,	"OFMT",		Node_OFMT,		"%.6g",	0,  set_OFMT },{&CONVFMT_node,	"CONVFMT",	Node_CONVFMT,		"%.6g",	0,  set_CONVFMT },{&RLENGTH_node, "RLENGTH",	Node_var,		0,	0,  0 },{&RSTART_node,	"RSTART",	Node_var,		0,	0,  0 },{&SUBSEP_node,	"SUBSEP",	Node_var,		"\034",	0,  0 },{&ARGIND_node,	"ARGIND",	Node_var,		0,	0,  0 },{&ERRNO_node,	"ERRNO",	Node_var,		0,	0,  0 },{0,		0,		Node_illegal,		0,	0,  0 },};static voidinit_vars(){	register struct varinit *vp;	for (vp = varinit; vp->name; vp++) {		*(vp->spec) = install(vp->name,		  node(vp->strval == 0 ? make_number(vp->numval)				: make_string(vp->strval, strlen(vp->strval)),		       vp->type, (NODE *) NULL));		if (vp->assign)			(*(vp->assign))();	}}voidload_environ(){#if !defined(MSDOS) && !(defined(VMS) && defined(__DECC))	extern char **environ;#endif	register char *var, *val;	NODE **aptr;	register int i;	ENVIRON_node = install("ENVIRON", 			node(Nnull_string, Node_var, (NODE *) NULL));	for (i = 0; environ[i]; i++) {		static char nullstr[] = "";		var = environ[i];		val = strchr(var, '=');		if (val)			*val++ = '\0';		else			val = nullstr;		aptr = assoc_lookup(ENVIRON_node, tmp_string(var, strlen (var)));		*aptr = make_string(val, strlen (val));		(*aptr)->flags |= MAYBE_NUM;		/* restore '=' so that system() gets a valid environment */		if (val != nullstr)			*--val = '=';	}}/* Process a command-line assignment */char *arg_assign(arg)char *arg;{	char *cp;	Func_ptr after_assign = NULL;	NODE *var;	NODE *it;	NODE **lhs;	cp = strchr(arg, '=');	if (cp != NULL) {		*cp++ = '\0';		/*		 * Recent versions of nawk expand escapes inside assignments.		 * This makes sense, so we do it too.		 */		it = make_str_node(cp, strlen(cp), SCAN);		it->flags |= MAYBE_NUM;		var = variable(arg, 0);		lhs = get_lhs(var, &after_assign);		unref(*lhs);		*lhs = it;		if (after_assign)			(*after_assign)();		*--cp = '=';	/* restore original text of ARGV */	}	return cp;}static voidpre_assign(v)char *v;{	if (!arg_assign(v)) {		fprintf (stderr,			"%s: '%s' argument to -v not in 'var=value' form\n",				myname, v);		usage(1);	}}SIGTYPEcatchsig(sig, code)int sig, code;{#ifdef lint	code = 0; sig = code; code = sig;#endif	if (sig == SIGFPE) {		fatal("floating point exception");	} else if (sig == SIGSEGV#ifdef SIGBUS	        || sig == SIGBUS#endif	) {		msg("fatal error: internal error");		/* fatal won't abort() if not compiled for debugging */		abort();	} else		cant_happen();	/* NOTREACHED */}/* gawk_option --- do gawk specific things */static voidgawk_option(optstr)char *optstr;{	char *cp;	for (cp = optstr; *cp; cp++) {		switch (*cp) {		case ' ':		case '\t':		case ',':			break;		case 'v':		case 'V':			/* print version */			if (strncasecmp(cp, "version", 7) != 0)				goto unknown;			else				cp += 6;			version();			break;		case 'c':		case 'C':			if (strncasecmp(cp, "copyright", 9) == 0) {				cp += 8;				copyleft();			} else if (strncasecmp(cp, "copyleft", 8) == 0) {				cp += 7;				copyleft();			} else if (strncasecmp(cp, "compat", 6) == 0) {				cp += 5;				do_unix = 1;			} else				goto unknown;			break;		case 'n':		case 'N':			/*			 * Undocumented feature,			 * inspired by nostalgia, and a T-shirt			 */			if (strncasecmp(cp, "nostalgia", 9) != 0)				goto unknown;			nostalgia();			break;		case 'p':		case 'P':#ifdef DEBUG			if (strncasecmp(cp, "parsedebug", 10) == 0) {				cp += 9;				yydebug = 2;				break;			}#endif			if (strncasecmp(cp, "posix", 5) != 0)				goto unknown;			cp += 4;			do_posix = do_unix = 1;			break;		case 'l':		case 'L':			if (strncasecmp(cp, "lint", 4) != 0)				goto unknown;			cp += 3;			do_lint = 1;			break;		case 'H':		case 'h':			if (strncasecmp(cp, "help", 4) != 0)				goto unknown;			cp += 3;			usage(0);			break;		case 'U':		case 'u':			if (strncasecmp(cp, "usage", 5) != 0)				goto unknown;			cp += 4;			usage(0);			break;		case 's':		case 'S':			if (strncasecmp(cp, "source=", 7) != 0)				goto unknown;			cp += 7;			if (strlen(cp) == 0)				warning("empty argument to -Wsource ignored");			else {				srcfiles[++numfiles].stype = CMDLINE;				srcfiles[numfiles].val = cp;				return;			}			break;		default:		unknown:			fprintf(stderr, "'%c' -- unknown option, ignored\n",				*cp);			break;		}	}}/* nostalgia --- print the famous error message and die */static voidnostalgia(){	fprintf(stderr, "awk: bailing out near line 1\n");	abort();}/* version --- print version message */static voidversion(){	fprintf(stderr, "%s, patchlevel %d\n", version_string, PATCHLEVEL);}/* static */char *gawk_name(filespec)char *filespec;{        char *p;    #ifdef VMS	/* "device:[root.][directory.subdir]GAWK.EXE;n" -> "GAWK" */        char *q;        p = strrchr(filespec, ']');  /* directory punctuation */        q = strrchr(filespec, '>');  /* alternate <international> punct */        if (p == NULL || q > p) p = q;	p = strdup(p == NULL ? filespec : (p + 1));	if ((q = strrchr(p, '.')) != NULL)  *q = '\0';  /* strip .typ;vers */	return p;#endif /*VMS*/#if defined(MSDOS) || defined(atarist)        char *q;        p = filespec;	        if (q = strrchr(p, '\\'))            p = q + 1;        if (q = strchr(p, '.'))    	    *q = '\0';        strlwr(p);        return (p == NULL ? filespec : p);#endif /* MSDOS || atarist */	/* "path/name" -> "name" */	p = strrchr(filespec, '/');	return (p == NULL ? filespec : p + 1);}

⌨️ 快捷键说明

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