xref: /csrg-svn/old/awk/main.c (revision 32353)
1 #ifndef lint
2 static char sccsid[] = "@(#)main.c	4.5 (Berkeley) 10/06/87";
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	ldbg	= 0;
13 int	svflg	= 0;
14 int	rstflg	= 0;
15 int	svargc;
16 char	**svargv, **xargv;
17 extern FILE	*yyin;	/* lex input file */
18 char	*lexprog;	/* points to program argument if it exists */
19 extern	errorflag;	/* non-zero if any syntax errors; set by yyerror */
20 
21 int filefd, symnum, ansfd;
22 char *filelist;
23 extern int maxsym, errno;
24 main(argc, argv) int argc; char *argv[]; {
25 	if (argc == 1)
26 		error(FATAL, "Usage: awk [-f source | 'cmds'] [files]");
27 	syminit();
28 	while (argc > 1) {
29 		argc--;
30 		argv++;
31 		/* this nonsense is because gcos argument handling */
32 		/* folds -F into -f.  accordingly, one checks the next
33 		/* character after f to see if it's -f file or -Fx.
34 		*/
35 		if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') {
36 			if (argv[1][0] == '-' && argv[1][1] == '\0')
37 				yyin = stdin;
38 			else {
39 				yyin = fopen(argv[1], "r");
40 				if (yyin == NULL)
41 					error(FATAL, "can't open %s", argv[1]);
42 			}
43 			argc--;
44 			argv++;
45 			break;
46 		} else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') {	/* set field sep */
47 			if (argv[0][2] == 't')	/* special case for tab */
48 				**FS = '\t';
49 			else
50 				**FS = argv[0][2];
51 			continue;
52 		} else if (argv[0][0] != '-') {
53 			dprintf("cmds=|%s|\n", argv[0], NULL, NULL);
54 			yyin = NULL;
55 			lexprog = argv[0];
56 			argv[0] = argv[-1];	/* need this space */
57 			break;
58 		} else if (strcmp("-d", argv[0])==0) {
59 			dbg = 1;
60 		}
61 		else if (strcmp("-l", argv[0])==0) {
62 			ldbg = 1;
63 		}
64 		else if(strcmp("-S", argv[0]) == 0) {
65 			svflg = 1;
66 		}
67 		else if(strncmp("-R", argv[0], 2) == 0) {
68 			if(thaw(argv[0] + 2) == 0)
69 				rstflg = 1;
70 			else {
71 				fprintf(stderr, "not restored\n");
72 				exit(1);
73 			}
74 		}
75 	}
76 	if (argc <= 1) {
77 		argv[0][0] = '-';
78 		argv[0][1] = '\0';
79 		argc++;
80 		argv--;
81 	}
82 	svargc = --argc;
83 	svargv = ++argv;
84 	dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL);
85 	*FILENAME = *svargv;	/* initial file name */
86 	if(rstflg == 0)
87 		yyparse();
88 	dprintf("errorflag=%d\n", errorflag, NULL, NULL);
89 	if (errorflag)
90 		exit(errorflag);
91 	if(svflg) {
92 		svflg = 0;
93 		if(freeze("awk.out") != 0)
94 			fprintf(stderr, "not saved\n");
95 		exit(0);
96 	}
97 	run();
98 	exit(errorflag);
99 }
100 
101 yywrap()
102 {
103 	return(1);
104 }
105