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