Mercurial > hg > dmlib
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