|
|
1.1 ! root 1: /* ! 2: * test expression ! 3: * [ expression ] ! 4: */ ! 5: ! 6: #include <stdio.h> ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0)) ! 10: ! 11: int ap; ! 12: int ac; ! 13: char **av; ! 14: char *tmp; ! 15: ! 16: main(argc, argv) ! 17: char *argv[]; ! 18: { ! 19: ! 20: ac = argc; av = argv; ap = 1; ! 21: if(EQ(argv[0],"[")) { ! 22: if(!EQ(argv[--ac],"]")) ! 23: synbad("] missing",""); ! 24: } ! 25: argv[ac] = 0; ! 26: if (ac<=1) exit(1); ! 27: exit(exp()?0:1); ! 28: } ! 29: ! 30: char *nxtarg(mt) { ! 31: ! 32: if (ap>=ac) { ! 33: if(mt) { ! 34: ap++; ! 35: return(0); ! 36: } ! 37: synbad("argument expected",""); ! 38: } ! 39: return(av[ap++]); ! 40: } ! 41: ! 42: exp() { ! 43: int p1; ! 44: ! 45: p1 = e1(); ! 46: if (EQ(nxtarg(1), "-o")) return(p1 | exp()); ! 47: ap--; ! 48: return(p1); ! 49: } ! 50: ! 51: e1() { ! 52: int p1; ! 53: ! 54: p1 = e2(); ! 55: if (EQ(nxtarg(1), "-a")) return (p1 & e1()); ! 56: ap--; ! 57: return(p1); ! 58: } ! 59: ! 60: e2() { ! 61: if (EQ(nxtarg(0), "!")) ! 62: return(!e3()); ! 63: ap--; ! 64: return(e3()); ! 65: } ! 66: ! 67: e3() { ! 68: int p1; ! 69: register char *a; ! 70: char *p2; ! 71: int int1, int2; ! 72: ! 73: a=nxtarg(0); ! 74: if(EQ(a, "(")) { ! 75: p1 = exp(); ! 76: if(!EQ(nxtarg(0), ")")) synbad(") expected",""); ! 77: return(p1); ! 78: } ! 79: ! 80: if(EQ(a, "-r")) ! 81: return(tio(nxtarg(0), 4)); ! 82: ! 83: if(EQ(a, "-w")) ! 84: return(tio(nxtarg(0), 2)); ! 85: ! 86: if(EQ(a, "-x")) ! 87: return(tio(nxtarg(0), 1)); ! 88: ! 89: if(EQ(a, "-d")) ! 90: return(ftype(nxtarg(0),S_IFDIR)); ! 91: ! 92: if(EQ(a, "-c")) ! 93: return(ftype(nxtarg(0),S_IFCHR)); ! 94: ! 95: if(EQ(a, "-b")) ! 96: return(ftype(nxtarg(0),S_IFBLK)); ! 97: ! 98: if(EQ(a, "-L")) ! 99: return(ftype(nxtarg(0),S_IFLNK)); ! 100: ! 101: if(EQ(a, "-f")) ! 102: return(ftype(nxtarg(0),S_IFREG)); ! 103: ! 104: if(EQ(a, "-u")) ! 105: return(ftype(nxtarg(0),S_ISUID)); ! 106: ! 107: if(EQ(a, "-g")) ! 108: return(ftype(nxtarg(0),S_ISGID)); ! 109: ! 110: if(EQ(a, "-s")) ! 111: return(fsizep(nxtarg(0))); ! 112: ! 113: if(EQ(a, "-t")) ! 114: if(ap>=ac) ! 115: return(isatty(1)); ! 116: else ! 117: return(isatty(atoi(nxtarg(0)))); ! 118: ! 119: if(EQ(a, "-n")) ! 120: return(!EQ(nxtarg(0), "")); ! 121: if(EQ(a, "-z")) ! 122: return(EQ(nxtarg(0), "")); ! 123: ! 124: p2 = nxtarg(1); ! 125: if (p2==0) ! 126: return(!EQ(a,"")); ! 127: if(EQ(p2, "=")) ! 128: return(EQ(nxtarg(0), a)); ! 129: ! 130: if(EQ(p2, "!=")) ! 131: return(!EQ(nxtarg(0), a)); ! 132: ! 133: if(EQ(a, "-l")) { ! 134: int1=length(p2); ! 135: p2=nxtarg(0); ! 136: } else{ int1=atoi(a); ! 137: } ! 138: int2 = atoi(nxtarg(0)); ! 139: if(EQ(p2, "-eq")) ! 140: return(int1==int2); ! 141: if(EQ(p2, "-ne")) ! 142: return(int1!=int2); ! 143: if(EQ(p2, "-gt")) ! 144: return(int1>int2); ! 145: if(EQ(p2, "-lt")) ! 146: return(int1<int2); ! 147: if(EQ(p2, "-ge")) ! 148: return(int1>=int2); ! 149: if(EQ(p2, "-le")) ! 150: return(int1<=int2); ! 151: ! 152: synbad("unknown operator ",p2); ! 153: } ! 154: ! 155: tio(a, f) ! 156: char *a; ! 157: int f; ! 158: { ! 159: ! 160: return access (a, f) >= 0; ! 161: } ! 162: ! 163: ftype(f, field) ! 164: char *f; ! 165: int field; ! 166: { ! 167: struct stat statb; ! 168: ! 169: if(stat(f,&statb)<0) ! 170: return(0); ! 171: if((statb.st_mode&S_IFMT)==field) ! 172: return(1); ! 173: return(0); ! 174: } ! 175: ! 176: fsizep(f) ! 177: char *f; ! 178: { ! 179: struct stat statb; ! 180: if(stat(f,&statb)<0) ! 181: return(0); ! 182: return(statb.st_size>0); ! 183: } ! 184: ! 185: synbad(s1,s2) ! 186: char *s1, *s2; ! 187: { ! 188: write(2, "test: ", 6); ! 189: write(2, s1, strlen(s1)); ! 190: write(2, s2, strlen(s2)); ! 191: write(2, "\n", 1); ! 192: exit(255); ! 193: } ! 194: ! 195: length(s) ! 196: char *s; ! 197: { ! 198: char *es=s; ! 199: while(*es++); ! 200: return(es-s-1); ! 201: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.