+static char *sccsid = "@(#)test.c 4.1 (Berkeley) %G%";
+/*
+ * test expression
+ * [ expression ]
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))
+
+#define DIR 1
+#define FIL 2
+int ap;
+int ac;
+char **av;
+char *tmp;
+
+main(argc, argv)
+char *argv[];
+{
+
+ ac = argc; av = argv; ap = 1;
+ if(EQ(argv[0],"[")) {
+ if(!EQ(argv[--ac],"]"))
+ synbad("] missing","");
+ }
+ argv[ac] = 0;
+ if (ac<=1) exit(1);
+ exit(exp()?0:1);
+}
+
+char *nxtarg(mt) {
+
+ if (ap>=ac) {
+ if(mt) {
+ ap++;
+ return(0);
+ }
+ synbad("argument expected","");
+ }
+ return(av[ap++]);
+}
+
+exp() {
+ int p1;
+
+ p1 = e1();
+ if (EQ(nxtarg(1), "-o")) return(p1 | exp());
+ ap--;
+ return(p1);
+}
+
+e1() {
+ int p1;
+
+ p1 = e2();
+ if (EQ(nxtarg(1), "-a")) return (p1 & e1());
+ ap--;
+ return(p1);
+}
+
+e2() {
+ if (EQ(nxtarg(0), "!"))
+ return(!e3());
+ ap--;
+ return(e3());
+}
+
+e3() {
+ int p1;
+ register char *a;
+ char *p2;
+ int int1, int2;
+
+ a=nxtarg(0);
+ if(EQ(a, "(")) {
+ p1 = exp();
+ if(!EQ(nxtarg(0), ")")) synbad(") expected","");
+ return(p1);
+ }
+
+ if(EQ(a, "-r"))
+ return(tio(nxtarg(0), 0));
+
+ if(EQ(a, "-w"))
+ return(tio(nxtarg(0), 1));
+
+ if(EQ(a, "-d"))
+ return(ftype(nxtarg(0))==DIR);
+
+ if(EQ(a, "-f"))
+ return(ftype(nxtarg(0))==FIL);
+
+ if(EQ(a, "-s"))
+ return(fsizep(nxtarg(0)));
+
+ if(EQ(a, "-t"))
+ if(ap>=ac)
+ return(isatty(1));
+ else
+ return(isatty(atoi(nxtarg(0))));
+
+ if(EQ(a, "-n"))
+ return(!EQ(nxtarg(0), ""));
+ if(EQ(a, "-z"))
+ return(EQ(nxtarg(0), ""));
+
+ p2 = nxtarg(1);
+ if (p2==0)
+ return(!EQ(a,""));
+ if(EQ(p2, "="))
+ return(EQ(nxtarg(0), a));
+
+ if(EQ(p2, "!="))
+ return(!EQ(nxtarg(0), a));
+
+ if(EQ(a, "-l")) {
+ int1=length(p2);
+ p2=nxtarg(0);
+ } else{ int1=atoi(a);
+ }
+ int2 = atoi(nxtarg(0));
+ if(EQ(p2, "-eq"))
+ return(int1==int2);
+ if(EQ(p2, "-ne"))
+ return(int1!=int2);
+ if(EQ(p2, "-gt"))
+ return(int1>int2);
+ if(EQ(p2, "-lt"))
+ return(int1<int2);
+ if(EQ(p2, "-ge"))
+ return(int1>=int2);
+ if(EQ(p2, "-le"))
+ return(int1<=int2);
+
+ synbad("unknown operator ",p2);
+}
+
+tio(a, f)
+char *a;
+int f;
+{
+
+ f = open(a, f);
+ if (f>=0) {
+ close(f);
+ return(1);
+ }
+ return(0);
+}
+
+ftype(f)
+char *f;
+{
+ struct stat statb;
+
+ if(stat(f,&statb)<0)
+ return(0);
+ if((statb.st_mode&S_IFMT)==S_IFDIR)
+ return(DIR);
+ return(FIL);
+}
+
+fsizep(f)
+char *f;
+{
+ struct stat statb;
+ if(stat(f,&statb)<0)
+ return(0);
+ return(statb.st_size>0);
+}
+
+synbad(s1,s2)
+char *s1, *s2;
+{
+ write(2, "test: ", 6);
+ write(2, s1, strlen(s1));
+ write(2, s2, strlen(s2));
+ write(2, "\n", 1);
+ exit(255);
+}
+
+length(s)
+ char *s;
+{
+ char *es=s;
+ while(*es++);
+ return(es-s-1);
+}