Annotation of 3BSD/cmd/test.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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