diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/cmd/pdksh/c_test.h |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/pdksh/c_test.h')
-rwxr-xr-x | sys/src/ape/cmd/pdksh/c_test.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/pdksh/c_test.h b/sys/src/ape/cmd/pdksh/c_test.h new file mode 100755 index 000000000..951dd9abd --- /dev/null +++ b/sys/src/ape/cmd/pdksh/c_test.h @@ -0,0 +1,53 @@ +/* Various types of operations. Keeping things grouped nicely + * (unary,binary) makes switch() statements more efficeint. + */ +enum Test_op { + TO_NONOP = 0, /* non-operator */ + /* unary operators */ + TO_STNZE, TO_STZER, TO_OPTION, + TO_FILAXST, + TO_FILEXST, + TO_FILREG, TO_FILBDEV, TO_FILCDEV, TO_FILSYM, TO_FILFIFO, TO_FILSOCK, + TO_FILCDF, TO_FILID, TO_FILGID, TO_FILSETG, TO_FILSTCK, TO_FILUID, + TO_FILRD, TO_FILGZ, TO_FILTT, TO_FILSETU, TO_FILWR, TO_FILEX, + /* binary operators */ + TO_STEQL, TO_STNEQ, TO_STLT, TO_STGT, TO_INTEQ, TO_INTNE, TO_INTGT, + TO_INTGE, TO_INTLT, TO_INTLE, TO_FILEQ, TO_FILNT, TO_FILOT +}; +typedef enum Test_op Test_op; + +/* Used by Test_env.isa() (order important - used to index *_tokens[] arrays) */ +enum Test_meta { + TM_OR, /* -o or || */ + TM_AND, /* -a or && */ + TM_NOT, /* ! */ + TM_OPAREN, /* ( */ + TM_CPAREN, /* ) */ + TM_UNOP, /* unary operator */ + TM_BINOP, /* binary operator */ + TM_END /* end of input */ +}; +typedef enum Test_meta Test_meta; + +#define TEF_ERROR BIT(0) /* set if we've hit an error */ +#define TEF_DBRACKET BIT(1) /* set if [[ .. ]] test */ + +typedef struct test_env Test_env; +struct test_env { + int flags; /* TEF_* */ + union { + char **wp; /* used by ptest_* */ + XPtrV *av; /* used by dbtestp_* */ + } pos; + char **wp_end; /* used by ptest_* */ + int (*isa) ARGS((Test_env *te, Test_meta meta)); + const char *(*getopnd) ARGS((Test_env *te, Test_op op, int do_eval)); + int (*eval) ARGS((Test_env *te, Test_op op, const char *opnd1, + const char *opnd2, int do_eval)); + void (*error) ARGS((Test_env *te, int offset, const char *msg)); +}; + +Test_op test_isop ARGS((Test_env *te, Test_meta meta, const char *s)); +int test_eval ARGS((Test_env *te, Test_op op, const char *opnd1, + const char *opnd2, int do_eval)); +int test_parse ARGS((Test_env *te)); |