|
|
1.1 root 1: #
2: # include "mcons.c"
3: # include "ccmn.c"
4: /*int mbuf[1024]; /*INSTR*/
5: /*int tbuf[36]; /*INSTR*/
6:
7: int (*acts[])() {0,
8: &coll,
9: &save,
10: &out,
11: &asym,
12: &asw,
13: &csym,
14: &csw,
15: &incl,
16: &decl,
17: &sk2,
18: &sk,
19: &tabs,
20: &semi
21: };
22:
23: char *tmp[5] {"/usr/tmp/crt0a",
24: "/usr/tmp/crt1a",
25: "/usr/tmp/crt2a",
26: "/usr/tmp/crt3a",
27: "/usr/tmp/crt4a"
28: };
29:
30: char *ignonl "/usr/lib/aign";
31: char *gtab "/usr/lib/atab";
32:
33: main(argc,argv)
34: char *argv[];
35: {
36: auto i,j,tm1,tm2,tm3;
37: char *fn,*av[8];
38: /* extern etext; /*INSTR*/
39:
40: /* monitor(&main,&etext,&mbuf,1024); /*INSTR*/
41: if(argc < 2) {
42: printf("Usage: cref [-acilonstux123] file1 ...\n");
43: exit();
44: }
45:
46: lbuf[4] = '\t';
47: if(*argv[1] == '-') {
48: j = flags(argv);
49: argv =+ j;
50: argc =- j;
51: }
52: if(argc == 2) single = 1;
53:
54:
55: init();
56:
57: i = 0;
58: while(++i < argc) {
59: curs[0] = '_';
60: curs[1] = '\t';
61: curs[4] = '\t';
62: cursl = 2;
63:
64: if(fopen(argv[i],ibuf1) < 0) {
65: printf("Can't open %s\n",argv[i]);
66: dexit();
67: }
68: ibuf = ibuf1;
69:
70: curf[0] = '\t';
71: curfl = 1;
72: while((curf[curfl] = *argv[i]++) != 0 && curfl <= 14)
73: if(curf[curfl++] == '/') curfl = 1;
74: curf[curfl++] = '\t';
75: /* printf("%s %d\n",curf,curfl);/*DEBUG*/
76:
77: lno = 1;
78:
79: driver();
80:
81: close(file);
82: }
83: for(j = 0; j < 4;) {
84: flsh(j,0);
85: close(tp[j++]);
86: }
87:
88: /* monitor(0); /*INSTR*/
89: /* dexit(); /*INSTR*/
90:
91: /* times(tbuf); /*INSTR*/
92: /* tm1 = tbuf[15]/6; /*INSTR*/
93: /* tm2 = tbuf[19]/6; /*INSTR*/
94: /* tm3 = tbuf[23]/6; /*INSTR*/
95: /* printf("Prep: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
96:
97: if(utmp) exit();
98: fn = "/bin/sort";
99: av[0] = "sort";
100: av[1] = "-d";
101: av[3] = "-o";
102: av[5] = 0;
103: for(i = 0; i < 4; i++) {
104: av[4] = av[2] = tmp[i];
105: callsys(fn,av);
106: if(utmp) break;
107: }
108:
109: /* times(tbuf); /*INSTR*/
110: /* tm1 = tbuf[27]/6; /*INSTR*/
111: /* tm2 = tbuf[31]/6; /*INSTR*/
112: /* tm3 = tbuf[35]/6; /*INSTR*/
113: /* printf("Sort: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
114:
115: if(usw) {
116: fn = "/usr/lib/upost";
117: av[0] = "upost";
118: i = 0;
119: } else {
120: fn = "/usr/lib/crpost";
121: av[0] = "crpost";
122: av[1] = cross? "-4x": "-3";
123: if(single) av[1][1]--;
124: i = 1;
125: }
126: j = -1;
127: while(++j < 4) {
128: av[++i] = tmp[j];
129: if(utmp) break;
130: }
131: av[++i] = 0;
132:
133: callsys(fn,av);
134:
135: /* times(tbuf); /*INSTR*/
136: /* tm1 = tbuf[27]/6 - tm1; /*INSTR*/
137: /* tm2 = tbuf[31]/6 - tm2; /*INSTR*/
138: /* tm3 = tbuf[35]/6 - tm3; /*INSTR*/
139: /* printf("Post: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
140:
141: dexit();
142: }
143:
144: driver()
145: {
146: auto p;
147:
148: top:
149: l = -1;
150: while((c = line[++l] = getc(ibuf)) != -1) {
151: if(l >= 131) {
152: printf("Line too long: %d %s\n",lno,curf);
153: dexit();
154: }
155:
156: if(c & 0200) {
157: printf("Illegal character: %o line %d\n",c,lno);
158: dexit();
159: }
160:
161: if(fl) {
162: if((*flag[fl])())
163: continue;
164: }
165:
166: /*printf("cs = %d cc = %c ca = %d\n",cs,c,tab[cs].cl[c]); /*DEBUG*/
167:
168: if(p = tab[cs].cl[c])
169: (*acts[p])();
170: continue;
171: }
172: if(ibuf == ibuf1) return;
173: ibuf = ibuf1;
174: goto top;
175:
176: }
177:
178: init()
179: {
180: int b[3];
181: auto fi,i;
182: extern coll(),save(),out(),asym(),asw(),csym(),csw();
183: extern incl(),decl(),sk(),sk2();
184: extern dexit();
185:
186: ibuf1 = &ib1;
187: ibuf2 = &ib2;
188:
189: xtab.hptr = &xpsp;
190: xtab.symt = &xssp;
191: xtab.hsiz = PTRX;
192: xtab.ssiz = CHARX;
193: xtab.nsym = 0;
194: xtab.curb = 1;
195:
196: itab.hptr = &ipsp;
197: itab.symt = &issp;
198: itab.hsiz = PTRI;
199: itab.ssiz = CHARI;
200: itab.nsym = 0;
201: itab.curb = 1;
202:
203: if((fi = open(gtab,0)) < 0) {
204: printf("Cannot open grammar table; see lem\n");
205: dexit();
206: }
207:
208: i = -1;
209: while(++i < NUMS)
210: if(read(fi,tab[i].cl,256) < 256) {
211: printf("Bad grammar table.\n");
212: dexit();
213: }
214:
215: close(fi);
216:
217:
218: if((fi = open(ignonl,0)) < 0) {
219: printf("Cannot open ignore/only file: %s\n",ignonl);
220: dexit();
221: }
222: if(gtty(fi, b) != -1) {
223: close(fi);
224: compile();
225: goto on;
226: }
227: if((read(fi,b,6) == 6) && (b[0] == 0100200)) {
228: if(read(fi,itab.hptr,b[1]) < b[1]) {
229: printf("Cannot read ignore/only file: %s\n",ignonl);
230: dexit();
231: }
232: if(read(fi,itab.symt,b[2]) < b[2]) {
233: printf("Cannot read ignore/only file: %s\n",ignonl);
234: dexit();
235: }
236: close(fi);
237: } else {
238: close(fi);
239: compile();
240: }
241:
242: on:
243: if((signal(1,1) & 1) == 0) signal(1,&dexit);
244: if((signal(2,1) & 1) == 0) signal(2,&dexit);
245: if((signal(3,1) & 1) == 0) signal(3,&dexit);
246: /* signal(4,&dexit);
247: signal(5,&dexit);
248: signal(6,&dexit);
249: signal(7,&dexit);
250: signal(8,&dexit);
251: signal(10,&dexit);
252: signal(11,&dexit);
253: signal(12,&dexit);
254: */
255: if(utmp == 0) {
256: while((tp[4] = creat(tmp[4],0)) < 0)
257: tmp[4][13]++;
258: close(tp[4]);
259: tmp[0][13] = tmp[4][13];
260: tmp[1][13] = tmp[4][13];
261: tmp[2][13] = tmp[4][13];
262: tmp[3][13] = tmp[4][13];
263: tp[0] = creat(tmp[0],CREATC);
264: tp[1] = creat(tmp[1],CREATC);
265: tp[2] = creat(tmp[2],CREATC);
266: tp[3] = creat(tmp[3],CREATC);
267: } else {
268: if((tp[0] = creat(utmp,CREATC)) < 0) {
269: printf("Can't create user's temp file.\n");
270: exit();
271: }
272: }
273:
274: return;
275: }
276:
277: error(a)
278: {
279: printf("Error %d\n",a);
280: dexit();
281: }
282:
283: dexit()
284: {
285: extern nflush;
286:
287: /* printf("nflush = %d\n",nflush); /*DEBUG*/
288: if(tp[0] > 0 && utmp == 0) {
289: unlink(tmp[0]);
290: unlink(tmp[1]);
291: unlink(tmp[2]);
292: unlink(tmp[3]);
293: unlink(tmp[4]);
294: }
295: exit();
296: }
297:
298: callsys(f,v)
299: char f[],*v[];
300: {
301: int t,status,i;
302:
303: if((t = fork()) == 0) {
304: execv(f,v);
305: printf("Can't find %s\n",f);
306: exit(1);
307: } else {
308: if(t == -1) {
309: printf("Try again\n");
310: return(1);
311: }
312: }
313:
314: while(t != wait(&status));
315: /* printf("Status = %o, %s\n",status,f); /*DEBUG*/
316: if((t = (status & 0377)) != 0) {
317: if(t != 2) {
318: printf("Fatal error in %s\n",f);
319: printf("t = %d\n",t);
320: }
321: dexit();
322: }
323: return((status>>8) & 0377);
324: }
325:
326: flags(argv)
327: char *argv[];
328: {
329: int j,xx;
330: char *ap;
331:
332: j = 1;
333: ap = argv[1];
334: while(*++ap != '\0') {
335: switch(*ap) {
336:
337: default:
338: printf("Unrecognized flag: %c\n",*ap);
339: dexit();
340:
341: case '1': /* Symbol first */
342: order = 1;
343: continue;
344:
345: case '2': /* Current file first */
346: order = 2;
347: continue;
348:
349: case '3': /* Current symbol first */
350: order = 3;
351: continue;
352:
353: case 'a': /* Assembler */
354: cflag = 0;
355: continue;
356:
357: case 'c': /* C */
358: gtab = "/usr/lib/ctab";
359: if(!xx)
360: ignonl = "/usr/lib/cign";
361: cflag = 1;
362: continue;
363:
364: case 'e': /* English */
365: gtab = "/usr/lib/etab";
366: if(!xx)
367: ignonl = "/usr/lib/eign";
368: continue;
369:
370: case 'i': /* Ignore file */
371: if(!xx) {
372: xx = 1;
373: only = 0;
374: ignonl = argv[++j];
375: }
376: continue;
377:
378: case 'l': /* Line numbers in col. 3 */
379: cross = 0;
380: continue;
381:
382: case 'o': /* Only file */
383: if(!xx) {
384: xx = 1;
385: only = 1;
386: ignonl = argv[++j];
387: }
388: continue;
389:
390: case 'n': /* No context */
391: nocont = 1;
392: lbuf[4] = '\n';
393: continue;
394:
395: case 's': /* Symbols in col. 3 */
396: cross = 1;
397: continue;
398:
399: case 't':
400: utmp = argv[++j];
401: tmp[0] = argv[j];
402: continue;
403:
404: case 'u': /* Unique symbols only */
405: usw = 1;
406: continue;
407:
408: case 'x': /* C externals */
409: xsw = 1;
410: gtab = "/usr/lib/ctab";
411: if(!xx)
412: ignonl = "/usr/lib/cign";
413: cflag = 1;
414: continue;
415: }
416: }
417: return(j);
418: }
419:
420:
421: compile()
422: {
423: char buf[40],*b;
424: int i,v;
425:
426: fopen(ignonl,ibuf1);
427:
428: b = buf - 1;
429: while((*++b = getc(ibuf1)) != -1) {
430: if(*b == '\n') {
431: *b = '\0';
432: search(buf,b - buf,&itab,1);
433: b = buf - 1;
434: } else {
435: if(*b == '\t') {
436: v = 0;
437: while((i = getc(ibuf1)) != -1) {
438: if(i == '\n') break;
439: v = v*10 + (i - '0');
440: }
441: search(buf,b - buf,&itab,v);
442: b = buf - 1;
443: } else {
444: if((b - buf) > 39) {
445: printf("Ignore/only symbol too long");
446: dexit();
447: }
448: }
449: }
450: }
451: close(ibuf1);
452: return;
453: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.