Bell 32V development
[unix-history] / usr / src / cmd / awk / main.c
CommitLineData
f13af71c
TL
1#include "stdio.h"
2#include "awk.def"
3#include "awk.h"
4
5int dbg = 0;
6int svargc;
7char **svargv, **xargv;
8extern FILE *yyin; /* lex input file */
9char *lexprog; /* points to program argument if it exists */
10extern errorflag; /* non-zero if any syntax errors; set by yyerror */
11
12int filefd, iflag, symnum, ansfd;
13char *filelist;
14extern int maxsym, errno;
15main(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 */
62iloop:
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
77logit(n, s) char *s[];
78{ int i, tvec[2];
79 FILE *f, *g;
80 char buf[512];
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, 512, g))>0)
97 fwrite(buf, 1, i, f);
98 fclose(f);
99 fclose(g);
100}
101
102yywrap()
103{
104 return(1);
105}
106
107msgfiles()
108{ char buf[512], *p, *q, **s;
109 int n;
110 n=read(filefd, buf, 512);
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}