Add original unix v6
This commit is contained in:
+146
@@ -0,0 +1,146 @@
|
||||
/* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user