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

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: }

unix.superglobalmegacorp.com

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