summaryrefslogtreecommitdiff
path: root/c_test.h
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2021-06-07 14:12:11 +0200
committerJohn Ankarström <john@ankarstrom.se>2021-06-07 14:12:11 +0200
commite2294b61e15781ca784a611e8ca7dabe132ebc6d (patch)
treec2a8cc44582534f52a76b1b8e64e6f83ffa501da /c_test.h
downloadksh-e2294b61e15781ca784a611e8ca7dabe132ebc6d.tar.gz
First commit (NetBSD 9.1)
Diffstat (limited to 'c_test.h')
-rw-r--r--c_test.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/c_test.h b/c_test.h
new file mode 100644
index 0000000..f1182f3
--- /dev/null
+++ b/c_test.h
@@ -0,0 +1,55 @@
+/* $NetBSD: c_test.h,v 1.3 2004/07/07 19:20:09 mycroft Exp $ */
+
+/* Various types of operations. Keeping things grouped nicely
+ * (unary,binary) makes switch() statements more efficient.
+ */
+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));