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