1*b2ed49a5SDavid van Moolenbroek /* evaluate.h (C) 2000-2002 Kyzer/CSG. */ 2*b2ed49a5SDavid van Moolenbroek /* Released under the terms of the GNU General Public Licence version 2. */ 3*b2ed49a5SDavid van Moolenbroek /* http://www.kyzer.me.uk/code/evaluate/ */ 4*b2ed49a5SDavid van Moolenbroek 5*b2ed49a5SDavid van Moolenbroek #include <stddef.h> 6*b2ed49a5SDavid van Moolenbroek #include <stdlib.h> 7*b2ed49a5SDavid van Moolenbroek 8*b2ed49a5SDavid van Moolenbroek #define T_INT 0 9*b2ed49a5SDavid van Moolenbroek #define T_REAL 1 10*b2ed49a5SDavid van Moolenbroek 11*b2ed49a5SDavid van Moolenbroek /* value */ 12*b2ed49a5SDavid van Moolenbroek struct val { 13*b2ed49a5SDavid van Moolenbroek long ival; /* if type = T_INT, this is the result */ 14*b2ed49a5SDavid van Moolenbroek double rval; /* if type = T_REAL, this is the result */ 15*b2ed49a5SDavid van Moolenbroek char type; /* either T_INT or T_REAL */ 16*b2ed49a5SDavid van Moolenbroek }; 17*b2ed49a5SDavid van Moolenbroek 18*b2ed49a5SDavid van Moolenbroek /* variable */ 19*b2ed49a5SDavid van Moolenbroek struct var { 20*b2ed49a5SDavid van Moolenbroek struct var *next; /* next variable in table or NULL */ 21*b2ed49a5SDavid van Moolenbroek struct val val; /* value of variable */ 22*b2ed49a5SDavid van Moolenbroek char *name; /* name of variable */ 23*b2ed49a5SDavid van Moolenbroek }; 24*b2ed49a5SDavid van Moolenbroek 25*b2ed49a5SDavid van Moolenbroek /* variable table */ 26*b2ed49a5SDavid van Moolenbroek struct vartable { 27*b2ed49a5SDavid van Moolenbroek struct var *first; /* first entry in variable table */ 28*b2ed49a5SDavid van Moolenbroek struct memh *mh; 29*b2ed49a5SDavid van Moolenbroek }; 30*b2ed49a5SDavid van Moolenbroek 31*b2ed49a5SDavid van Moolenbroek /* creates a new variable table (NULL if no memory) */ 32*b2ed49a5SDavid van Moolenbroek struct vartable *create_vartable(void); 33*b2ed49a5SDavid van Moolenbroek 34*b2ed49a5SDavid van Moolenbroek /* frees a variable table */ 35*b2ed49a5SDavid van Moolenbroek void free_vartable(struct vartable *vt); 36*b2ed49a5SDavid van Moolenbroek 37*b2ed49a5SDavid van Moolenbroek /* gets a variable from a variable table (NULL if not found) */ 38*b2ed49a5SDavid van Moolenbroek struct var *get_var(struct vartable *vt, char *name); 39*b2ed49a5SDavid van Moolenbroek 40*b2ed49a5SDavid van Moolenbroek /* puts a variable into a variable table (NULL if no memory) */ 41*b2ed49a5SDavid van Moolenbroek struct var *put_var(struct vartable *vt, char *name, struct val *value); 42*b2ed49a5SDavid van Moolenbroek 43*b2ed49a5SDavid van Moolenbroek /* callbacks */ 44*b2ed49a5SDavid van Moolenbroek typedef struct val*(*get_var_cb_t)(char*, struct val*); 45*b2ed49a5SDavid van Moolenbroek typedef struct val*(*get_func_result_cb_t)(char*, struct val*, struct val*); 46*b2ed49a5SDavid van Moolenbroek void eval_set_cb_get_var(get_var_cb_t cb); 47*b2ed49a5SDavid van Moolenbroek void eval_set_cb_get_func_result(get_func_result_cb_t cb); 48*b2ed49a5SDavid van Moolenbroek 49*b2ed49a5SDavid van Moolenbroek /* THE FUNCTION YOU WANT TO CALL */ 50*b2ed49a5SDavid van Moolenbroek 51*b2ed49a5SDavid van Moolenbroek /* given a string to evaluate (not NULL), a result to put the answer in 52*b2ed49a5SDavid van Moolenbroek * (not NULL) and optionally your own variable table (NULL for 'internal 53*b2ed49a5SDavid van Moolenbroek * only' vartable), will return an error code (and result, etc) 54*b2ed49a5SDavid van Moolenbroek */ 55*b2ed49a5SDavid van Moolenbroek int evaluate(char *eval, struct val *result, struct vartable *variables); 56*b2ed49a5SDavid van Moolenbroek 57*b2ed49a5SDavid van Moolenbroek /* errors */ 58*b2ed49a5SDavid van Moolenbroek #define RESULT_OK 0 /* all OK */ 59*b2ed49a5SDavid van Moolenbroek #define ERROR_SYNTAX 2 /* invalid expression */ 60*b2ed49a5SDavid van Moolenbroek #define ERROR_VARNOTFOUND 3 /* variable not found */ 61*b2ed49a5SDavid van Moolenbroek #define ERROR_FUNCNOTFOUND 4 /* function not found */ 62*b2ed49a5SDavid van Moolenbroek #define ERROR_NOMEM 8 /* not enough memory available */ 63*b2ed49a5SDavid van Moolenbroek #define ERROR_DIV0 9 /* division by zero */ 64*b2ed49a5SDavid van Moolenbroek #define ERROR_BUSY 10 /* busy now */ 65*b2ed49a5SDavid van Moolenbroek 66*b2ed49a5SDavid van Moolenbroek /* configuration */ 67*b2ed49a5SDavid van Moolenbroek #define TOKEN_DEBUG 0 68*b2ed49a5SDavid van Moolenbroek #define EVAL_DEBUG 0 69*b2ed49a5SDavid van Moolenbroek #define EVAL_MALLOC 0 70*b2ed49a5SDavid van Moolenbroek #define USE_MATH_LIB 0 71*b2ed49a5SDavid van Moolenbroek #define MEM_DEBUG 0 72*b2ed49a5SDavid van Moolenbroek #define MEM_LOW_FOOTPRINT 1 73*b2ed49a5SDavid van Moolenbroek #define VAR_FROM_ENV 0 74*b2ed49a5SDavid van Moolenbroek 75