xref: /csrg-svn/old/test/test.c (revision 27970)
1*27970Sdonn #ifndef lint
2*27970Sdonn static char *sccsid = "@(#)test.c	4.2 (Berkeley) 05/11/86";
3*27970Sdonn #endif
4*27970Sdonn 
51125Sbill /*
61125Sbill  *	test expression
71125Sbill  *	[ expression ]
81125Sbill  */
91125Sbill 
101125Sbill #include <stdio.h>
111125Sbill #include <sys/types.h>
121125Sbill #include <sys/stat.h>
131125Sbill #define EQ(a,b)	((tmp=a)==0?0:(strcmp(tmp,b)==0))
141125Sbill 
151125Sbill #define DIR 1
161125Sbill #define FIL 2
171125Sbill int	ap;
181125Sbill int	ac;
191125Sbill char	**av;
201125Sbill char	*tmp;
21*27970Sdonn char	*nxtarg();
221125Sbill 
231125Sbill main(argc, argv)
241125Sbill char *argv[];
251125Sbill {
26*27970Sdonn 	int status;
271125Sbill 
281125Sbill 	ac = argc; av = argv; ap = 1;
291125Sbill 	if(EQ(argv[0],"[")) {
301125Sbill 		if(!EQ(argv[--ac],"]"))
311125Sbill 			synbad("] missing","");
321125Sbill 	}
331125Sbill 	argv[ac] = 0;
341125Sbill 	if (ac<=1) exit(1);
35*27970Sdonn 	status = (exp()?0:1);
36*27970Sdonn 	if (nxtarg(1)!=0)
37*27970Sdonn 		synbad("too many arguments","");
38*27970Sdonn 	exit(status);
391125Sbill }
401125Sbill 
411125Sbill char *nxtarg(mt) {
421125Sbill 
431125Sbill 	if (ap>=ac) {
441125Sbill 		if(mt) {
451125Sbill 			ap++;
461125Sbill 			return(0);
471125Sbill 		}
481125Sbill 		synbad("argument expected","");
491125Sbill 	}
501125Sbill 	return(av[ap++]);
511125Sbill }
521125Sbill 
531125Sbill exp() {
541125Sbill 	int p1;
551125Sbill 
561125Sbill 	p1 = e1();
571125Sbill 	if (EQ(nxtarg(1), "-o")) return(p1 | exp());
581125Sbill 	ap--;
591125Sbill 	return(p1);
601125Sbill }
611125Sbill 
621125Sbill e1() {
631125Sbill 	int p1;
641125Sbill 
651125Sbill 	p1 = e2();
661125Sbill 	if (EQ(nxtarg(1), "-a")) return (p1 & e1());
671125Sbill 	ap--;
681125Sbill 	return(p1);
691125Sbill }
701125Sbill 
711125Sbill e2() {
721125Sbill 	if (EQ(nxtarg(0), "!"))
731125Sbill 		return(!e3());
741125Sbill 	ap--;
751125Sbill 	return(e3());
761125Sbill }
771125Sbill 
781125Sbill e3() {
791125Sbill 	int p1;
801125Sbill 	register char *a;
811125Sbill 	char *p2;
82*27970Sdonn 	int int1;
831125Sbill 
841125Sbill 	a=nxtarg(0);
851125Sbill 	if(EQ(a, "(")) {
861125Sbill 		p1 = exp();
871125Sbill 		if(!EQ(nxtarg(0), ")")) synbad(") expected","");
881125Sbill 		return(p1);
891125Sbill 	}
901125Sbill 
911125Sbill 	if(EQ(a, "-r"))
921125Sbill 		return(tio(nxtarg(0), 0));
931125Sbill 
941125Sbill 	if(EQ(a, "-w"))
951125Sbill 		return(tio(nxtarg(0), 1));
961125Sbill 
971125Sbill 	if(EQ(a, "-d"))
981125Sbill 		return(ftype(nxtarg(0))==DIR);
991125Sbill 
1001125Sbill 	if(EQ(a, "-f"))
1011125Sbill 		return(ftype(nxtarg(0))==FIL);
1021125Sbill 
1031125Sbill 	if(EQ(a, "-s"))
1041125Sbill 		return(fsizep(nxtarg(0)));
1051125Sbill 
1061125Sbill 	if(EQ(a, "-t"))
1071125Sbill 		if(ap>=ac)
1081125Sbill 			return(isatty(1));
1091125Sbill 		else
1101125Sbill 			return(isatty(atoi(nxtarg(0))));
1111125Sbill 
1121125Sbill 	if(EQ(a, "-n"))
1131125Sbill 		return(!EQ(nxtarg(0), ""));
1141125Sbill 	if(EQ(a, "-z"))
1151125Sbill 		return(EQ(nxtarg(0), ""));
1161125Sbill 
1171125Sbill 	p2 = nxtarg(1);
1181125Sbill 	if (p2==0)
1191125Sbill 		return(!EQ(a,""));
1201125Sbill 	if(EQ(p2, "="))
1211125Sbill 		return(EQ(nxtarg(0), a));
1221125Sbill 
1231125Sbill 	if(EQ(p2, "!="))
1241125Sbill 		return(!EQ(nxtarg(0), a));
1251125Sbill 
1261125Sbill 	if(EQ(a, "-l")) {
1271125Sbill 		int1=length(p2);
1281125Sbill 		p2=nxtarg(0);
1291125Sbill 	} else{	int1=atoi(a);
1301125Sbill 	}
1311125Sbill 	if(EQ(p2, "-eq"))
132*27970Sdonn 		return(int1==atoi(nxtarg(0)));
1331125Sbill 	if(EQ(p2, "-ne"))
134*27970Sdonn 		return(int1!=atoi(nxtarg(0)));
1351125Sbill 	if(EQ(p2, "-gt"))
136*27970Sdonn 		return(int1>atoi(nxtarg(0)));
1371125Sbill 	if(EQ(p2, "-lt"))
138*27970Sdonn 		return(int1<atoi(nxtarg(0)));
1391125Sbill 	if(EQ(p2, "-ge"))
140*27970Sdonn 		return(int1>=atoi(nxtarg(0)));
1411125Sbill 	if(EQ(p2, "-le"))
142*27970Sdonn 		return(int1<=atoi(nxtarg(0)));
1431125Sbill 
144*27970Sdonn 	--ap;
145*27970Sdonn 	return(!EQ(a,""));
1461125Sbill }
1471125Sbill 
1481125Sbill tio(a, f)
1491125Sbill char *a;
1501125Sbill int f;
1511125Sbill {
1521125Sbill 
1531125Sbill 	f = open(a, f);
1541125Sbill 	if (f>=0) {
155*27970Sdonn 		(void) close(f);
1561125Sbill 		return(1);
1571125Sbill 	}
1581125Sbill 	return(0);
1591125Sbill }
1601125Sbill 
1611125Sbill ftype(f)
1621125Sbill char *f;
1631125Sbill {
1641125Sbill 	struct stat statb;
1651125Sbill 
1661125Sbill 	if(stat(f,&statb)<0)
1671125Sbill 		return(0);
1681125Sbill 	if((statb.st_mode&S_IFMT)==S_IFDIR)
1691125Sbill 		return(DIR);
1701125Sbill 	return(FIL);
1711125Sbill }
1721125Sbill 
1731125Sbill fsizep(f)
1741125Sbill char *f;
1751125Sbill {
1761125Sbill 	struct stat statb;
1771125Sbill 	if(stat(f,&statb)<0)
1781125Sbill 		return(0);
1791125Sbill 	return(statb.st_size>0);
1801125Sbill }
1811125Sbill 
1821125Sbill synbad(s1,s2)
1831125Sbill char *s1, *s2;
1841125Sbill {
185*27970Sdonn 	(void) write(2, "test: ", 6);
186*27970Sdonn 	(void) write(2, s1, strlen(s1));
187*27970Sdonn 	(void) write(2, s2, strlen(s2));
188*27970Sdonn 	(void) write(2, "\n", 1);
1891125Sbill 	exit(255);
1901125Sbill }
1911125Sbill 
1921125Sbill length(s)
1931125Sbill 	char *s;
1941125Sbill {
1951125Sbill 	char *es=s;
1961125Sbill 	while(*es++);
1971125Sbill 	return(es-s-1);
1981125Sbill }
199