| /**************************************************************** | 
 | Copyright (C) Lucent Technologies 1997 | 
 | All Rights Reserved | 
 |  | 
 | Permission to use, copy, modify, and distribute this software and | 
 | its documentation for any purpose and without fee is hereby | 
 | granted, provided that the above copyright notice appear in all | 
 | copies and that both that the copyright notice and this | 
 | permission notice and warranty disclaimer appear in supporting | 
 | documentation, and that the name Lucent Technologies or any of | 
 | its entities not be used in advertising or publicity pertaining | 
 | to distribution of the software without specific, written prior | 
 | permission. | 
 |  | 
 | LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | 
 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. | 
 | IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY | 
 | SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | 
 | IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | 
 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF | 
 | THIS SOFTWARE. | 
 | ****************************************************************/ | 
 |  | 
 | char	*version = "version 19990602"; | 
 |  | 
 | #define DEBUG | 
 | #include <stdio.h> | 
 | #include <ctype.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <signal.h> | 
 | #include "awk.h" | 
 | #include "y.tab.h" | 
 |  | 
 | extern	char	**environ; | 
 | extern	int	nfields; | 
 |  | 
 | int	dbg	= 0; | 
 | char	*cmdname;	/* gets argv[0] for error messages */ | 
 | extern	FILE	*yyin;	/* lex input file */ | 
 | char	*lexprog;	/* points to program argument if it exists */ | 
 | extern	int errorflag;	/* non-zero if any syntax errors; set by yyerror */ | 
 | int	compile_time = 2;	/* for error printing: */ | 
 | 				/* 2 = cmdline, 1 = compile, 0 = running */ | 
 |  | 
 | char	*pfile[20];	/* program filenames from -f's */ | 
 | int	npfile = 0;	/* number of filenames */ | 
 | int	curpfile = 0;	/* current filename */ | 
 |  | 
 | int	safe	= 0;	/* 1 => "safe" mode */ | 
 |  | 
 | int main(int argc, char *argv[]) | 
 | { | 
 | 	char *fs = NULL, *marg; | 
 | 	int temp; | 
 |  | 
 | 	cmdname = argv[0]; | 
 | 	if (argc == 1) { | 
 | 		fprintf(stderr, "Usage: %s [-F fieldsep] [-mf n] [-mr n] [-v var=value] [-f programfile | 'program'] [file ...]\n", cmdname); | 
 | 		exit(1); | 
 | 	} | 
 | 	signal(SIGFPE, fpecatch); | 
 | 	yyin = NULL; | 
 | 	symtab = makesymtab(NSYMTAB); | 
 | 	while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { | 
 | 		if (strcmp(argv[1], "--") == 0) {	/* explicit end of args */ | 
 | 			argc--; | 
 | 			argv++; | 
 | 			break; | 
 | 		} | 
 | 		switch (argv[1][1]) { | 
 | 		case 's': | 
 | 			if (strcmp(argv[1], "-safe") == 0) | 
 | 				safe = 1; | 
 | 			break; | 
 | 		case 'f':	/* next argument is program filename */ | 
 | 			argc--; | 
 | 			argv++; | 
 | 			if (argc <= 1) | 
 | 				FATAL("no program filename"); | 
 | 			pfile[npfile++] = argv[1]; | 
 | 			break; | 
 | 		case 'F':	/* set field separator */ | 
 | 			if (argv[1][2] != 0) {	/* arg is -Fsomething */ | 
 | 				if (argv[1][2] == 't' && argv[1][3] == 0)	/* wart: t=>\t */ | 
 | 					fs = "\t"; | 
 | 				else if (argv[1][2] != 0) | 
 | 					fs = &argv[1][2]; | 
 | 			} else {		/* arg is -F something */ | 
 | 				argc--; argv++; | 
 | 				if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0)	/* wart: t=>\t */ | 
 | 					fs = "\t"; | 
 | 				else if (argc > 1 && argv[1][0] != 0) | 
 | 					fs = &argv[1][0]; | 
 | 			} | 
 | 			if (fs == NULL || *fs == '\0') | 
 | 				WARNING("field separator FS is empty"); | 
 | 			break; | 
 | 		case 'v':	/* -v a=1 to be done NOW.  one -v for each */ | 
 | 			if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) | 
 | 				setclvar(argv[1]); | 
 | 			break; | 
 | 		case 'm':	/* more memory: -mr=record, -mf=fields */ | 
 | 				/* no longer needed */ | 
 | 			marg = argv[1]; | 
 | 			if (argv[1][3]) | 
 | 				temp = atoi(&argv[1][3]); | 
 | 			else { | 
 | 				argv++; argc--; | 
 | 				temp = atoi(&argv[1][0]); | 
 | 			} | 
 | 			switch (marg[2]) { | 
 | 			case 'r':	recsize = temp; break; | 
 | 			case 'f':	nfields = temp; break; | 
 | 			default: FATAL("unknown option %s\n", marg); | 
 | 			} | 
 | 			break; | 
 | 		case 'd': | 
 | 			dbg = atoi(&argv[1][2]); | 
 | 			if (dbg == 0) | 
 | 				dbg = 1; | 
 | 			printf("awk %s\n", version); | 
 | 			break; | 
 | 		case 'V':	/* added for exptools "standard" */ | 
 | 			printf("awk %s\n", version); | 
 | 			exit(0); | 
 | 			break; | 
 | 		default: | 
 | 			WARNING("unknown option %s ignored", argv[1]); | 
 | 			break; | 
 | 		} | 
 | 		argc--; | 
 | 		argv++; | 
 | 	} | 
 | 	/* argv[1] is now the first argument */ | 
 | 	if (npfile == 0) {	/* no -f; first argument is program */ | 
 | 		if (argc <= 1) { | 
 | 			if (dbg) | 
 | 				exit(0); | 
 | 			FATAL("no program given"); | 
 | 		} | 
 | 		   dprintf( ("program = |%s|\n", argv[1]) ); | 
 | 		lexprog = argv[1]; | 
 | 		argc--; | 
 | 		argv++; | 
 | 	} | 
 | 	recinit(recsize); | 
 | 	syminit(); | 
 | 	compile_time = 1; | 
 | 	argv[0] = cmdname;	/* put prog name at front of arglist */ | 
 | 	   dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); | 
 | 	arginit(argc, argv); | 
 | 	if (!safe) | 
 | 		envinit(environ); | 
 | 	yyparse(); | 
 | 	if (fs) | 
 | 		*FS = qstring(fs, '\0'); | 
 | 	   dprintf( ("errorflag=%d\n", errorflag) ); | 
 | 	if (errorflag == 0) { | 
 | 		compile_time = 0; | 
 | 		run(winner); | 
 | 	} else | 
 | 		bracecheck(); | 
 | 	return(errorflag); | 
 | } | 
 |  | 
 | int pgetc(void)		/* get 1 character from awk program */ | 
 | { | 
 | 	int c; | 
 |  | 
 | 	for (;;) { | 
 | 		if (yyin == NULL) { | 
 | 			if (curpfile >= npfile) | 
 | 				return EOF; | 
 | 			if (strcmp(pfile[curpfile], "-") == 0) | 
 | 				yyin = stdin; | 
 | 			else if ((yyin = fopen(pfile[curpfile], "r")) == NULL) | 
 | 				FATAL("can't open file %s", pfile[curpfile]); | 
 | 			lineno = 1; | 
 | 		} | 
 | 		if ((c = getc(yyin)) != EOF) | 
 | 			return c; | 
 | 		if (yyin != stdin) | 
 | 			fclose(yyin); | 
 | 		yyin = NULL; | 
 | 		curpfile++; | 
 | 	} | 
 | } | 
 |  | 
 | char *cursource(void)	/* current source file name */ | 
 | { | 
 | 	if (npfile > 0) | 
 | 		return pfile[curpfile]; | 
 | 	else | 
 | 		return NULL; | 
 | } | 
 |  |