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