view 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 source

#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