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