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