|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)pc.c 5.1 (Berkeley) 6/5/85";
15: #endif not lint
16:
17: #include <stdio.h>
18: #include <signal.h>
19: #include <sys/wait.h>
20: #include <sys/param.h>
21:
22: /*
23: * Pc - front end for Pascal compiler.
24: */
25: char *pc0 = "/usr/lib/pc0";
26: char *pc1 = "/lib/f1";
27: char *pc2 = "/usr/lib/pc2";
28: char *c2 = "/lib/c2";
29: char *pc3 = "/usr/lib/pc3";
30: char *ld = "/bin/ld";
31: char *as = "/bin/as";
32: char *lpc = "-lpc";
33: char *crt0 = "/lib/crt0.o";
34: char *mcrt0 = "/lib/mcrt0.o";
35: char *gcrt0 = "/usr/lib/gcrt0.o";
36:
37: char *mktemp();
38: char *tmpdir = "/tmp";
39: char tmp0[MAXPATHLEN], tmp1[MAXPATHLEN];
40: char *tname[2];
41: char *tfile[2];
42:
43: char *setsuf(), *savestr();
44:
45: int Jflag, Sflag, Oflag, Tlflag, cflag, gflag, pflag, wflag, tflag;
46: int debug;
47:
48: #define NARGS 512
49: int ldargx = 3;
50: int pc0argx = 3;
51: char *pc0args[NARGS] = { "pc0", "-o", "XXX" };
52: char *pc1args[3] = { "pc1", 0, };
53: char *pc2args[2] = { "pc2", 0 };
54: char *c2args[4] = { "c2", 0, 0, 0 };
55: int pc3argx = 1;
56: #define pc3args pc0args
57: #define ldargs pc0args
58: /* char *pc3args[NARGS] = { "pc3", 0 }; */
59: /* char *ldargs[NARGS] = { "ld", "-X", "/lib/crt0.o", 0, }; */
60:
61: /* as -J -t tmpdir -o objfile srcfile \0 */
62: int asargx;
63: char *asargs[8] = { "as", 0, };
64:
65: char *mesg[] = {
66: 0,
67: "Hangup",
68: "Interrupt",
69: "Quit",
70: "Illegal instruction",
71: "Trace/BPT trap",
72: "IOT trap",
73: "EMT trap",
74: "Floating exception",
75: "Killed",
76: "Bus error",
77: "Segmentation fault",
78: "Bad system call",
79: "Broken pipe",
80: "Alarm clock",
81: "Terminated",
82: "Signal 16",
83: "Stopped (signal)",
84: "Stopped",
85: "Continued",
86: "Child exited",
87: "Stopped (tty input)",
88: "Stopped (tty output)",
89: "Tty input interrupt",
90: "Cputime limit exceeded",
91: "Filesize limit exceeded",
92: "Signal 26",
93: "Signal 27",
94: "Signal 28",
95: "Signal 29",
96: "Signal 30",
97: "Signal 31",
98: "Signal 32"
99: };
100:
101: /*
102: * If the number of .p arguments (np) is 1, and the number of .o arguments
103: * (nxo) is 0, and we successfully create an ``a.out'', then we remove
104: * the one .ps .o file (onepso).
105: */
106: int np, nxo;
107: char *onepso;
108: int errs;
109:
110: int onintr();
111:
112: main(argc, argv)
113: int argc;
114: char **argv;
115: {
116: register char *argp;
117: register int i;
118: int savargx;
119: char *t, c;
120: int j;
121:
122: argc--, argv++;
123: if (argc == 0) {
124: execl("/bin/cat", "cat", "/usr/lib/how_pc");
125: exit(1);
126: }
127: if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
128: signal(SIGINT, onintr);
129: signal(SIGTERM, onintr);
130: }
131: for (i = 0; i < argc; i++) {
132: argp = argv[i];
133: if (argp[0] != '-')
134: continue;
135: switch (argp[1]) {
136:
137: case 'd':
138: if (argp[2] == 0)
139: debug++;
140: continue;
141: case 'i':
142: pc0args[pc0argx++] = "-i";
143: while (i+1 < argc && argv[i+1][0] != '-' &&
144: getsuf(argv[i+1]) != 'p') {
145: pc0args[pc0argx++] = argv[i+1];
146: i++;
147: }
148: if (i+1 == argc) {
149: fprintf(stderr, "pc: bad -i construction\n");
150: exit(1);
151: }
152: continue;
153: case 'o':
154: i++;
155: if (i == argc) {
156: fprintf(stderr, "pc: -o must specify file\n");
157: exit(1);
158: }
159: c = getsuf(argv[i]);
160: if (c == 'o' || c == 'p' || c == 'c') {
161: fprintf(stderr, "pc: -o would overwrite %s\n",
162: argv[i]);
163: exit(1);
164: }
165: continue;
166: case 't':
167: i++;
168: if (i == argc) {
169: fprintf(stderr, "pc: -t but no directory\n");
170: exit(1);
171: }
172: if (argp[2] != '\0') {
173: fprintf(stderr, "pc: bad -t option\n");
174: exit(1);
175: }
176: tmpdir = argv[i];
177: if (tmpdir[0] == '-') {
178: fprintf(stderr, "pc: bad -t option\n");
179: exit(1);
180: }
181: tflag = 1;
182: continue;
183: case 'O':
184: Oflag = 1;
185: continue;
186: case 'S':
187: Sflag = 1;
188: continue;
189: case 'J':
190: Jflag = 1;
191: continue;
192: case 'T':
193: switch (argp[2]) {
194:
195: case '0':
196: pc0 = "/usr/src/ucb/pascal/pc0/a.out";
197: if (argp[3] != '\0') {
198: pc0 = &argp[3];
199: }
200: continue;
201: case '1':
202: pc1 = "/usr/src/lib/pcc/fort";
203: if (argp[3] != '\0') {
204: pc1 = &argp[3];
205: }
206: continue;
207: case '2':
208: pc2 = "/usr/src/ucb/pascal/utilities/pc2";
209: if (argp[3] != '\0') {
210: pc2 = &argp[3];
211: }
212: continue;
213: case '3':
214: pc3 = "/usr/src/ucb/pascal/utilities/pc3";
215: if (argp[3] != '\0') {
216: pc3 = &argp[3];
217: }
218: continue;
219: case 'l':
220: Tlflag = 1;
221: lpc = "/usr/src/usr.lib/libpc/libpc";
222: if (argp[3] != '\0') {
223: lpc = &argp[3];
224: }
225: continue;
226: }
227: continue;
228: case 'c':
229: cflag = 1;
230: continue;
231: case 'l':
232: if (argp[2])
233: continue;
234: /* fall into ... */
235: case 'b':
236: case 's':
237: case 'z':
238: case 'C':
239: pc0args[pc0argx++] = argp;
240: continue;
241: case 'w':
242: wflag = 1;
243: pc0args[pc0argx++] = argp;
244: continue;
245: case 'g':
246: gflag = 1;
247: pc0args[pc0argx++] = argp;
248: continue;
249: case 'p':
250: if (argp[2] == 'g')
251: crt0 = gcrt0;
252: else
253: crt0 = mcrt0;
254: if (!Tlflag)
255: lpc = "-lpc_p";
256: pflag = 1;
257: continue;
258: }
259: }
260: if (gflag && Oflag) {
261: fprintf(stderr, "pc: warning: -g overrides -O\n");
262: Oflag = 0;
263: }
264: sprintf(tmp0, "%s/%s", tmpdir, "p0XXXXXX");
265: tname[0] = mktemp(tmp0);
266: sprintf(tmp1, "%s/%s", tmpdir, "p1XXXXXX");
267: tname[1] = mktemp(tmp1);
268: savargx = pc0argx;
269: for (i = 0; i < argc; i++) {
270: argp = argv[i];
271: if (argp[0] == '-')
272: continue;
273: if (suffix(argp) == 's') {
274: asargx = 1;
275: if (Jflag)
276: asargs[asargx++] = "-J";
277: # ifdef vax
278: if (tflag) {
279: asargs[asargx++] = "-t";
280: asargs[asargx++] = tmpdir;
281: }
282: # endif vax
283: asargs[asargx++] = argp;
284: asargs[asargx++] = "-o";
285: tfile[1] = setsuf(argp, 'o');
286: asargs[asargx++] = tfile[1];
287: asargs[asargx] = 0;
288: if (dosys(as, asargs, 0, 0))
289: continue;
290: tfile[1] = 0;
291: continue;
292: }
293: if (suffix(argp) != 'p')
294: continue;
295: tfile[0] = tname[0];
296: pc0args[2] = tfile[0];
297: pc0argx = savargx;
298: if (pflag)
299: pc0args[pc0argx++] = "-p";
300: if (Jflag)
301: pc0args[pc0argx++] = "-J";
302: pc0args[pc0argx++] = argp;
303: pc0args[pc0argx] = 0;
304: if (dosys(pc0, pc0args, 0, 0))
305: continue;
306: pc1args[1] = tfile[0];
307: tfile[1] = tname[1];
308: if (dosys(pc1, pc1args, 0, tfile[1]))
309: continue;
310: unlink(tfile[0]);
311: tfile[0] = tname[0];
312: if (Oflag) {
313: if (dosys(c2, c2args, tfile[1], tfile[0]))
314: continue;
315: unlink(tfile[1]);
316: tfile[1] = tfile[0];
317: tfile[0] = tname[1];
318: }
319: if (Sflag)
320: tfile[0] = setsuf(argp, 's');
321: if (dosys(pc2, pc2args, tfile[1], tfile[0]))
322: continue;
323: unlink(tfile[1]);
324: tfile[1] = 0;
325: if (Sflag) {
326: tfile[0] = 0;
327: continue;
328: }
329: asargx = 1;
330: if (Jflag)
331: asargs[asargx++] = "-J";
332: # ifdef vax
333: if (tflag) {
334: asargs[asargx++] = "-t";
335: asargs[asargx++] = tmpdir;
336: }
337: # endif vax
338: asargs[asargx++] = tfile[0];
339: asargs[asargx++] = "-o";
340: tfile[1] = setsuf(argp, 'o');
341: asargs[asargx++] = tfile[1];
342: asargs[asargx] = 0;
343: if (dosys(as, asargs, 0, 0))
344: continue;
345: tfile[1] = 0;
346: remove();
347: }
348: if (errs || cflag || Sflag)
349: done();
350: /* char *pc3args[NARGS] = { "pc3", 0 }; */
351: pc3args[0] = "pc3";
352: if (wflag)
353: pc3args[pc3argx++] = "-w";
354: pc3args[pc3argx++] = "/usr/lib/pcexterns.o";
355: for (i = 0; i < argc; i++) {
356: argp = argv[i];
357: if (!strcmp(argp, "-o"))
358: i++;
359: if (argp[0] == '-')
360: continue;
361: switch (getsuf(argp)) {
362:
363: case 'o':
364: pc3args[pc3argx++] = argp;
365: nxo++;
366: continue;
367: case 's':
368: case 'p':
369: onepso = pc3args[pc3argx++] =
370: savestr(setsuf(argp, 'o'));
371: np++;
372: continue;
373: }
374: }
375: pc3args[pc3argx] = 0;
376: if (dosys(pc3, pc3args, 0, 0) > 1)
377: done();
378: errs = 0;
379: /* char *ldargs[NARGS] = { "ld", "-X", "/lib/crt0.o", 0, }; */
380: ldargs[0] = "ld";
381: ldargs[1] = "-X";
382: ldargs[2] = crt0;
383: for (i = 0; i < argc; i++) {
384: argp = argv[i];
385: if (argp[0] != '-') {
386: switch (getsuf(argp)) {
387:
388: case 'p':
389: case 's':
390: ldargs[ldargx] = savestr(setsuf(argp, 'o'));
391: break;
392: default:
393: ldargs[ldargx] = argp;
394: break;
395: }
396: if (getsuf(ldargs[ldargx]) == 'o')
397: for (j = 0; j < ldargx; j++)
398: if (!strcmp(ldargs[j], ldargs[ldargx]))
399: goto duplicate;
400: ldargx++;
401: duplicate:
402: continue;
403: }
404: switch (argp[1]) {
405:
406: case 'i':
407: while (i+1 < argc && argv[i+1][0] != '-' &&
408: getsuf(argv[i+1]) != 'p')
409: i++;
410: continue;
411: case 'd':
412: if (argp[2] == 0)
413: continue;
414: ldargs[ldargx++] = argp;
415: continue;
416: case 'o':
417: ldargs[ldargx++] = argp;
418: i++;
419: ldargs[ldargx++] = argv[i];
420: continue;
421: case 'l':
422: if (argp[2])
423: ldargs[ldargx++] = argp;
424: continue;
425: case 't':
426: i++;
427: continue;
428: case 'c':
429: case 'g':
430: case 'w':
431: case 'p':
432: case 'S':
433: case 'J':
434: case 'T':
435: case 'O':
436: case 'C':
437: case 'b':
438: case 's':
439: case 'z':
440: continue;
441: default:
442: ldargs[ldargx++] = argp;
443: continue;
444: }
445: }
446: ldargs[ldargx++] = lpc;
447: if (gflag)
448: ldargs[ldargx++] = "-lg";
449: if (pflag) {
450: ldargs[ldargx++] = "-lm_p";
451: ldargs[ldargx++] = "-lc_p";
452: } else {
453: ldargs[ldargx++] = "-lm";
454: ldargs[ldargx++] = "-lc";
455: }
456: ldargs[ldargx] = 0;
457: if (dosys(ld, ldargs, 0, 0)==0 && np == 1 && nxo == 0)
458: unlink(onepso);
459: done();
460: }
461:
462: dosys(cmd, argv, in, out)
463: char *cmd, **argv, *in, *out;
464: {
465: union wait status;
466: int pid;
467:
468: if (debug) {
469: int i;
470: printf("%s:", cmd);
471: for (i = 0; argv[i]; i++)
472: printf(" %s", argv[i]);
473: if (in)
474: printf(" <%s", in);
475: if (out)
476: printf(" >%s", out);
477: printf("\n");
478: }
479: /*
480: * warning: vfork doesn't work here, because the call to signal()
481: * done by the child process destroys the parent's SIGINT handler.
482: */
483: pid = fork();
484: if (pid < 0) {
485: fprintf(stderr, "pc: No more processes\n");
486: done();
487: }
488: if (pid == 0) {
489: if (in) {
490: close(0);
491: if (open(in, 0) != 0) {
492: perror(in);
493: exit(1);
494: }
495: }
496: if (out) {
497: close(1);
498: unlink(out);
499: if (creat(out, 0666) != 1) {
500: perror(out);
501: exit(1);
502: }
503: }
504: signal(SIGINT, SIG_DFL);
505: execv(cmd, argv);
506: perror(cmd);
507: exit(1);
508: }
509: while (wait(&status) != pid)
510: ;
511: if (WIFSIGNALED(status)) {
512: if (status.w_termsig != SIGINT) {
513: fprintf(stderr, "%s: %s", cmd, mesg[status.w_termsig]);
514: if (status.w_coredump)
515: fprintf(stderr, " (core dumped)");
516: fprintf(stderr, "\n");
517: }
518: errs = 100;
519: done();
520: /*NOTREACHED*/
521: }
522: if (status.w_retcode) {
523: errs = 1;
524: remove();
525: }
526: return (status.w_retcode);
527: }
528:
529: done()
530: {
531:
532: remove();
533: exit(errs);
534: }
535:
536: remove()
537: {
538:
539: if (tfile[0])
540: unlink(tfile[0]);
541: if (tfile[1])
542: unlink(tfile[1]);
543: }
544:
545: onintr()
546: {
547:
548: errs = 1;
549: done();
550: }
551:
552: getsuf(cp)
553: char *cp;
554: {
555:
556: if (*cp == 0)
557: return;
558: while (cp[1])
559: cp++;
560: if (cp[-1] != '.')
561: return (0);
562: return (*cp);
563: }
564:
565: char *
566: setsuf(as, ch)
567: char *as;
568: {
569: register char *s, *s1;
570:
571: s = s1 = savestr(as);
572: while (*s)
573: if (*s++ == '/')
574: s1 = s;
575: s[-1] = ch;
576: return (s1);
577: }
578:
579: #define NSAVETAB 512
580: char *savetab;
581: int saveleft;
582:
583: char *
584: savestr(cp)
585: register char *cp;
586: {
587: register int len;
588:
589: len = strlen(cp) + 1;
590: if (len > saveleft) {
591: saveleft = NSAVETAB;
592: if (len > saveleft)
593: saveleft = len;
594: savetab = (char *)malloc(saveleft);
595: if (savetab == 0) {
596: fprintf(stderr, "ran out of memory (savestr)\n");
597: exit(1);
598: }
599: }
600: strncpy(savetab, cp, len);
601: cp = savetab;
602: savetab += len;
603: return (cp);
604: }
605:
606: suffix(cp)
607: char *cp;
608: {
609:
610: if (cp[0] == 0 || cp[1] == 0)
611: return (0);
612: while (cp[1])
613: cp++;
614: if (cp[-1] == '.')
615: return (*cp);
616: return (0);
617: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.