147 lines
1.9 KiB
C
147 lines
1.9 KiB
C
/* if command */
|
|
|
|
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;
|
|
|
|
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,"}")));
|
|
return(ccode? 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;
|
|
}
|
|
|
|
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);
|
|
}
|