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