Annotation of researchv10no/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(islink(nxtarg(0)));
                    100: 
                    101:        if(EQ(a, "-f"))
                    102:                return(ftype(nxtarg(0),S_IFREG));
                    103: 
                    104:        if(EQ(a, "-e"))
                    105:                return(access(nxtarg(0),0) >= 0);
                    106: 
                    107:        if(EQ(a, "-u"))
                    108:                return(ftype(nxtarg(0),S_ISUID));
                    109: 
                    110:        if(EQ(a, "-g"))
                    111:                return(ftype(nxtarg(0),S_ISGID));
                    112: 
                    113:        if(EQ(a, "-s"))
                    114:                return(fsizep(nxtarg(0)));
                    115: 
                    116:        if(EQ(a, "-t"))
                    117:                if(ap>=ac)
                    118:                        return(isatty(1));
                    119:                else
                    120:                        return(isatty(atoi(nxtarg(0))));
                    121: 
                    122:        if(EQ(a, "-n"))
                    123:                return(!EQ(nxtarg(0), ""));
                    124:        if(EQ(a, "-z"))
                    125:                return(EQ(nxtarg(0), ""));
                    126:        if(EQ(a, "-S"))
                    127:                return(geteuid() == 0);
                    128: 
                    129:        p2 = nxtarg(1);
                    130:        if (p2==0)
                    131:                return(!EQ(a,""));
                    132:        if(EQ(p2, "="))
                    133:                return(EQ(nxtarg(0), a));
                    134: 
                    135:        if(EQ(p2, "!="))
                    136:                return(!EQ(nxtarg(0), a));
                    137: 
                    138:        if(EQ(a, "-l")) {
                    139:                int1=length(p2);
                    140:                p2=nxtarg(0);
                    141:        } else{ int1=atoi(a);
                    142:        }
                    143:        int2 = atoi(nxtarg(0));
                    144:        if(EQ(p2, "-eq"))
                    145:                return(int1==int2);
                    146:        if(EQ(p2, "-ne"))
                    147:                return(int1!=int2);
                    148:        if(EQ(p2, "-gt"))
                    149:                return(int1>int2);
                    150:        if(EQ(p2, "-lt"))
                    151:                return(int1<int2);
                    152:        if(EQ(p2, "-ge"))
                    153:                return(int1>=int2);
                    154:        if(EQ(p2, "-le"))
                    155:                return(int1<=int2);
                    156: 
                    157:        synbad("unknown operator ",p2);
                    158: }
                    159: 
                    160: tio(a, f)
                    161: char *a;
                    162: int f;
                    163: {
                    164: 
                    165:        return access (a, f) >= 0;
                    166: }
                    167: 
                    168: ftype(f, field)
                    169: char *f;
                    170: int field;
                    171: {
                    172:        struct stat statb;
                    173: 
                    174:        if(stat(f,&statb)<0)
                    175:                return(0);
                    176:        if((statb.st_mode&S_IFMT)==field)
                    177:                return(1);
                    178:        return(0);
                    179: }
                    180: 
                    181: islink(f)
                    182: char *f;
                    183: {
                    184:        struct stat statb;
                    185:        if(lstat(f,&statb)<0)
                    186:                return 0;
                    187:        return((statb.st_mode&S_IFMT)==S_IFLNK);
                    188: }
                    189: 
                    190: fsizep(f)
                    191: char *f;
                    192: {
                    193:        struct stat statb;
                    194:        if(stat(f,&statb)<0)
                    195:                return(0);
                    196:        return(statb.st_size>0);
                    197: }
                    198: 
                    199: synbad(s1,s2)
                    200: char *s1, *s2;
                    201: {
                    202:        int len;
                    203: 
                    204:        write(2, "test: ", 6);
                    205:        if ((len = strlen(s1)) != 0)
                    206:                write(2, s1, len);
                    207:        if ((len = strlen(s2)) != 0)
                    208:                write(2, s2, len);
                    209:        write(2, "\n", 1);
                    210:        exit(255);
                    211: }
                    212: 
                    213: length(s)
                    214:        char *s;
                    215: {
                    216:        char *es=s;
                    217:        while(*es++);
                    218:        return(es-s-1);
                    219: }

unix.superglobalmegacorp.com

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