xref: /csrg-svn/old/test/test.c (revision 47846)
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