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