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