|
|
1.1 root 1: /*
2: * cc - front end for C compiler
3: */
4: #include <sys/types.h>
5: #include <stdio.h>
6: #include <ctype.h>
7: #include <signal.h>
8: #include <dir.h>
9:
10: char *cpp = "/lib/cpp";
11: char *ccom = "/usr/jerq/lib/m32/comp";
12: char *as = "/usr/jerq/bin/3as";
13: char *c2 = "/usr/jerq/lib/m32/optim";
14: char *ld = "/usr/jerq/bin/3ld";
15: char *ifile = "/usr/jerq/lib/muxmap";
16:
17: char tmp0[30]; /* big enough for /tmp/ctm%05.5d */
18: char *tmp1, *tmp2, *tmp3, *tmp4, *tmp5;
19: char *outfile;
20: char *savestr(), *strspl(), *setsuf();
21: int idexit();
22: char **av, **clist, **llist, **plist;
23: int cflag, eflag, gflag, pflag, sflag, Rflag, exflag, proflag, oflag;
24: int dont, jflag, mflag=1; /* default is to compile for mux(9) */
25: int exfail;
26: char *chpass;
27: char *npassname;
28: extern int optind;
29: extern int opterr;
30: extern char *optarg;
31: extern int optopt;
32:
33: int nc, nl, np, nxo, na;
34:
35: #define cunlink(x) if (x) unlink(x)
36:
37: main(argc, argv)
38: char **argv;
39: {
40: char *t;
41: char *assource;
42: int i, j, c;
43:
44: /* ld currently adds upto 5 args; 10 is room to spare */
45: /* I upped it anyway -- rob */
46: av = (char **)calloc(argc+20, sizeof (char **));
47: clist = (char **)calloc(argc+20, sizeof (char **));
48: llist = (char **)calloc(argc+20, sizeof (char **));
49: plist = (char **)calloc(argc+20, sizeof (char **));
50: opterr = 0;
51: while (optind<argc) switch (c = getopt(argc, argv, "dJmSo:ROPgEPcD:I:U:C:t:B:l:")) {
52: case 'd':
53: dont++;
54: continue;
55: case 'S':
56: sflag++;
57: cflag++;
58: continue;
59: case 'J':
60: jflag++;
61: case 'm':
62: mflag=0;
63: ifile = "/usr/jerq/lib/jxmap";
64: continue;
65: case 'l':
66: llist[nl++] = strspl("-l", optarg);
67: continue;
68: case 'o':
69: outfile = optarg;
70: switch (getsuf(outfile)) {
71:
72: case 'c':
73: case 'o':
74: error("-o would overwrite %s", outfile);
75: exit(8);
76: }
77: continue;
78: case 'R':
79: Rflag++;
80: continue;
81: case 'O':
82: oflag++;
83: continue;
84: case 'p':
85: proflag++;
86: continue;
87: case 'g':
88: gflag++;
89: continue;
90: case 'E':
91: exflag++;
92: cflag++;
93: continue;
94: case 'P':
95: pflag++;
96: case 'c':
97: cflag++;
98: continue;
99: case 'D':
100: case 'I':
101: case 'U':
102: case 'C':
103: plist[np] = strspl("-X", optarg);
104: plist[np++][1] = c;
105: continue;
106: case 't':
107: if (chpass)
108: error("-t overwrites earlier option", 0);
109: chpass = optarg;
110: if (chpass[0]==0)
111: chpass = "012p";
112: continue;
113: case 'B':
114: if (npassname)
115: error("-B overwrites earlier option", 0);
116: npassname = optarg;
117: if (npassname[0]==0)
118: npassname = "/usr/scj/mcc";
119: continue;
120: case '?':
121: t = strspl("-", "x");
122: t[1] = optopt;
123: llist[nl++] = t;
124: continue;
125:
126: case EOF:
127: t = argv[optind];
128: optind++;
129: c = getsuf(t);
130: if (c=='c' || c=='s' || c=='i' || exflag) {
131: clist[nc++] = t;
132: t = setsuf(t, 'o');
133: }
134: if (nodup(llist, t)) {
135: llist[nl++] = t;
136: if (getsuf(t)=='o')
137: nxo++;
138: }
139: }
140: if (npassname && chpass ==0)
141: chpass = "012p";
142: if (chpass && npassname==0)
143: npassname = "/usr/new";
144: if (chpass)
145: for (t=chpass; *t; t++) {
146: switch (*t) {
147:
148: case '0':
149: ccom = strspl(npassname, "comp");
150: continue;
151: case '2':
152: c2 = strspl(npassname, "optim");
153: continue;
154: case 'p':
155: cpp = strspl(npassname, "cpp");
156: continue;
157: }
158: }
159: if (proflag)
160: printf("3cc: no profiling option\n");
161: if (nc==0)
162: goto nocom;
163: if (signal(SIGINT, SIG_IGN) != SIG_IGN)
164: signal(SIGINT, idexit);
165: if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
166: signal(SIGTERM, idexit);
167: if (pflag==0)
168: sprintf(tmp0, "/tmp/ctm%05.5d", getpid());
169: tmp1 = strspl(tmp0, "1");
170: tmp2 = strspl(tmp0, "2");
171: tmp3 = strspl(tmp0, "3");
172: if (pflag==0)
173: tmp4 = strspl(tmp0, "4");
174: if (oflag)
175: tmp5 = strspl(tmp0, "5");
176: for (i=0; i<nc; i++) {
177: int suffix = getsuf(clist[i]);
178: if (nc > 1) {
179: printf("%s:\n", clist[i]);
180: fflush(stdout);
181: }
182: if (suffix == 's') {
183: assource = clist[i];
184: goto assemble;
185: } else
186: assource = tmp3;
187: if (suffix == 'i')
188: goto compile;
189: if (pflag)
190: tmp4 = setsuf(clist[i], 'i');
191: na=0;
192: av[na++] = "cpp";
193: av[na++] = "-Uvax";
194: av[na++] = "-Usun";
195: av[na++] = "-Usun2";
196: av[na++] = "-Usun3";
197: av[na++] = "-Umc68000";
198: av[na++] = "-Umc68010";
199: av[na++] = "-Umc68020";
200: av[na++] = "-Dm32";
201: if(mflag)
202: av[na++] = "-DMUX";
203: for (j = 0; j < np; j++)
204: av[na++] = plist[j];
205: av[na++] = "-I/usr/jerq/include";
206: av[na++] = clist[i];
207: av[na++] = exflag ? "-" : tmp4;
208: av[na++] = 0;
209: switch(callsys(cpp, av)){
210: case 0:
211: break;
212: #define CLASS 27
213: case CLASS:
214: if(callsys("/lib/cpre", av)==0)
215: break;
216: /* fall through */
217: default:
218: exfail++;
219: eflag++;
220: }
221: if (pflag || exfail) {
222: cflag++;
223: continue;
224: }
225: compile:
226: if (sflag)
227: assource = tmp3 = setsuf(clist[i], 's');
228: av[0] = "3comp";
229: av[1] = "-i";
230: av[2] = suffix=='i'? clist[i]: tmp4;
231: av[3] = "-o";
232: av[4] = oflag? tmp5 : tmp3;
233: av[5] = "-f";
234: av[6] = clist[i];
235: if(gflag)
236: na = 7;
237: else{
238: av[7] = "-ds";
239: av[8] = "-dl";
240: na = 9;
241: }
242: av[na] = 0;
243: if (callsys(ccom, av)) {
244: cflag++;
245: eflag++;
246: continue;
247: }
248: if (oflag) {
249: av[0] = "3optim";
250: av[1] = "-I";
251: av[2] = tmp5;
252: av[3] = "-O";
253: av[4] = tmp3;
254: av[5] = 0;
255: if (callsys(c2, av)) {
256: unlink(tmp3);
257: tmp3 = assource = tmp5;
258: } else
259: unlink(tmp5);
260: }
261: if (sflag)
262: continue;
263: assemble:
264: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
265: av[0] = "3as";
266: na = 1;
267: if(!gflag)
268: av[na++] = "-dl";
269: av[na++] = "-o"; av[na++] = setsuf(clist[i], 'o');
270: if (Rflag)
271: av[na++] = "-R";
272: av[na++] = assource;
273: av[na] = 0;
274: if (callsys(as, av) > 1) {
275: cflag++;
276: eflag++;
277: continue;
278: }
279: }
280: nocom:
281: if (cflag==0 && nl!=0) {
282: i = 0;
283: av[0] = "3ld"; na=1;
284: av[na++] = "-o";
285: av[na++] = outfile? outfile : "a.out";
286: av[na++] = "-L/usr/jerq/lib";
287: if (jflag)
288: av[na++] = "/usr/jerq/lib/rom.o";
289: av[na++] = ifile;
290: while (i < nl)
291: av[na++] = llist[i++];
292: if(mflag){
293: av[na++] = "-r";
294: av[na++] = "-a";
295: }
296: if(mflag)
297: av[na++] = "-lmj";
298: if(jflag){
299: av[na++] = "-lj";
300: av[na++] = "-lsys";
301: }
302: av[na++] = "-lj";
303: av[na++] = "-lc";
304: av[na++] = 0;
305: eflag |= callsys(ld, av);
306: if (nc==1 && nxo==1 && eflag==0)
307: unlink(setsuf(clist[0], 'o'));
308: if(!eflag && mflag){
309: int f=open(outfile? outfile : "a.out", 1);
310: short m=0x5620;
311: if(f==-1 || lseek(f, 22, 0)==-1 || write(f, &m, 2)!=2)
312: error("can't write magic number in %s",
313: outfile? outfile : "a.out");
314: else
315: close(f);
316: }
317: }
318: dexit();
319: }
320:
321: idexit()
322: {
323:
324: eflag = 100;
325: dexit();
326: }
327:
328: dexit()
329: {
330:
331: if (!pflag) {
332: cunlink(tmp1);
333: cunlink(tmp2);
334: if (sflag==0)
335: cunlink(tmp3);
336: cunlink(tmp4);
337: cunlink(tmp5);
338: }
339: exit(eflag);
340: }
341:
342: error(s, x)
343: char *s, *x;
344: {
345: FILE *diag = exflag ? stderr : stdout;
346:
347: fprintf(diag, "3cc: ");
348: fprintf(diag, s, x);
349: putc('\n', diag);
350: exfail++;
351: cflag++;
352: eflag++;
353: }
354:
355: getsuf(as)
356: char as[];
357: {
358: register int c;
359: register char *s;
360: register int t;
361:
362: s = as;
363: c = 0;
364: while (t = *s++)
365: if (t=='/')
366: c = 0;
367: else
368: c++;
369: s -= 3;
370: if (c <= DIRSIZ && c > 2 && *s++ == '.')
371: return (*s);
372: return (0);
373: }
374:
375: char *
376: setsuf(as, ch)
377: char *as;
378: {
379: register char *s, *s1;
380:
381: s = s1 = savestr(as);
382: while (*s)
383: if (*s++ == '/')
384: s1 = s;
385: s[-1] = ch;
386: return (s1);
387: }
388:
389: callsys(f, v)
390: char *f, **v;
391: {
392: int t, status;
393:
394: if(dont){
395: printf("3cc: (%s)", f);
396: while(*v)
397: printf(" %s", *v++);
398: printf("\n");
399: return 0;
400: }
401: t = fork();
402: if (t == -1) {
403: printf("No more processes\n");
404: return (100);
405: }
406: if (t == 0) {
407: execv(f, v);
408: printf("Can't find %s\n", f);
409: fflush(stdout);
410: _exit(100);
411: }
412: while (t != wait(&status))
413: ;
414: if ((t=(status&0377)) != 0 && t!=14) {
415: if (t!=2) {
416: printf("Fatal error in %s\n", f);
417: eflag = 8;
418: }
419: dexit();
420: }
421: return ((status>>8) & 0377);
422: }
423:
424: nodup(l, os)
425: char **l, *os;
426: {
427: register char *t, *s;
428: register int c;
429:
430: s = os;
431: if (getsuf(s) != 'o')
432: return (1);
433: while (t = *l++) {
434: while (c = *s++)
435: if (c != *t++)
436: break;
437: if (*t==0 && c==0)
438: return (0);
439: s = os;
440: }
441: return (1);
442: }
443:
444: #define NSAVETAB 1024
445: char *savetab;
446: int saveleft;
447:
448: char *
449: savestr(cp)
450: register char *cp;
451: {
452: register int len;
453:
454: len = strlen(cp) + 1;
455: if (len > saveleft) {
456: saveleft = NSAVETAB;
457: if (len > saveleft)
458: saveleft = len;
459: savetab = (char *)malloc(saveleft);
460: if (savetab == 0) {
461: fprintf(stderr, "ran out of memory (savestr)\n");
462: exit(1);
463: }
464: }
465: strncpy(savetab, cp, len);
466: cp = savetab;
467: savetab += len;
468: saveleft -= len;
469: return (cp);
470: }
471:
472: char *
473: strspl(left, right)
474: char *left, *right;
475: {
476: char buf[BUFSIZ];
477:
478: strcpy(buf, left);
479: strcat(buf, right);
480: return (savestr(buf));
481: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.