|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)main.c 4.2 8/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.