Annotation of researchv9/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: 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: }

unix.superglobalmegacorp.com

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