xref: /csrg-svn/old/awk/main.c (revision 6672)
1*6672Smckusick /*	main.c	4.1	82/05/07	*/
2*6672Smckusick 
3*6672Smckusick #include "stdio.h"
4*6672Smckusick #include "ctype.h"
5*6672Smckusick #include "awk.def"
6*6672Smckusick #include "awk.h"
7*6672Smckusick #define TOLOWER(c)	(isupper(c) ? tolower(c) : c) /* ugh!!! */
8*6672Smckusick 
9*6672Smckusick int	dbg	= 0;
10*6672Smckusick int	svflg	= 0;
11*6672Smckusick int	rstflg	= 0;
12*6672Smckusick int	svargc;
13*6672Smckusick char	**svargv, **xargv;
14*6672Smckusick extern FILE	*yyin;	/* lex input file */
15*6672Smckusick char	*lexprog;	/* points to program argument if it exists */
16*6672Smckusick extern	errorflag;	/* non-zero if any syntax errors; set by yyerror */
17*6672Smckusick 
18*6672Smckusick int filefd, symnum, ansfd;
19*6672Smckusick char *filelist;
20*6672Smckusick extern int maxsym, errno;
21*6672Smckusick main(argc, argv) int argc; char *argv[]; {
22*6672Smckusick 	if (argc == 1)
23*6672Smckusick 		error(FATAL, "Usage: awk [-f source | 'cmds'] [files]");
24*6672Smckusick 	if (strcmp(argv[0], "a.out"))
25*6672Smckusick 		logit(argc, argv);
26*6672Smckusick 	syminit();
27*6672Smckusick 	while (argc > 1) {
28*6672Smckusick 		argc--;
29*6672Smckusick 		argv++;
30*6672Smckusick 		/* this nonsense is because gcos argument handling */
31*6672Smckusick 		/* folds -F into -f.  accordingly, one checks the next
32*6672Smckusick 		/* character after f to see if it's -f file or -Fx.
33*6672Smckusick 		*/
34*6672Smckusick 		if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') {
35*6672Smckusick 			yyin = fopen(argv[1], "r");
36*6672Smckusick 			if (yyin == NULL)
37*6672Smckusick 				error(FATAL, "can't open %s", argv[1]);
38*6672Smckusick 			argc--;
39*6672Smckusick 			argv++;
40*6672Smckusick 			break;
41*6672Smckusick 		} else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') {	/* set field sep */
42*6672Smckusick 			if (argv[0][2] == 't')	/* special case for tab */
43*6672Smckusick 				**FS = '\t';
44*6672Smckusick 			else
45*6672Smckusick 				**FS = argv[0][2];
46*6672Smckusick 			continue;
47*6672Smckusick 		} else if (argv[0][0] != '-') {
48*6672Smckusick 			dprintf("cmds=|%s|\n", argv[0], NULL, NULL);
49*6672Smckusick 			yyin = NULL;
50*6672Smckusick 			lexprog = argv[0];
51*6672Smckusick 			argv[0] = argv[-1];	/* need this space */
52*6672Smckusick 			break;
53*6672Smckusick 		} else if (strcmp("-d", argv[0])==0) {
54*6672Smckusick 			dbg = 1;
55*6672Smckusick 		}
56*6672Smckusick 		else if(strcmp("-S", argv[0]) == 0) {
57*6672Smckusick 			svflg = 1;
58*6672Smckusick 		}
59*6672Smckusick 		else if(strncmp("-R", argv[0], 2) == 0) {
60*6672Smckusick 			if(thaw(argv[0] + 2) == 0)
61*6672Smckusick 				rstflg = 1;
62*6672Smckusick 			else {
63*6672Smckusick 				fprintf(stderr, "not restored\n");
64*6672Smckusick 				exit(1);
65*6672Smckusick 			}
66*6672Smckusick 		}
67*6672Smckusick 	}
68*6672Smckusick 	if (argc <= 1) {
69*6672Smckusick 		argv[0][0] = '-';
70*6672Smckusick 		argv[0][1] = '\0';
71*6672Smckusick 		argc++;
72*6672Smckusick 		argv--;
73*6672Smckusick 	}
74*6672Smckusick 	svargc = --argc;
75*6672Smckusick 	svargv = ++argv;
76*6672Smckusick 	dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL);
77*6672Smckusick 	*FILENAME = *svargv;	/* initial file name */
78*6672Smckusick 	if(rstflg == 0)
79*6672Smckusick 		yyparse();
80*6672Smckusick 	dprintf("errorflag=%d\n", errorflag, NULL, NULL);
81*6672Smckusick 	if (errorflag)
82*6672Smckusick 		exit(errorflag);
83*6672Smckusick 	if(svflg) {
84*6672Smckusick 		svflg = 0;
85*6672Smckusick 		if(freeze("awk.out") != 0)
86*6672Smckusick 			fprintf(stderr, "not saved\n");
87*6672Smckusick 		exit(0);
88*6672Smckusick 	}
89*6672Smckusick 	run();
90*6672Smckusick 	exit(errorflag);
91*6672Smckusick }
92*6672Smckusick 
93*6672Smckusick logit(n, s) char *s[];
94*6672Smckusick {	int i, tvec[2];
95*6672Smckusick 	FILE *f, *g;
96*6672Smckusick 	char buf[512];
97*6672Smckusick 	if ((f=fopen("/crp/pjw/awkhist/awkhist", "a"))==NULL)
98*6672Smckusick 		return;
99*6672Smckusick 	time(tvec);
100*6672Smckusick 	fprintf(f, "%-8s %s", getlogin(), ctime(tvec));
101*6672Smckusick 	for (i=0; i<n; i++)
102*6672Smckusick 		fprintf(f, "'%s'", s[i]);
103*6672Smckusick 	putc('\n', f);
104*6672Smckusick 	if (strcmp(s[1], "-f")) {
105*6672Smckusick 		fclose(f);
106*6672Smckusick 		return;
107*6672Smckusick 	}
108*6672Smckusick 	if ((g=fopen(s[2], "r"))==NULL) {
109*6672Smckusick 		fclose(f);
110*6672Smckusick 		return;
111*6672Smckusick 	}
112*6672Smckusick 	while ((i=fread(buf, 1, 512, g))>0)
113*6672Smckusick 		fwrite(buf, 1, i, f);
114*6672Smckusick 	fclose(f);
115*6672Smckusick 	fclose(g);
116*6672Smckusick }
117*6672Smckusick 
118*6672Smckusick yywrap()
119*6672Smckusick {
120*6672Smckusick 	return(1);
121*6672Smckusick }
122