xref: /csrg-svn/old/awk/main.c (revision 14473)
1*14473Ssam #ifndef lint
2*14473Ssam static char sccsid[] = "@(#)main.c	4.2 08/11/83";
3*14473Ssam #endif
46672Smckusick 
56672Smckusick #include "stdio.h"
66672Smckusick #include "ctype.h"
76672Smckusick #include "awk.def"
86672Smckusick #include "awk.h"
96672Smckusick #define TOLOWER(c)	(isupper(c) ? tolower(c) : c) /* ugh!!! */
106672Smckusick 
116672Smckusick int	dbg	= 0;
126672Smckusick int	svflg	= 0;
136672Smckusick int	rstflg	= 0;
146672Smckusick int	svargc;
156672Smckusick char	**svargv, **xargv;
166672Smckusick extern FILE	*yyin;	/* lex input file */
176672Smckusick char	*lexprog;	/* points to program argument if it exists */
186672Smckusick extern	errorflag;	/* non-zero if any syntax errors; set by yyerror */
196672Smckusick 
206672Smckusick int filefd, symnum, ansfd;
216672Smckusick char *filelist;
226672Smckusick extern int maxsym, errno;
236672Smckusick main(argc, argv) int argc; char *argv[]; {
246672Smckusick 	if (argc == 1)
256672Smckusick 		error(FATAL, "Usage: awk [-f source | 'cmds'] [files]");
266672Smckusick 	if (strcmp(argv[0], "a.out"))
276672Smckusick 		logit(argc, argv);
286672Smckusick 	syminit();
296672Smckusick 	while (argc > 1) {
306672Smckusick 		argc--;
316672Smckusick 		argv++;
326672Smckusick 		/* this nonsense is because gcos argument handling */
336672Smckusick 		/* folds -F into -f.  accordingly, one checks the next
346672Smckusick 		/* character after f to see if it's -f file or -Fx.
356672Smckusick 		*/
366672Smckusick 		if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') {
376672Smckusick 			yyin = fopen(argv[1], "r");
386672Smckusick 			if (yyin == NULL)
396672Smckusick 				error(FATAL, "can't open %s", argv[1]);
406672Smckusick 			argc--;
416672Smckusick 			argv++;
426672Smckusick 			break;
436672Smckusick 		} else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') {	/* set field sep */
446672Smckusick 			if (argv[0][2] == 't')	/* special case for tab */
456672Smckusick 				**FS = '\t';
466672Smckusick 			else
476672Smckusick 				**FS = argv[0][2];
486672Smckusick 			continue;
496672Smckusick 		} else if (argv[0][0] != '-') {
506672Smckusick 			dprintf("cmds=|%s|\n", argv[0], NULL, NULL);
516672Smckusick 			yyin = NULL;
526672Smckusick 			lexprog = argv[0];
536672Smckusick 			argv[0] = argv[-1];	/* need this space */
546672Smckusick 			break;
556672Smckusick 		} else if (strcmp("-d", argv[0])==0) {
566672Smckusick 			dbg = 1;
576672Smckusick 		}
586672Smckusick 		else if(strcmp("-S", argv[0]) == 0) {
596672Smckusick 			svflg = 1;
606672Smckusick 		}
616672Smckusick 		else if(strncmp("-R", argv[0], 2) == 0) {
626672Smckusick 			if(thaw(argv[0] + 2) == 0)
636672Smckusick 				rstflg = 1;
646672Smckusick 			else {
656672Smckusick 				fprintf(stderr, "not restored\n");
666672Smckusick 				exit(1);
676672Smckusick 			}
686672Smckusick 		}
696672Smckusick 	}
706672Smckusick 	if (argc <= 1) {
716672Smckusick 		argv[0][0] = '-';
726672Smckusick 		argv[0][1] = '\0';
736672Smckusick 		argc++;
746672Smckusick 		argv--;
756672Smckusick 	}
766672Smckusick 	svargc = --argc;
776672Smckusick 	svargv = ++argv;
786672Smckusick 	dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL);
796672Smckusick 	*FILENAME = *svargv;	/* initial file name */
806672Smckusick 	if(rstflg == 0)
816672Smckusick 		yyparse();
826672Smckusick 	dprintf("errorflag=%d\n", errorflag, NULL, NULL);
836672Smckusick 	if (errorflag)
846672Smckusick 		exit(errorflag);
856672Smckusick 	if(svflg) {
866672Smckusick 		svflg = 0;
876672Smckusick 		if(freeze("awk.out") != 0)
886672Smckusick 			fprintf(stderr, "not saved\n");
896672Smckusick 		exit(0);
906672Smckusick 	}
916672Smckusick 	run();
926672Smckusick 	exit(errorflag);
936672Smckusick }
946672Smckusick 
956672Smckusick logit(n, s) char *s[];
966672Smckusick {	int i, tvec[2];
976672Smckusick 	FILE *f, *g;
986672Smckusick 	char buf[512];
996672Smckusick 	if ((f=fopen("/crp/pjw/awkhist/awkhist", "a"))==NULL)
1006672Smckusick 		return;
1016672Smckusick 	time(tvec);
1026672Smckusick 	fprintf(f, "%-8s %s", getlogin(), ctime(tvec));
1036672Smckusick 	for (i=0; i<n; i++)
1046672Smckusick 		fprintf(f, "'%s'", s[i]);
1056672Smckusick 	putc('\n', f);
1066672Smckusick 	if (strcmp(s[1], "-f")) {
1076672Smckusick 		fclose(f);
1086672Smckusick 		return;
1096672Smckusick 	}
1106672Smckusick 	if ((g=fopen(s[2], "r"))==NULL) {
1116672Smckusick 		fclose(f);
1126672Smckusick 		return;
1136672Smckusick 	}
1146672Smckusick 	while ((i=fread(buf, 1, 512, g))>0)
1156672Smckusick 		fwrite(buf, 1, i, f);
1166672Smckusick 	fclose(f);
1176672Smckusick 	fclose(g);
1186672Smckusick }
1196672Smckusick 
1206672Smckusick yywrap()
1216672Smckusick {
1226672Smckusick 	return(1);
1236672Smckusick }
124