USG_PG3/usr/source/lil/lc.c
/* lc command */
char *tmp0;
char *tmp1;
char *tmp2;
char *tmp4;
char ts[1000];
char *tsp ts;
char *av[50];
char *clist[50];
char *llist[50];
int instring;
int pflag;
int cflag;
int *ibuf;
int *ibuf1;
int *ibuf2;
int *obuf;
char *lp;
char *line;
int lineno;
int exfail;
struct symtab {
char name[8];
char *value;
} *symtab;
int symsiz 200;
struct symtab *defloc;
struct symtab *incloc;
char *stringbuf;
char *pass0 "/usr/lib/lil1";
char *pass1 "/usr/lib/lil2";
char *pref "/lib/crt0.o";
main(argc, argv)
char *argv[]; {
char *t;
int nc, nl, i, j, c, f20;
int dexit();
i = nc = nl = f20 = 0;
while(++i < argc) {
if(*argv[i] == '-')
switch (argv[i][1]) {
case 'p':
pref = "/lib/mcrt0.o";
continue;
case 'P':
pflag++;
case 'c':
cflag++;
continue;
case '2':
if(argv[i][2] == '\0')
pref = "/lib/crt2.o";
else
pref = "/lib/crt20.o";
f20 = 1;
continue;
}
t = copy(argv[i]);
if(getsuf(t)=='l') {
clist[nc++] = t;
t = setsuf(copy(t), 'o');
}
if (nodup(llist, t))
llist[nl++] = t;
}
if (nc) {
if (pflag==0) {
tmp0 = copy("/tmp/ctm0a");
while((c=open(tmp0, 0))>=0) {
close(c);
tmp0[9]++;
}
while((creat(tmp0, 0666))<0)
tmp0[9]++;
}
signal(2, &dexit);
(tmp1 = copy(tmp0))[8] = '1';
(tmp2 = copy(tmp0))[8] = '2';
(tmp4 = copy(tmp0))[8] = '4';
for (i=0; i<nc; i++) {
if (nc>1)
printf("%s:\n", clist[i]);
av[0] = "l1";
if (pflag)
tmp4 = setsuf(copy(clist[i]), 'r');
av[1] = expand(clist[i]);
if (pflag || exfail)
continue;
if (av[1] == 0) {
cflag++;
continue;
}
av[2] = tmp1;
av[3] = tmp2;
av[4] = 0;
if (callsys(pass0, av)) {
cflag++;
continue;
}
av[0] = "l2";
av[1] = tmp1;
av[2] = tmp2;
av[3] = setsuf(clist[i], 'o');
av[4] = 0;
if(callsys(pass1, av)) {
cflag++;
continue;
}
cunlink(tmp1);
cunlink(tmp2);
cunlink(tmp4);
}
}
if (cflag==0 && nl!=0) {
i = 0;
av[0] = "ld";
av[1] = pref;
j = 2;
while(i<nl)
av[j++] = llist[i++];
if(f20) {
av[j++] = "-l2";
av[j++] = 0;
} else {
av[j++] = "/lib/libc.a";
av[j++] = "-l";
av[j++] = 0;
}
callsys("/bin/ld", av);
if (nc==1 && nl==1)
cunlink(llist[0]);
}
dexit();
}
dexit()
{
if (!pflag) {
cunlink(tmp1);
cunlink(tmp2);
cunlink(tmp4);
cunlink(tmp0);
}
exit();
}
expand(file)
char *file;
{
int ib1[259], ib2[259], ob[259];
struct symtab stab[200];
char ln[196], sbf[1024];
int c;
exfail = 0;
ibuf = ibuf1 = ib1;
ibuf2 = ib2;
if (fopen(file, ibuf1)<0)
return(file);
if (getc(ibuf1) != '#') {
close(ibuf1[0]);
return(file);
}
ibuf1[1]++;
ibuf1[2]--;
obuf = ob;
symtab = stab;
for (c=0; c<200; c++) {
stab[c].name[0] = '\0';
stab[c].value = 0;
}
defloc = lookup("define", 1);
defloc->value = defloc->name;
incloc = lookup("include", 1);
incloc->value = incloc->name;
stringbuf = sbf;
line = ln;
lineno = 0;
if (fcreat(tmp4, obuf) < 0) {
printf("Can't creat %s\n", tmp4);
dexit();
}
while(getline()) {
if (ibuf==ibuf2)
putc(001, obuf); /*SOH: insert */
if (ln[0] != '#')
for (lp=line; *lp!='\0'; lp++)
putc(*lp, obuf);
putc('\n', obuf);
}
fflush(obuf);
close(obuf[0]);
close(ibuf1[0]);
return(tmp4);
}
getline()
{
int c, sc, state;
struct symtab *np;
char *namep, *filname;
if (ibuf==ibuf1)
lineno++;
lp = line;
*lp = '\0';
state = 0;
if ((c=getch()) == '#')
state = 1;
while (c!='\n' && c!='\0') {
if ('a'<=c && c<='z' || 'A'<=c && c<='Z' || c=='_' || c=='.') {
namep = lp;
sch(c);
while ('a'<=(c=getch()) && c<='z'
||'A'<=c && c<='Z'
||'0'<=c && c<='9'
||c=='_' || c=='.')
sch(c);
sch('\0');
lp--;
np = lookup(namep, state);
if (state==1) {
if (np==defloc)
state = 2;
else if (np==incloc)
state = 3;
else {
error("Undefined control");
while (c!='\n' && c!='\0')
c = getch();
return(c);
}
} else if (state==2) {
np->value = stringbuf;
while ((c=getch())!='\n' && c!='\0')
savch(c);
savch('\0');
return(1);
}
continue;
} else if ((sc=c)=='\'') {
sch(sc);
filname = lp;
instring++;
while ((c=getch())!=sc && c!='\n' && c!='\0') {
sch(c);
if (c=='\\')
sch(getch());
}
instring = 0;
if (state==3) {
*lp = '\0';
while ((c=getch())!='\n' && c!='\0');
if (ibuf==ibuf2)
error("Nested 'include'");
if (fopen(filname, ibuf2)<0)
error("Missing file %s", filname);
else
ibuf = ibuf2;
return(c);
}
}
sch(c);
c = getch();
}
sch('\0');
if (state>1)
error("Control syntax");
return(c);
}
error(s, x)
{
printf("%d: ", lineno);
printf(s, x);
putchar('\n');
exfail++;
cflag++;
}
sch(c)
{
if (lp==line+194)
error("Line overflow");
*lp++ = c;
if (lp>line+195)
lp = line+195;
}
savch(c)
{
*stringbuf++ = c;
}
getch()
{
static peekc;
int c;
if (peekc) {
c = peekc;
peekc = 0;
return(c);
}
loop:
if ((c=getc1())=='/' && !instring) {
if ((peekc=getc1())!='*')
return('/');
peekc = 0;
for(;;) {
c = getc1();
cloop:
switch (c) {
case '\0':
return('\0');
case '*':
if ((c=getc1())=='/')
goto loop;
goto cloop;
case '\n':
if (ibuf==ibuf1) {
putc('\n', obuf);
lineno++;
}
continue;
}
}
}
return(c);
}
getc1()
{
int c;
if ((c = getc(ibuf)) < 0 && ibuf==ibuf2) {
close(ibuf2[0]);
ibuf = ibuf1;
putc('\n', obuf);
c = getc1();
}
if (c<0)
return(0);
return(c);
}
lookup(namep, enterf)
char *namep;
{
char *np, *snp;
struct symtab *sp;
int i, c;
np = namep;
i = 0;
while (c = *np++)
i =+ c;
i =% symsiz;
sp = &symtab[i];
while (sp->name[0]) {
snp = sp;
np = namep;
while (*snp++ == *np)
if (*np++ == '\0' || np==namep+8) {
if (!enterf)
subst(namep, sp);
return(sp);
}
if (sp++ > &symtab[symsiz])
sp = symtab;
}
if (enterf) {
for (i=0; i<8; i++)
if (sp->name[i] = *namep)
namep++;
while (*namep)
namep++;
}
return(sp);
}
subst(np, sp)
char *np;
struct symtab *sp;
{
char *vp;
lp = np;
if ((vp = sp->value) == 0)
return;
sch(' ');
while (*vp)
sch(*vp++);
sch(' ');
}
getsuf(s)
char s[];
{
int c;
char t, *os;
c = 0;
os = s;
while(t = *s++)
if (t=='/')
c = 0;
else
c++;
s =- 3;
if (c<=14 && c>2 && *s++=='.')
return(*s);
return(0);
}
setsuf(s, ch)
char s[];
{
char *os;
os = s;
while(*s++);
s[-2] = ch;
return(os);
}
callsys(f, v)
char f[], *v[]; {
int t, status;
if ((t=fork())==0) {
signal(2, 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(s)
char s[]; {
char *otsp;
otsp = tsp;
while(*tsp++ = *s++);
return(otsp);
}
nodup(l, s)
char **l, s[]; {
char *t, *os, c;
if (getsuf(s) != 'o')
return(1);
os = s;
while(t = *l++) {
s = os;
while(c = *s++)
if (c != *t++)
break;
if (*t++ == '\0')
return(0);
}
return(1);
}
cunlink(f)
char *f;
{
if (f==0)
return(0);
return(unlink(f));
}