193 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************
 | 
						|
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.
 | 
						|
****************************************************************/
 | 
						|
 | 
						|
const char	*version = "version 20100208";
 | 
						|
 | 
						|
#define DEBUG
 | 
						|
#include <stdio.h>
 | 
						|
#include <ctype.h>
 | 
						|
#include <locale.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <signal.h>
 | 
						|
#include "awk.h"
 | 
						|
#include "awkgram.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 */
 | 
						|
 | 
						|
#define	MAX_PFILE	20	/* max number of -f's */
 | 
						|
 | 
						|
char	*pfile[MAX_PFILE];	/* 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[])
 | 
						|
{
 | 
						|
	const char *fs = NULL;
 | 
						|
 | 
						|
	setlocale(LC_CTYPE, "");
 | 
						|
	setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
 | 
						|
	cmdname = argv[0];
 | 
						|
	if (argc == 1) {
 | 
						|
		fprintf(stderr, 
 | 
						|
		  "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n", 
 | 
						|
		  cmdname);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	signal(SIGFPE, fpecatch);
 | 
						|
	yyin = NULL;
 | 
						|
	symtab = makesymtab(NSYMTAB/NSYMTAB);
 | 
						|
	while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
 | 
						|
		if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) {
 | 
						|
			printf("awk %s\n", version);
 | 
						|
			exit(0);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		if (strncmp(argv[1], "--", 2) == 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");
 | 
						|
			if (npfile >= MAX_PFILE - 1)
 | 
						|
				FATAL("too many -f options"); 
 | 
						|
			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 'd':
 | 
						|
			dbg = atoi(&argv[1][2]);
 | 
						|
			if (dbg == 0)
 | 
						|
				dbg = 1;
 | 
						|
			printf("awk %s\n", version);
 | 
						|
			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();
 | 
						|
	setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
 | 
						|
	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;
 | 
						|
}
 |