Mercurial > hg > dmlib
view dmeval.h @ 679:1dc7bd5f99f7
Moar work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 16 Apr 2013 15:13:37 +0300 |
parents | a25d30714cfe |
children | 4422a1880859 |
line wrap: on
line source
#ifndef DMEVAL_H #define DMEVAL_H #include "dmlib.h" typedef double DMValue; #define DMCONVTYPE (int) #define DM_MAX_ARGS 8 enum { // No-op OP_NONE, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT, OP_AND, OP_OR, OP_XOR, // Special ops OP_FUNC, OP_VAR, OP_SUBEXPR, OP_CONST, // Total number of operators OP_NOPERS } DMOperType; enum { ID_FUNC, ID_VAR, ID_CVAR, } DMEvalIdType; typedef struct { char *name; int type; int nargs; DMValue (*func)(DMValue arg[DM_MAX_ARGS]); DMValue *var, cvalue; } DMEvalId; typedef struct DMEvalNode { int op; DMValue val; DMEvalId *id; struct DMEvalNode *args[DM_MAX_ARGS]; 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_const(DMEvalContext *ev, const char *name, DMValue value); DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *), int nargs); 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 pass); int dm_eval_exec(DMEvalContext *ev, DMEvalNode *tree, DMValue *presult); void dm_print_optree(DMEvalContext *ev, DMEvalNode *node); #endif // DMEVAL_H