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