xref: /minix3/minix/lib/libmagicrt/include/magic_eval_lib.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
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