Annotation of 43BSDReno/bin/test/test.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.