xref: /plan9/sys/src/ape/cmd/pdksh/c_test.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /* Various types of operations.  Keeping things grouped nicely
2*7dd7cddfSDavid du Colombier  * (unary,binary) makes switch() statements more efficeint.
3*7dd7cddfSDavid du Colombier  */
4*7dd7cddfSDavid du Colombier enum Test_op {
5*7dd7cddfSDavid du Colombier 	TO_NONOP = 0,	/* non-operator */
6*7dd7cddfSDavid du Colombier 	/* unary operators */
7*7dd7cddfSDavid du Colombier 	TO_STNZE, TO_STZER, TO_OPTION,
8*7dd7cddfSDavid du Colombier 	TO_FILAXST,
9*7dd7cddfSDavid du Colombier 	TO_FILEXST,
10*7dd7cddfSDavid du Colombier 	TO_FILREG, TO_FILBDEV, TO_FILCDEV, TO_FILSYM, TO_FILFIFO, TO_FILSOCK,
11*7dd7cddfSDavid du Colombier 	TO_FILCDF, TO_FILID, TO_FILGID, TO_FILSETG, TO_FILSTCK, TO_FILUID,
12*7dd7cddfSDavid du Colombier 	TO_FILRD, TO_FILGZ, TO_FILTT, TO_FILSETU, TO_FILWR, TO_FILEX,
13*7dd7cddfSDavid du Colombier 	/* binary operators */
14*7dd7cddfSDavid du Colombier 	TO_STEQL, TO_STNEQ, TO_STLT, TO_STGT, TO_INTEQ, TO_INTNE, TO_INTGT,
15*7dd7cddfSDavid du Colombier 	TO_INTGE, TO_INTLT, TO_INTLE, TO_FILEQ, TO_FILNT, TO_FILOT
16*7dd7cddfSDavid du Colombier };
17*7dd7cddfSDavid du Colombier typedef enum Test_op Test_op;
18*7dd7cddfSDavid du Colombier 
19*7dd7cddfSDavid du Colombier /* Used by Test_env.isa() (order important - used to index *_tokens[] arrays) */
20*7dd7cddfSDavid du Colombier enum Test_meta {
21*7dd7cddfSDavid du Colombier 	TM_OR,		/* -o or || */
22*7dd7cddfSDavid du Colombier 	TM_AND,		/* -a or && */
23*7dd7cddfSDavid du Colombier 	TM_NOT,		/* ! */
24*7dd7cddfSDavid du Colombier 	TM_OPAREN,	/* ( */
25*7dd7cddfSDavid du Colombier 	TM_CPAREN,	/* ) */
26*7dd7cddfSDavid du Colombier 	TM_UNOP,	/* unary operator */
27*7dd7cddfSDavid du Colombier 	TM_BINOP,	/* binary operator */
28*7dd7cddfSDavid du Colombier 	TM_END		/* end of input */
29*7dd7cddfSDavid du Colombier };
30*7dd7cddfSDavid du Colombier typedef enum Test_meta Test_meta;
31*7dd7cddfSDavid du Colombier 
32*7dd7cddfSDavid du Colombier #define TEF_ERROR	BIT(0)		/* set if we've hit an error */
33*7dd7cddfSDavid du Colombier #define TEF_DBRACKET	BIT(1)		/* set if [[ .. ]] test */
34*7dd7cddfSDavid du Colombier 
35*7dd7cddfSDavid du Colombier typedef struct test_env Test_env;
36*7dd7cddfSDavid du Colombier struct test_env {
37*7dd7cddfSDavid du Colombier 	int	flags;		/* TEF_* */
38*7dd7cddfSDavid du Colombier 	union {
39*7dd7cddfSDavid du Colombier 		char	**wp;		/* used by ptest_* */
40*7dd7cddfSDavid du Colombier 		XPtrV	*av;		/* used by dbtestp_* */
41*7dd7cddfSDavid du Colombier 	} pos;
42*7dd7cddfSDavid du Colombier 	char **wp_end;			/* used by ptest_* */
43*7dd7cddfSDavid du Colombier 	int	(*isa) ARGS((Test_env *te, Test_meta meta));
44*7dd7cddfSDavid du Colombier 	const char *(*getopnd) ARGS((Test_env *te, Test_op op, int do_eval));
45*7dd7cddfSDavid du Colombier 	int	(*eval) ARGS((Test_env *te, Test_op op, const char *opnd1,
46*7dd7cddfSDavid du Colombier 				 const char *opnd2, int do_eval));
47*7dd7cddfSDavid du Colombier 	void	(*error) ARGS((Test_env *te, int offset, const char *msg));
48*7dd7cddfSDavid du Colombier };
49*7dd7cddfSDavid du Colombier 
50*7dd7cddfSDavid du Colombier Test_op	test_isop ARGS((Test_env *te, Test_meta meta, const char *s));
51*7dd7cddfSDavid du Colombier int     test_eval ARGS((Test_env *te, Test_op op, const char *opnd1,
52*7dd7cddfSDavid du Colombier 			const char *opnd2, int do_eval));
53*7dd7cddfSDavid du Colombier int	test_parse ARGS((Test_env *te));
54