home *** CD-ROM | disk | FTP | other *** search
- /* 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);
- }
-