|
|
1.1 root 1: #
2: # include "econs.h"
3: # include "ecmn.h"
4: /*int mbuf[1024]; /*INSTR*/
5: /*int tbuf[12]; /*INSTR*/
6:
7: int (*acts[])() {0,
8: &coll,
9: &save,
10: &out,
11: &gobble2,
12: &hyphen,
13: &pno,
14: &bslash
15: };
16:
17: char *tmp[2] {"/tmp/crt0a",
18: "/tmp/crt1a"
19: };
20:
21: char *ignonl "/usr/lib/eign";
22: char *gtab "/usr/lib/etab";
23:
24: main(argc,argv)
25: char *argv[];
26: {
27: auto i,j,tm1,tm2,tm3;
28: char *fn,*av[8];
29: /* extern etext; /*INSTR*/
30:
31: /* monitor(&main,&etext,&mbuf,1024); /*INSTR*/
32:
33: if(*argv[1] == '-') {
34: j = flags(argv);
35: argv =+ j;
36: argc =- j;
37: }
38:
39: if(argc == 2) single = 1;
40: init();
41:
42: i = 0;
43: if(argc == 1) {
44: *ibuf1 = 0;
45: curfl = 2;
46: curf[0] = '_';
47: curf[1] = '\t';
48: curf[2] = '\0';
49: goto pipe;
50: }
51: while(++i < argc) {
52: curs[4] = '\t';
53:
54: if(fopen(argv[i],ibuf1) < 0) {
55: printf("Can't open %s\n",argv[i]);
56: dexit();
57: }
58:
59: curfl = 0;
60: while((curf[curfl] = *argv[i]++) != 0 && curfl <=8)
61: if(curf[curfl++] == '/') curfl = 0;
62: curf[curfl++] = '\t';
63: if(curfl == 8) curf[8] = -1;
64: curf[9] = '\0';
65:
66: pipe:
67: ibuf = ibuf1;
68: lno = 1;
69:
70: driver();
71:
72: close(file);
73: }
74: flsh(0);
75: close(tp[0]);
76:
77:
78: /* monitor(0); /*INSTR*/
79: /* dexit(); /*INSTR*/
80:
81: /* times(tbuf); /*INSTR*/
82: /* tm1 = tbuf[0]/6; /*INSTR*/
83: /* tm2 = tbuf[1]/6; /*INSTR*/
84: /* printf("Prep: %d %d\n", tm1, tm2); /*INSTR*/
85:
86: /* exit(); /*DEBUG*/
87: if(count) {
88: fn = "/bin/sort";
89: av[0] = "sort";
90: av[1] = "-u";
91: } else {
92: fn = "/bin/sort";
93: av[0] = "sort";
94: av[1] = "-f";
95: }
96: av[2] = tmp[0];
97: av[3] = "-o";
98: av[4] = tmp[0];
99: av[5] = 0;
100:
101: callsys(fn, av);
102:
103: /* times(tbuf); /*INSTR*/
104: /* tm1 = tbuf[3]/6; /*INSTR*/
105: /* tm2 = tbuf[5]/6; /*INSTR*/
106: /* printf("Sort: %d %d\n", tm1, tm2); /*INSTR*/
107:
108: if(usw) {
109: fn = "/usr/bin/upost";
110: av[0] = "upost";
111: i = 0;
112: } else if(count) {
113: fn = "count";
114: av[0] = "count";
115: i = 0;
116: } else {
117: fn = "/usr/bin/crpost";
118: av[0] = "crpost";
119: if(single) av[1] = "-E2";
120: else av[1] = "-E3";
121: i = 1;
122: }
123: av[++i] = tmp[0];
124: av[++i] = 0;
125:
126: callsys(fn,av);
127:
128: /* times(tbuf); /*INSTR*/
129: /* tm1 = tbuf[3]/6 - tm1; /*INSTR*/
130: /* tm2 = tbuf[5]/6 - tm2; /*INSTR*/
131: /* printf("Post: %d %d\n", tm1, tm2); /*INSTR*/
132:
133: dexit();
134: }
135:
136: driver()
137: {
138: auto p;
139:
140: top:
141: l = -1;
142: while((c = line[++l] = getc(ibuf)) != -1) {
143: /* printf("driver: c = %o l = %d\n",c,l); /*DEBUG*/
144: if(l >= 299) {
145: lflag++;
146: l--;
147: }
148:
149: if(c & 0200) {
150: printf("Illegal character: %o line %d\n",c,lno);
151: dexit();
152: }
153:
154: if(l == 0 && (c == '.' || c == '\'')) {
155: while((c = getc(ibuf)) != '\n')
156: if(c == -1) return;
157: lno++;
158: l = -1;
159: continue;
160: }
161:
162: if(fl) {
163: if((*flag[fl])())
164: continue;
165: }
166:
167: /*printf("cs = %d cc = %c ca = %d\n",cs,c,tab[cs].cl[c]); /*DEBUG*/
168:
169: if(p = tab[cs].cl[c])
170: (*acts[p])();
171: continue;
172: }
173: if(ibuf == ibuf1) return;
174: ibuf = ibuf1;
175: goto top;
176:
177: }
178:
179: init()
180: {
181: int b[3];
182: auto fi,i;
183: extern dexit();
184:
185: ibuf1 = &ib1;
186:
187:
188:
189: if((fi = open(gtab,0)) < 0) {
190: printf("Cannot open grammar table; see lem\n");
191: dexit();
192: }
193:
194: i = -1;
195: while(++i < NUMS)
196: if(read(fi,tab[i].cl,256) < 256) {
197: printf("Bad grammar table; see lem\n");
198: dexit();
199: }
200:
201: close(fi);
202:
203:
204:
205: if(signal(1,1) != 1) signal(1,&dexit);
206: if(signal(2,1) != 1) signal(2,&dexit);
207: if(signal(3,1) != 1) signal(3,&dexit);
208: if(!utmp) {
209: while((tp[1] = creat(tmp[1],0)) < 0)
210: tmp[1][9]++;
211: close(tp[1]);
212: tmp[0][9] = tmp[1][9];
213: }
214: tp[0] = creat(tmp[0],CREATC);
215:
216: if(count) return;
217:
218: itab.hptr = &ipsp;
219: itab.symt = &issp;
220: itab.hsiz = PTRI;
221: itab.ssiz = CHARI;
222: itab.nsym = 0;
223: itab.curb = 1;
224:
225: if((fi = open(ignonl,0)) < 0) {
226: printf("Cannot open ignore/only file.\n");
227: dexit();
228: }
229: if((read(fi,b,6) == 6) && (b[0] == 0100200)) {
230: if(read(fi,itab.hptr,b[1]) < b[1]) {
231: printf("Cannot read ignore/only file.\n");
232: dexit();
233: }
234: if(read(fi,itab.symt,b[2]) < b[2]) {
235: printf("Cannot read ignor/only file.\n");
236: dexit();
237: }
238: close(fi);
239: } else {
240: close(fi);
241: compile();
242: }
243: return;
244: }
245:
246:
247: dexit()
248: {
249: extern nflush;
250:
251: /* printf("nflush = %d\n",nflush); /*DEBUG*/
252: if(tp[0] > 0 && utmp == 0) {
253: unlink(tmp[0]);
254: unlink(tmp[1]);
255: }
256: exit();
257: }
258:
259: callsys(f,v)
260: char f[],*v[];
261: {
262: int t,status,i;
263:
264: if((t = fork()) == 0) {
265: for(i = 1; i <= 12; i++) signal(i,0);
266: execv(f,v);
267: printf("Can't find %s\n",f);
268: exit(1);
269: } else {
270: if(t == -1) {
271: printf("Try again\n");
272: return(1);
273: }
274: }
275:
276: while(t != wait(&status));
277: /* printf("Status = %o, %s\n",status,f); /*DEBUG*/
278: if((t = (status & 0377)) != 0) {
279: if(t != 2) {
280: printf("Fatal error in %s\n",f);
281: printf("t = %d\n",t);
282: }
283: dexit();
284: }
285: return((status>>8) & 0377);
286: }
287:
288: flags(argv)
289: char *argv[];
290: {
291: int j,xx;
292: extern ctout();
293: char *ap;
294:
295: j = 1;
296: ap = argv[1];
297: while(*++ap != '\0') {
298: switch(*ap) {
299:
300: default:
301: printf("Unrecognized flag: %c\n",*ap);
302: dexit();
303:
304: case 's':
305: gtab = "/usr/lem/sanskrit/stab";
306: san = 1;
307: continue;
308:
309: case 'c':
310: count = 1;
311: acts[OUT] = ctout;
312: continue;
313:
314: case 'd':
315: dlineno = 1;
316: continue;
317:
318: case 'i': /* Ignore file */
319: if(!xx) {
320: xx = 1;
321: only = 0;
322: ignonl = argv[++j];
323: }
324: continue;
325:
326: case 'o': /*only file*/
327: if(!xx) {
328: xx = 1;
329: only = 1;
330: ignonl = argv[++j];
331: }
332: continue;
333:
334: case 'p':
335: page = 1;
336: continue;
337:
338: case 't':
339: utmp = argv[++j];
340: tmp[0] = argv[j];
341: continue;
342:
343: case 'u': /* Unique symbols only */
344: usw = 1;
345: continue;
346:
347: case 'w': /* Word list only */
348: word = 1;
349: continue;
350:
351: }
352: }
353: return(j);
354: }
355:
356:
357: compile()
358: {
359: char buf[40],*b;
360: int i,v;
361:
362: fopen(ignonl,ibuf1);
363:
364: b = buf - 1;
365: while((*++b = getc(ibuf1)) != -1) {
366: if(*b == '\n') {
367: *b = '\0';
368: search(buf,b - buf,&itab,1);
369: b = buf - 1;
370: } else {
371: if(*b == '\t') {
372: v = 0;
373: while((i = getc(ibuf1)) != -1) {
374: if(i == '\n') break;
375: v = v*10 + (i - '0');
376: }
377: search(buf,b - buf,&itab,v);
378: b = buf - 1;
379: } else {
380: if((b - buf) > 39) {
381: printf("Ignore/only symbol too long.\n");
382: dexit();
383: }
384: }
385: }
386: }
387: close(ibuf1);
388: return;
389: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.