Interdata_v6/usr/source/c/cc.c
/* C command */
char *tmp0;
char *tmp1;
char *tmp2;
char *tmp3;
char *tmp4;
char *tmp5;
char *asm;
char ts[1000];
char *tsp ts;
char *av[50];
char *clist[50];
char *llist[50];
char *plist[50];
int pflag;
int sflag;
int cflag;
int oflag;
int proflag;
int mflag;
int vflag;
int exfail;
char *passp "/lib/cpp";
char *pass0 "/lib/c0";
char *pass1 "/lib/c1";
char *pass2 "/lib/c2";
char *pref "/lib/crt0.o";
char *ofile;
main(argc, argv)
char *argv[]; {
register char *t;
register i, j, c;
int nc, nl, np, f20, nxo;
int dexit();
i = nc = nl = np = f20 = nxo = 0;
while(++i < argc) {
if(*argv[i] == '-')
switch (argv[i][1]) {
default:
goto passa;
case 'S':
sflag++;
cflag++;
break;
case 'O':
oflag++;
break;
case 'p':
proflag++;
pref = "/lib/mcrt0.o";
break;
case 'm':
mflag++;
break;
case 'c':
cflag++;
break;
case '2':
if(argv[i][2] == '\0')
pref = "/lib/crt2.o";
else {
pref = "/lib/crt20.o";
f20 = 1;
}
break;
case 'T':
if (argv[i][2]=='p')
passp = "/usr/c/cpp";
if (argv[i][2]=='0')
pass0 = "/usr/c/c0";
if (argv[i][2]=='1')
pass1 = "/usr/c/c1";
if (argv[i][2]=='2')
pass2 = "/usr/c/c2";
break;
case 'v':
vflag++;
break;
/* change default output file */
case 'o':
if (argv[i][2])
ofile = &argv[i][2];
else if (i+1<argc && *argv[i+1]!='-')
ofile = argv[++i];
break;
/* Preprocessor flags */
case 'P':
pflag++;
cflag++;
plist[np++] = argv[i];
break;
case 'D':
case 'U':
case 'I':
if (argv[i][2])
plist[np++] = argv[i];
else if (i+1<argc && *argv[i+1]!='-') {
plist[np++] = cat(argv[i], argv[i+1]);
i++;
}
break;
}
else {
passa:
t = argv[i];
if((c=getsuf(t))=='c' || c=='s') {
clist[nc++] = t;
t = setsuf(t, 'o');
}
if (nodup(llist, t)) {
llist[nl++] = t;
if (getsuf(t)=='o')
nxo++;
}
}
}
if(nc==0)
goto nocom;
if (pflag==0) {
tmp0 = copy("/tmp/ctm0a");
while((c=open(tmp0, 0))>=0) {
close(c);
tmp0[9]++;
}
while((creat(tmp0, 0400))<0)
tmp0[9]++;
}
if ((signal(2, 1) & 01) == 0)
signal(2, &dexit);
(tmp1 = copy(tmp0))[8] = '1';
(tmp2 = copy(tmp0))[8] = '2';
(tmp3 = copy(tmp0))[8] = '3';
/***
if (oflag)
(tmp5 = copy(tmp0))[8] = '5';
***/
if (pflag==0)
(tmp4 = copy(tmp0))[8] = '4';
for (i=0; i<nc; i++) {
if (nc>1)
printf("%s:\n", clist[i]);
if (getsuf(clist[i]) == 's')
asm = clist[i];
else {
av[0] = "cpp";
for (j=1; j<=np; j++)
av[j] = plist[j-1];
av[j++] = clist[i];
if (pflag)
tmp4 = setsuf(clist[i], 'i');
av[j++] = tmp4;
av[j++] = 0;
exfail = callsys(passp, av);
if (pflag || exfail)
continue;
av[0] = "c0";
av[1] = tmp4;
av[2] = tmp1;
av[3] = tmp2;
j = 4;
if (proflag)
av[j++] = "-p";
if (mflag)
av[j++] = "-m";
av[j] = 0;
if (callsys(pass0, av)) {
cflag++;
continue;
}
av[0] = "c1";
av[1] = tmp1;
av[2] = tmp2;
if (sflag)
tmp3 = setsuf(clist[i], 's');
av[3] = tmp3;
/***
if (oflag)
av[3] = tmp5;
***/
av[4] = 0;
if(callsys(pass1, av)) {
cflag++;
continue;
}
/***
if (oflag) {
av[0] = "c2";
av[1] = tmp5;
av[2] = tmp3;
av[3] = 0;
callsys(pass2, av);
unlink(tmp5);
}
***/
asm = tmp3;
}
if (sflag)
continue;
cunlink(tmp1);
cunlink(tmp2);
cunlink(tmp4);
av[0] = "as";
j = 1;
av[j++] = "-o";
av[j++] = setsuf(clist[i], 'o');
av[j++] = asm;
av[j] = 0;
if (callsys("/bin/as", av))
cflag++;
cunlink(tmp3);
}
nocom:
if (cflag==0 && nl!=0) {
i = 0;
av[0] = "ld";
av[1] = "-x"; /* Throw away all local symbols for now */
j = 2;
if (ofile) {
av[j++] = "-o";
av[j++] = ofile;
}
av[j++] = pref;
while(i<nl)
av[j++] = llist[i++];
if(f20)
av[j++] = "-l2";
else {
av[j++] = "-lc";
av[j++] = "-l";
}
av[j++] = 0;
callsys("/bin/ld", av);
if (nc==1 && nxo==1)
cunlink(setsuf(clist[0], 'o'));
}
dexit();
}
dexit()
{
if (!pflag) {
cunlink(tmp1);
cunlink(tmp2);
if (sflag==0)
cunlink(tmp3);
cunlink(tmp4);
cunlink(tmp5);
cunlink(tmp0);
}
exit();
}
getsuf(as)
char as[];
{
register int c;
register char *s;
register int t;
s = as;
c = 0;
while(t = *s++)
if (t=='/')
c = 0;
else
c++;
s =- 3;
if (c<=14 && c>2 && *s++=='.')
return(*s);
return(0);
}
setsuf(as, ch)
char as[];
{
register char *s, *s1;
s = s1 = copy(as);
while(*s)
if (*s++ == '/')
s1 = s;
s[-1] = ch;
return(s1);
}
callsys(f, v)
char f[], *v[]; {
int t, status;
register char *p, *prog;
if (vflag) {
prog = f;
for (p = f; t = *p++; )
if (t == '/')
prog = p;
printf("-- %s\n", prog);
}
if ((t=fork())==0) {
execv(f, v);
printf("Can't find %s\n", f);
exit(1);
} else
if (t == -1) {
printf("Try again\n");
return(1);
}
while(t!=wait(&status));
if ((t=(status&0377)) != 0 && t!=14) {
if (t!=2) /* interrupt */
printf("Fatal error in %s\n", f);
dexit();
}
return((status>>8) & 0377);
}
copy(as)
char as[];
{
register char *otsp, *s;
otsp = tsp;
s = as;
while(*tsp++ = *s++);
return(otsp);
}
cat(s, t)
register char *s, *t;
{
register char *otsp;
otsp = tsp;
while (*tsp = *s++)
tsp++;
while (*tsp++ = *t++)
;
return(otsp);
}
nodup(l, os)
char **l, *os;
{
register char *t, *s;
register int c;
s = os;
if (getsuf(s) != 'o')
return(1);
while(t = *l++) {
while(c = *s++)
if (c != *t++)
break;
if (*t=='\0' && c=='\0')
return(0);
s = os;
}
return(1);
}
cunlink(f)
char *f;
{
if (f==0)
return(0);
return(unlink(f));
}