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)); 54