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