1*47846Sbostic /*-
2*47846Sbostic * Copyright (c) 1991 The Regents of the University of California.
3*47846Sbostic * All rights reserved.
4*47846Sbostic *
5*47846Sbostic * %sccs.include.proprietary.c%
6*47846Sbostic */
7*47846Sbostic
827970Sdonn #ifndef lint
9*47846Sbostic char copyright[] =
10*47846Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\
11*47846Sbostic All rights reserved.\n";
12*47846Sbostic #endif /* not lint */
1327970Sdonn
14*47846Sbostic #ifndef lint
15*47846Sbostic static char sccsid[] = "@(#)test.c 5.1 (Berkeley) 04/08/91";
16*47846Sbostic #endif /* not lint */
17*47846Sbostic
181125Sbill /*
191125Sbill * test expression
201125Sbill * [ expression ]
211125Sbill */
221125Sbill
231125Sbill #include <stdio.h>
241125Sbill #include <sys/types.h>
251125Sbill #include <sys/stat.h>
261125Sbill #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))
271125Sbill
281125Sbill #define DIR 1
291125Sbill #define FIL 2
301125Sbill int ap;
311125Sbill int ac;
321125Sbill char **av;
331125Sbill char *tmp;
3427970Sdonn char *nxtarg();
351125Sbill
main(argc,argv)361125Sbill main(argc, argv)
371125Sbill char *argv[];
381125Sbill {
3927970Sdonn int status;
401125Sbill
411125Sbill ac = argc; av = argv; ap = 1;
421125Sbill if(EQ(argv[0],"[")) {
431125Sbill if(!EQ(argv[--ac],"]"))
441125Sbill synbad("] missing","");
451125Sbill }
461125Sbill argv[ac] = 0;
471125Sbill if (ac<=1) exit(1);
4827970Sdonn status = (exp()?0:1);
4927970Sdonn if (nxtarg(1)!=0)
5027970Sdonn synbad("too many arguments","");
5127970Sdonn exit(status);
521125Sbill }
531125Sbill
nxtarg(mt)541125Sbill char *nxtarg(mt) {
551125Sbill
561125Sbill if (ap>=ac) {
571125Sbill if(mt) {
581125Sbill ap++;
591125Sbill return(0);
601125Sbill }
611125Sbill synbad("argument expected","");
621125Sbill }
631125Sbill return(av[ap++]);
641125Sbill }
651125Sbill
exp()661125Sbill exp() {
671125Sbill int p1;
681125Sbill
691125Sbill p1 = e1();
701125Sbill if (EQ(nxtarg(1), "-o")) return(p1 | exp());
711125Sbill ap--;
721125Sbill return(p1);
731125Sbill }
741125Sbill
e1()751125Sbill e1() {
761125Sbill int p1;
771125Sbill
781125Sbill p1 = e2();
791125Sbill if (EQ(nxtarg(1), "-a")) return (p1 & e1());
801125Sbill ap--;
811125Sbill return(p1);
821125Sbill }
831125Sbill
e2()841125Sbill e2() {
851125Sbill if (EQ(nxtarg(0), "!"))
861125Sbill return(!e3());
871125Sbill ap--;
881125Sbill return(e3());
891125Sbill }
901125Sbill
e3()911125Sbill e3() {
921125Sbill int p1;
931125Sbill register char *a;
941125Sbill char *p2;
9527970Sdonn int int1;
961125Sbill
971125Sbill a=nxtarg(0);
981125Sbill if(EQ(a, "(")) {
991125Sbill p1 = exp();
1001125Sbill if(!EQ(nxtarg(0), ")")) synbad(") expected","");
1011125Sbill return(p1);
1021125Sbill }
1031125Sbill
1041125Sbill if(EQ(a, "-r"))
1051125Sbill return(tio(nxtarg(0), 0));
1061125Sbill
1071125Sbill if(EQ(a, "-w"))
1081125Sbill return(tio(nxtarg(0), 1));
1091125Sbill
1101125Sbill if(EQ(a, "-d"))
1111125Sbill return(ftype(nxtarg(0))==DIR);
1121125Sbill
1131125Sbill if(EQ(a, "-f"))
1141125Sbill return(ftype(nxtarg(0))==FIL);
1151125Sbill
1161125Sbill if(EQ(a, "-s"))
1171125Sbill return(fsizep(nxtarg(0)));
1181125Sbill
1191125Sbill if(EQ(a, "-t"))
1201125Sbill if(ap>=ac)
1211125Sbill return(isatty(1));
1221125Sbill else
1231125Sbill return(isatty(atoi(nxtarg(0))));
1241125Sbill
1251125Sbill if(EQ(a, "-n"))
1261125Sbill return(!EQ(nxtarg(0), ""));
1271125Sbill if(EQ(a, "-z"))
1281125Sbill return(EQ(nxtarg(0), ""));
1291125Sbill
1301125Sbill p2 = nxtarg(1);
1311125Sbill if (p2==0)
1321125Sbill return(!EQ(a,""));
1331125Sbill if(EQ(p2, "="))
1341125Sbill return(EQ(nxtarg(0), a));
1351125Sbill
1361125Sbill if(EQ(p2, "!="))
1371125Sbill return(!EQ(nxtarg(0), a));
1381125Sbill
1391125Sbill if(EQ(a, "-l")) {
1401125Sbill int1=length(p2);
1411125Sbill p2=nxtarg(0);
1421125Sbill } else{ int1=atoi(a);
1431125Sbill }
1441125Sbill if(EQ(p2, "-eq"))
14527970Sdonn return(int1==atoi(nxtarg(0)));
1461125Sbill if(EQ(p2, "-ne"))
14727970Sdonn return(int1!=atoi(nxtarg(0)));
1481125Sbill if(EQ(p2, "-gt"))
14927970Sdonn return(int1>atoi(nxtarg(0)));
1501125Sbill if(EQ(p2, "-lt"))
15127970Sdonn return(int1<atoi(nxtarg(0)));
1521125Sbill if(EQ(p2, "-ge"))
15327970Sdonn return(int1>=atoi(nxtarg(0)));
1541125Sbill if(EQ(p2, "-le"))
15527970Sdonn return(int1<=atoi(nxtarg(0)));
1561125Sbill
15727970Sdonn --ap;
15827970Sdonn return(!EQ(a,""));
1591125Sbill }
1601125Sbill
tio(a,f)1611125Sbill tio(a, f)
1621125Sbill char *a;
1631125Sbill int f;
1641125Sbill {
1651125Sbill
1661125Sbill f = open(a, f);
1671125Sbill if (f>=0) {
16827970Sdonn (void) close(f);
1691125Sbill return(1);
1701125Sbill }
1711125Sbill return(0);
1721125Sbill }
1731125Sbill
ftype(f)1741125Sbill ftype(f)
1751125Sbill char *f;
1761125Sbill {
1771125Sbill struct stat statb;
1781125Sbill
1791125Sbill if(stat(f,&statb)<0)
1801125Sbill return(0);
1811125Sbill if((statb.st_mode&S_IFMT)==S_IFDIR)
1821125Sbill return(DIR);
1831125Sbill return(FIL);
1841125Sbill }
1851125Sbill
fsizep(f)1861125Sbill fsizep(f)
1871125Sbill char *f;
1881125Sbill {
1891125Sbill struct stat statb;
1901125Sbill if(stat(f,&statb)<0)
1911125Sbill return(0);
1921125Sbill return(statb.st_size>0);
1931125Sbill }
1941125Sbill
synbad(s1,s2)1951125Sbill synbad(s1,s2)
1961125Sbill char *s1, *s2;
1971125Sbill {
19827970Sdonn (void) write(2, "test: ", 6);
19927970Sdonn (void) write(2, s1, strlen(s1));
20027970Sdonn (void) write(2, s2, strlen(s2));
20127970Sdonn (void) write(2, "\n", 1);
2021125Sbill exit(255);
2031125Sbill }
2041125Sbill
length(s)2051125Sbill length(s)
2061125Sbill char *s;
2071125Sbill {
2081125Sbill char *es=s;
2091125Sbill while(*es++);
2101125Sbill return(es-s-1);
2111125Sbill }
212