USG_PG3/usr/source/cmd2/if.c
#
/* if command */
/*
* status codes
*/
# define GOOD "0"
# define SOMEBAD "4"
# define ALLBAD "8"
int ap;
int ac;
char **av;
main(argc, argv)
char *argv[];
{
argv[argc] = 0;
ac = argc; av = argv; ap = 1;
if (argc<2) return;
if (exp())
if(doex(0)) {
write(1, "no command\n", 11);
seek(0, 0, 2);
}
}
char *nxtarg() {
if (ap>ac) return(0*ap++);
return(av[ap++]);
}
exp(s) {
int p1;
p1 = e1();
if (eq(nxtarg(), "-o")) return(p1 | exp());
ap--;
return(p1);
}
e1() {
int p1;
p1 = e2();
if (eq(nxtarg(), "-a")) return (p1 & e1());
ap--;
return(p1);
}
e2() {
if (eq(nxtarg(), "!"))
return(!e3());
ap--;
return(e3());
}
e3() {
int p1, ccode;
register char *a, *b;
char *getn();
ccode = 0;
if ((a=nxtarg())==0) goto err;
if(eq(a, "(")) {
p1 = exp();
if(!eq(nxtarg(), ")")) goto err;
return(p1);
}
if(eq(a, "-r"))
return(tio(nxtarg(), 0));
if(eq(a, "-w"))
return(tio(nxtarg(), 1));
if(eq(a, "-c"))
return(tcreat(nxtarg()));
if(eq(a, "{")) { /* execute a command for exit code */
if(fork()) /*parent*/ wait(&ccode);
else { /*child*/
doex(1);
goto err;
}
while((a=nxtarg()) && (!eq(a,"}")));
a=nxtarg();
if((eq(a,SOMEBAD)) || (eq(a,ALLBAD)) || (eq(a,GOOD)) ) {
return((ccode>>8)<=getn(a)? 1 : 0);
}
else
ap--;
return (ccode>>8 ? 0 : 1);
}
p1 = nxtarg();
if (p1==0) goto err;
if(eq(p1, "="))
return(eq(a, nxtarg()));
if(eq(p1, "!="))
return(!eq(a, nxtarg()));
err:
write(1, "if error\n", 9);
exit(9);
}
tio(a, f) {
a = open(a, f);
if (a>=0) {
close(a);
return(1);
}
return(0);
}
tcreat(a) {
return(1);
}
eq(a, b)
char *a, *b;
{
register int i;
i = 0;
l:
if(a[i] != b[i])
return(0);
if(a[i++] == '\0')
return(1);
goto l;
}
char *getn(bp)
char *bp;
{
register int n, c;
register char *p;
p = bp;
n = 0;
while ((c = *p++) >= '0' && c <= '9')
n = n*10 + c - '0';
return(n);
}
doex(earg) {
register int np, i, c;
char *nargv[50], *ncom, *na;
np = 0;
while (na=nxtarg()) {
if(earg && eq(na,"}")) break;
nargv[np++] = na;
}
if(earg && (!eq(na, "}"))) return(9);
nargv[np] = 0;
if (np==0) return(earg);
execv(nargv[0], nargv, np);
i = 0;
ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
while(c=nargv[0][i]) {
ncom[9+i++] = c;
}
ncom[9+i] = '\0';
execv(ncom+4, nargv, np);
execv(ncom, nargv, np);
return(1);
}