|
|
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;
1.1.1.2 ! root 25: int gflag, Gflag, Pflag, Lflag, aflag;
1.1 root 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;
1.1.1.2 ! root 127: case 'a':
! 128: aflag++;
! 129: continue;
1.1 root 130: }
131: t = argv[i];
132: c = getsuf(t);
133: if (c=='c' || c=='s' || exflag) {
134: clist[nc++] = t;
135: t = setsuf(t, 'o');
136: }
137: if (nodup(llist, t)) {
138: llist[nl++] = t;
139: if (getsuf(t)=='o')
140: nxo++;
141: }
142: }
143: if (gflag || Gflag) {
144: if (oflag)
145: fprintf(stderr, "cc: warning: -g and -L disable -O\n");
146: oflag = 0;
147: }
148: if (npassname && chpass ==0)
149: chpass = "012p";
150: if (chpass && npassname==0)
151: npassname = "/usr/new";
152: if (chpass)
153: for (t=chpass; *t; t++) {
154: switch (*t) {
155:
156: case '0':
157: ccom = strspl(npassname, "ccom");
158: continue;
159: case '2':
160: c2 = strspl(npassname, "c2");
161: continue;
162: case 'p':
163: cpp = strspl(npassname, "cpp");
164: continue;
165: }
166: }
167: if (nc==0)
168: goto nocom;
169: if (signal(SIGINT, SIG_IGN) != SIG_IGN)
170: signal(SIGINT, idexit);
171: if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
172: signal(SIGTERM, idexit);
173: if (pflag==0)
174: sprintf(tmp0, "/tmp/cct%05.5d", getpid());
175: tmp1 = strspl(tmp0, "1");
176: tmp2 = strspl(tmp0, "2");
177: tmp3 = strspl(tmp0, "3");
178: if (pflag==0)
179: tmp4 = strspl(tmp0, "4");
180: if (oflag || Lflag)
181: tmp5 = strspl(tmp0, "5");
182: for (i=0; i<nc; i++) {
183: if (nc > 1) {
184: printf("%s:\n", clist[i]);
185: fflush(stdout);
186: }
187: if (getsuf(clist[i]) == 's') {
188: assource = clist[i];
189: goto assemble;
190: } else
191: assource = tmp3;
192: if (pflag)
193: tmp4 = setsuf(clist[i], 'i');
194: av[0] = "cpp"; av[1] = clist[i]; av[2] = exflag ? "-" : tmp4;
195: na = 3;
196: for (j = 0; j < np; j++)
197: av[na++] = plist[j];
198: av[na++] = 0;
199: if (callsys(cpp, av)) {
200: exfail++;
201: eflag++;
202: }
203: if (pflag || exfail) {
204: cflag++;
205: continue;
206: }
207: if (sflag)
208: assource = tmp3 = setsuf(clist[i], 's');
209: av[0] = "ccom"; av[1] = tmp4;
210: av[2] = (oflag || Lflag)?tmp5:tmp3; na = 3;
211: if (proflag)
212: av[na++] = "-XP";
213: if (gflag) {
214: av[na++] = "-Xg";
215: } else if (Gflag) {
216: av[na++] = "-XG";
217: }
218: if (wflag)
219: av[na++] = "-w";
220: av[na] = 0;
221: if (callsys(ccom, av)) {
222: cflag++;
223: eflag++;
224: continue;
225: }
226: if (oflag) {
1.1.1.2 ! root 227: av[0] = "c2"; av[1] = tmp5; av[2] = tmp3;
! 228: na = 3;
! 229: if (aflag)
! 230: av[na++] = "-a";
! 231: av[na] = 0;
1.1 root 232: if (callsys(c2, av)) {
233: unlink(tmp3);
234: tmp3 = assource = tmp5;
235: } else
236: unlink(tmp5);
237: }
238: if (Lflag) {
239: av[0] = "alist"; av[1] = clist[i]; av[2] = tmp5;
240: av[3] = tmp3; av[4] = 0;
241: if (callsys(alist, av)) {
242: unlink(tmp3);
243: tmp3 = assource = tmp5;
244: } else
245: unlink(tmp5);
246: }
247: if (sflag)
248: continue;
249: assemble:
250: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
251: av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o');
252: na = 3;
253: if (Rflag)
254: av[na++] = "-R";
255: if (dflag)
256: av[na++] = dflag;
257: if (Pflag)
258: av[na++] = "-P";
259: av[na++] = assource;
260: av[na] = 0;
261: if (callsys(as, av) > 1) {
262: cflag++;
263: eflag++;
264: continue;
265: }
266: }
267: nocom:
268: if (cflag==0 && nl!=0) {
269: i = 0;
270: av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3;
271: if (outfile) {
272: av[na++] = "-o";
273: av[na++] = outfile;
274: }
275: while (i < nl)
276: av[na++] = llist[i++];
277: if (gflag || Gflag)
278: av[na++] = "-lg";
279: if (proflag)
280: av[na++] = "-lc_p";
281: else
282: av[na++] = "-lc";
283: av[na++] = 0;
284: eflag |= callsys(ld, av);
285: if (nc==1 && nxo==1 && eflag==0)
286: unlink(setsuf(clist[0], 'o'));
287: }
288: dexit();
289: }
290:
291: idexit()
292: {
293:
294: eflag = 100;
295: dexit();
296: }
297:
298: dexit()
299: {
300:
301: if (!pflag) {
302: cunlink(tmp1);
303: cunlink(tmp2);
304: if (sflag==0)
305: cunlink(tmp3);
306: cunlink(tmp4);
307: cunlink(tmp5);
308: }
309: exit(eflag);
310: }
311:
312: error(s, x)
313: char *s, *x;
314: {
315: FILE *diag = exflag ? stderr : stdout;
316:
317: fprintf(diag, "cc: ");
318: fprintf(diag, s, x);
319: putc('\n', diag);
320: exfail++;
321: cflag++;
322: eflag++;
323: }
324:
325: getsuf(as)
326: char as[];
327: {
328: register int c;
329: register char *s;
330: register int t;
331:
332: s = as;
333: c = 0;
334: while (t = *s++)
335: if (t=='/')
336: c = 0;
337: else
338: c++;
339: s -= 3;
340: if (c <= MAXNAMLEN && c > 2 && *s++ == '.')
341: return (*s);
342: return (0);
343: }
344:
345: char *
346: setsuf(as, ch)
347: char *as;
348: {
349: register char *s, *s1;
350:
351: s = s1 = savestr(as);
352: while (*s)
353: if (*s++ == '/')
354: s1 = s;
355: s[-1] = ch;
356: return (s1);
357: }
358:
359: callsys(f, v)
360: char *f, **v;
361: {
362: int t, status;
363:
364: t = vfork();
365: if (t == -1) {
366: printf("No more processes\n");
367: return (100);
368: }
369: if (t == 0) {
370: execv(f, v);
371: printf("Can't find %s\n", f);
372: fflush(stdout);
373: _exit(100);
374: }
375: while (t != wait(&status))
376: ;
377: if ((t=(status&0377)) != 0 && t!=14) {
378: if (t!=2) {
379: printf("Fatal error in %s\n", f);
380: eflag = 8;
381: }
382: dexit();
383: }
384: return ((status>>8) & 0377);
385: }
386:
387: nodup(l, os)
388: char **l, *os;
389: {
390: register char *t, *s;
391: register int c;
392:
393: s = os;
394: if (getsuf(s) != 'o')
395: return (1);
396: while (t = *l++) {
397: while (c = *s++)
398: if (c != *t++)
399: break;
400: if (*t==0 && c==0)
401: return (0);
402: s = os;
403: }
404: return (1);
405: }
406:
407: #define NSAVETAB 1024
408: char *savetab;
409: int saveleft;
410:
411: char *
412: savestr(cp)
413: register char *cp;
414: {
415: register int len;
416:
417: len = strlen(cp) + 1;
418: if (len > saveleft) {
419: saveleft = NSAVETAB;
420: if (len > saveleft)
421: saveleft = len;
422: savetab = (char *)malloc(saveleft);
423: if (savetab == 0) {
424: fprintf(stderr, "ran out of memory (savestr)\n");
425: exit(1);
426: }
427: }
428: strncpy(savetab, cp, len);
429: cp = savetab;
430: savetab += len;
431: saveleft -= len;
432: return (cp);
433: }
434:
435: char *
436: strspl(left, right)
437: char *left, *right;
438: {
439: char buf[BUFSIZ];
440:
441: strcpy(buf, left);
442: strcat(buf, right);
443: return (savestr(buf));
444: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.