diff dmeval.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children 05eb24a608f0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmeval.h	Fri Sep 28 01:54:23 2012 +0300
@@ -0,0 +1,90 @@
+#ifndef DMEVAL_H
+#define DMEVAL_H
+
+#include "dmlib.h"
+
+
+typedef double DMValue;
+#define DMCONVTYPE (int)
+
+
+enum
+{
+    OP_NONE,
+
+    OP_ADD,
+    OP_SUB,
+    OP_MUL,
+    OP_DIV,
+    OP_MOD,
+
+    OP_LSHIFT,
+    OP_RSHIFT,
+
+    OP_AND,
+    OP_OR,
+    OP_XOR,
+    
+    OP_FUNC,
+    OP_VAR,
+    OP_SUBEXPR,
+    OP_CONST,
+
+    OP_NOPERS
+} DMOperType;
+
+enum
+{
+    ID_FUNC,
+    ID_VAR
+} DMEvalIdType;
+
+
+typedef struct
+{
+    char *name;
+    int type;
+    DMValue (*func)(DMValue);
+    DMValue *var;
+} DMEvalId;
+
+
+typedef struct DMEvalNode
+{
+    int op;
+    DMValue val;
+    DMEvalId *id;
+
+    struct DMEvalNode *subexpr, *next, *prev;
+} DMEvalNode;
+
+
+typedef struct
+{
+    BOOL err;
+    char *errStr;
+    
+    int nids;
+    DMEvalId *ids;
+
+    int mode, prev, expect;
+} DMEvalContext;
+
+
+DMEvalId *dm_eval_find_id(DMEvalContext *ev, const char *name);
+DMEvalId *dm_eval_add_var(DMEvalContext *ev, const char *name, DMValue *var);
+DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue));
+
+DMEvalContext *dm_eval_new(void);
+void dm_eval_close(DMEvalContext *ev);
+void dm_eval_free(DMEvalNode *node);
+void dm_eval_clear_err(DMEvalContext *ev);
+
+int dm_eval_parse_expr(DMEvalContext *ev, char *expr, DMEvalNode **result);
+int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result);
+int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult);
+
+void dm_print_optree(DMEvalContext *ev, DMEvalNode *node);
+
+
+#endif // DMEVAL_H