|
|
1.1 root 1: #include "stdio.h"
2: #include "awk.def"
3: #include "awk.h"
4:
5: int dbg = 0;
6: int svargc;
7: char **svargv, **xargv;
8: extern FILE *yyin; /* lex input file */
9: char *lexprog; /* points to program argument if it exists */
10: extern errorflag; /* non-zero if any syntax errors; set by yyerror */
11:
12: int filefd, iflag, symnum, ansfd;
13: char *filelist;
14: extern int maxsym, errno;
15: main(argc, argv) int argc; char *argv[]; {
16: if (argc == 1)
17: error(FATAL, "Usage: awk [-f source | 'cmds'] [files]");
18: if (strcmp(argv[0], "a.out"))
19: logit(argc, argv);
20: syminit();
21: while (argc > 1) {
22: argc--;
23: argv++;
24: if (argv[0][0] == '-' && argv[0][1] == 'f') {
25: yyin = fopen(argv[1], "r");
26: if (yyin == NULL)
27: error(FATAL, "can't open %s", argv[1]);
28: argc--;
29: argv++;
30: break;
31: } else if (argv[0][0] == '-' && argv[0][1] == 'F') { /* set field sep */
32: if (argv[0][2] == 't') /* special case for tab */
33: **FS = '\t';
34: else
35: **FS = argv[0][2];
36: continue;
37: } else if (argv[0][0] != '-') {
38: dprintf("cmds=|%s|\n", argv[0], NULL, NULL);
39: yyin = NULL;
40: lexprog = argv[0];
41: argv[0] = argv[-1]; /* need this space */
42: break;
43: } else if (strcmp("-d", argv[0])==0)
44: dbg = 1;
45: else if (argv[0][0]=='-' && argv[0][1]=='i') {
46: iflag=1;
47: sscanf(argv[0], "-i%d, %d", &filefd, &ansfd);
48: }
49: }
50: if (argc <= 1 && !iflag) {
51: argv[0][0] = '-';
52: argv[0][1] = '\0';
53: argc++;
54: argv--;
55: }
56: if (!iflag) {
57: svargc = --argc;
58: svargv = ++argv;
59: dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL);
60: }
61: *FILENAME = *svargv; /* initial file name */
62: iloop:
63: if (iflag)
64: msgfiles();
65: yyparse();
66: dprintf("errorflag=%d\n", errorflag, NULL, NULL);
67: if (errorflag)
68: exit(0);
69: run();
70: if (iflag)
71: write(ansfd, &errorflag, sizeof(errorflag));
72: else exit(errorflag);
73: /*sym cleanup should go here , followed by another syminit*/
74: goto iloop;
75: }
76:
77: logit(n, s) char *s[];
78: { int i, tvec[2];
79: FILE *f, *g;
80: char buf[BUFSIZ];
81: if ((f=fopen("/usr/pjw/awk/awkhist", "a"))==NULL)
82: return;
83: time(tvec);
84: fprintf(f, "%-8s %s", getlogin(), ctime(tvec));
85: for (i=0; i<n; i++)
86: fprintf(f, "'%s'", s[i]);
87: putc('\n', f);
88: if (strcmp(s[1], "-f")) {
89: fclose(f);
90: return;
91: }
92: if ((g=fopen(s[2], "r"))==NULL) {
93: fclose(f);
94: return;
95: }
96: while ((i=fread(buf, 1, BUFSIZ, g))>0)
97: fwrite(buf, 1, i, f);
98: fclose(f);
99: fclose(g);
100: }
101:
102: yywrap()
103: {
104: return(1);
105: }
106:
107: msgfiles()
108: { char buf[BUFSIZ], *p, *q, **s;
109: int n;
110: n=read(filefd, buf, BUFSIZ);
111: if (n<=0) /*no one at other end?*/ {
112: perror("no files");
113: exit(errno);
114: }
115: xfree(filelist);
116: q=filelist=malloc(n);
117: for (p=buf; *p==' ' || *p=='\t' || *p=='\n'; p++);
118: for (n=0; *p!=';'; )
119: {
120: if (*p==' ' || *p=='\t' || *p=='\n') {
121: n++;
122: *q++=0;
123: while (*p==' ' || *p=='\t' || *p=='\n')
124: p++;
125: }
126: else *q++ = *p++;
127: }
128: if (q!=filelist && *(q-1)!=0) {
129: n++;
130: *q++ = 0;
131: }
132: svargc=n;
133: xfree(xargv);
134: xargv=s=svargv=malloc(n*sizeof(char *));
135: for (p=filelist; n>0; n--)
136: {
137: *s++=p;
138: while (*p++ != 0);
139: }
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.