|
|
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: if (oflag)
238: av[na++] = "-XO";
239: av[na] = 0;
240: if (callsys(ccom, av)) {
241: cflag++;
242: eflag++;
243: continue;
244: }
245: if (oflag || Cflag) {
246: av[0] = Cflag? "instrcnt": "c2";
247: av[1] = tmp5; av[2] = tmp3; av[3] = 0;
248: if (callsys(Cflag? instrcnt: c2, av)) {
249: unlink(tmp3);
250: tmp3 = assource = tmp5;
251: } else
252: unlink(tmp5);
253: }
254: if (sflag)
255: continue;
256: assemble:
257: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
258: av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o');
259: na = 3;
260: if (Rflag)
261: av[na++] = "-R";
262: if (dflag)
263: av[na++] = dflag;
264: av[na++] = assource;
265: av[na] = 0;
266: if (callsys(as, av)) {
267: cflag++;
268: eflag++;
269: continue;
270: }
271: }
272: nocom:
273: if (cflag==0 && nl!=0) {
274: i = 0;
275: av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3;
276: if (outfile) {
277: av[na++] = "-o";
278: av[na++] = outfile;
279: }
280: while (i < nl)
281: av[na++] = llist[i++];
282: if (gflag)
283: av[na++] = "-lsdb";
284: av[na++] = "-lc";
285: av[na++] = 0;
286: eflag |= callsys(ld, av);
287: if (nc==1 && nxo==1 && eflag==0)
288: unlink(setsuf(clist[0], 'o'));
289: }
290: dexit();
291: }
292:
293: idexit()
294: {
295:
296: eflag = 100;
297: dexit();
298: }
299:
300: dexit()
301: {
302:
303: if (!pflag) {
304: cunlink(tmp1);
305: cunlink(tmp2);
306: if (sflag==0)
307: cunlink(tmp3);
308: cunlink(tmp4);
309: cunlink(tmp5);
310: }
311: exit(eflag);
312: }
313:
314: error(s, x)
315: char *s, *x;
316: {
317: FILE *diag = exflag ? stderr : stdout;
318:
319: fprintf(diag, "cc: ");
320: fprintf(diag, s, x);
321: putc('\n', diag);
322: fflush(diag);
323: exfail++;
324: cflag++;
325: eflag++;
326: }
327:
328: getsuf(as)
329: char as[];
330: {
331: register int c;
332: register char *s;
333: register int t;
334:
335: s = as;
336: c = 0;
337: while (t = *s++)
338: if (t=='/')
339: c = 0;
340: else
341: c++;
342: s -= 3;
343: if (c <= DIRSIZ && c > 2 && *s++ == '.')
344: return (*s);
345: return (0);
346: }
347:
348: char *
349: setsuf(as, ch)
350: char *as;
351: {
352: register char *s, *s1;
353:
354: s = s1 = savestr(as);
355: while (*s)
356: if (*s++ == '/')
357: s1 = s;
358: s[-1] = ch;
359: return (s1);
360: }
361:
362: callsys(f, v)
363: char *f, **v;
364: {
365: int t, status;
366: register char **vp; /* god */
367:
368: if(vflag) { /* god & mjm */
369: vp = v;
370: fprintf(stderr,"+ ");
371: while (*vp)
372: fprintf(stderr,"%s ",*vp++);
373: fprintf(stderr, "\n");
374: fflush(stderr);
375: }
376:
377:
378: t = fork();
379: if (t == -1) {
380: printf("No more processes\n");
381: return (100);
382: }
383: if (t == 0) {
384: execv(f, v);
385: printf("Can't find %s\n", f);
386: fflush(stdout);
387: _exit(100);
388: }
389: while (t != wait(&status))
390: ;
391: if ((t=(status&0377)) != 0 && t!=14) {
392: if (t!=2) {
393: printf("Fatal error in %s\n", f);
394: eflag = 8;
395: }
396: dexit();
397: }
398: return ((status>>8) & 0377);
399: }
400:
401: nodup(l, os)
402: char **l, *os;
403: {
404: register char *t, *s;
405: register int c;
406:
407: s = os;
408: if (getsuf(s) != 'o')
409: return (1);
410: while (t = *l++) {
411: while (c = *s++)
412: if (c != *t++)
413: break;
414: if (*t==0 && c==0)
415: return (0);
416: s = os;
417: }
418: return (1);
419: }
420:
421: #define NSAVETAB 1024
422: char *savetab;
423: int saveleft;
424:
425: char *
426: savestr(cp)
427: register char *cp;
428: {
429: register int len;
430:
431: len = strlen(cp) + 1;
432: if (len > saveleft) {
433: saveleft = NSAVETAB;
434: if (len > saveleft)
435: saveleft = len;
436: savetab = (char *)malloc(saveleft);
437: if (savetab == 0) {
438: fprintf(stderr, "ran out of memory (savestr)\n");
439: exit(1);
440: }
441: }
442: strncpy(savetab, cp, len);
443: cp = savetab;
444: savetab += len;
445: saveleft -= len;
446: return (cp);
447: }
448:
449: char *
450: strspl(left, right)
451: char *left, *right;
452: {
453: char buf[BUFSIZ];
454:
455: strcpy(buf, left);
456: strcat(buf, right);
457: return (savestr(buf));
458: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.