0
|
1 #ifndef DMEVAL_H
|
|
2 #define DMEVAL_H
|
|
3
|
|
4 #include "dmlib.h"
|
|
5
|
|
6
|
|
7 typedef double DMValue;
|
670
|
8 #define DMCONVTYPE (int)
|
|
9 #define DM_MAX_ARGS 8
|
0
|
10
|
|
11 enum
|
|
12 {
|
674
|
13 // No-op
|
0
|
14 OP_NONE,
|
|
15
|
|
16 OP_ADD,
|
|
17 OP_SUB,
|
|
18 OP_MUL,
|
|
19 OP_DIV,
|
|
20 OP_MOD,
|
|
21
|
|
22 OP_LSHIFT,
|
|
23 OP_RSHIFT,
|
|
24
|
|
25 OP_AND,
|
|
26 OP_OR,
|
|
27 OP_XOR,
|
|
28
|
674
|
29 // Special ops
|
0
|
30 OP_FUNC,
|
|
31 OP_VAR,
|
|
32 OP_SUBEXPR,
|
|
33 OP_CONST,
|
|
34
|
674
|
35 // Total number of operators
|
0
|
36 OP_NOPERS
|
|
37 } DMOperType;
|
|
38
|
685
|
39
|
0
|
40 enum
|
|
41 {
|
|
42 ID_FUNC,
|
670
|
43 ID_VAR,
|
|
44 ID_CVAR,
|
0
|
45 } DMEvalIdType;
|
|
46
|
|
47
|
|
48 typedef struct
|
|
49 {
|
|
50 char *name;
|
|
51 int type;
|
670
|
52 int nargs;
|
|
53 DMValue (*func)(DMValue arg[DM_MAX_ARGS]);
|
|
54 DMValue *var, cvalue;
|
0
|
55 } DMEvalId;
|
|
56
|
|
57
|
|
58 typedef struct DMEvalNode
|
|
59 {
|
|
60 int op;
|
|
61 DMValue val;
|
|
62 DMEvalId *id;
|
|
63
|
670
|
64 struct DMEvalNode *args[DM_MAX_ARGS];
|
0
|
65 struct DMEvalNode *subexpr, *next, *prev;
|
|
66 } DMEvalNode;
|
|
67
|
|
68
|
|
69 typedef struct
|
|
70 {
|
|
71 BOOL err;
|
|
72 char *errStr;
|
|
73
|
|
74 int nids;
|
|
75 DMEvalId *ids;
|
|
76
|
|
77 int mode, prev, expect;
|
|
78 } DMEvalContext;
|
|
79
|
|
80
|
|
81 DMEvalId *dm_eval_find_id(DMEvalContext *ev, const char *name);
|
|
82 DMEvalId *dm_eval_add_var(DMEvalContext *ev, const char *name, DMValue *var);
|
670
|
83 DMEvalId *dm_eval_add_const(DMEvalContext *ev, const char *name, DMValue value);
|
|
84 DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *), int nargs);
|
0
|
85
|
|
86 DMEvalContext *dm_eval_new(void);
|
|
87 void dm_eval_close(DMEvalContext *ev);
|
|
88 void dm_eval_free(DMEvalNode *node);
|
|
89 void dm_eval_clear_err(DMEvalContext *ev);
|
|
90
|
|
91 int dm_eval_parse_expr(DMEvalContext *ev, char *expr, DMEvalNode **result);
|
680
|
92 int dm_eval_reorder(DMEvalContext *ev, DMEvalNode *node, DMEvalNode **result);
|
0
|
93 int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult);
|
|
94
|
|
95 void dm_print_optree(DMEvalContext *ev, DMEvalNode *node);
|
|
96
|
|
97
|
|
98 #endif // DMEVAL_H
|