1 #include <magic_eval.h>
3 #include <magic_eval_lib.h>
5 #define DEBUG MAGIC_DEBUG_SET(0)
8 #define MAGIC_EVAL_PRINTF _magic_printf
10 #define MAGIC_EVAL_PRINTF magic_null_printf
13 PRIVATE
int magic_eval_print_style
= MAGIC_EVAL_PRINT_STYLE_DEFAULT
;
15 /*===========================================================================*
16 * magic_eval_get_var_cb *
17 *===========================================================================*/
18 PRIVATE
struct val
* magic_eval_get_var_cb(char* name
, struct val
* val
)
20 _magic_selement_t selement
;
27 struct _magic_dsentry dsentry_buff
;
28 MAGIC_EVAL_PRINTF("magic_eval_get_var_cb: %s requested\n", name
);
29 ret
= magic_selement_lookup_by_name(name
, &selement
, &dsentry_buff
);
34 switch(selement
.type
->type_id
) {
35 case MAGIC_TYPE_FLOAT
:
36 dvalue
= magic_selement_to_float(&selement
);
41 case MAGIC_TYPE_POINTER
:
42 pvalue
= magic_selement_to_ptr(&selement
);
43 val
->ival
= (long) pvalue
;
46 case MAGIC_TYPE_INTEGER
:
48 if(MAGIC_TYPE_FLAG(selement
.type
, MAGIC_TYPE_UNSIGNED
)) {
49 uvalue
= magic_selement_to_unsigned(&selement
);
50 val
->ival
= (long) uvalue
;
53 ivalue
= magic_selement_to_int(&selement
);
59 vvalue
= *((char*) selement
.address
);
60 val
->ival
= (long) vvalue
;
68 if(magic_eval_print_style
& MAGIC_EVAL_PRINT_VAR_VALUES
) {
69 if(val
->type
== T_INT
) {
70 _magic_printf("VAR: %s = %ld\n", name
, val
->ival
);
73 _magic_printf("VAR: %s = %g\n", name
, val
->rval
);
80 /*===========================================================================*
81 * magic_eval_get_func_result_cb *
82 *===========================================================================*/
83 PRIVATE
struct val
* magic_eval_get_func_result_cb(char* name
, struct val
* arg
,
86 struct _magic_function
*function
;
87 magic_eval_func_t magic_eval_func
;
89 MAGIC_EVAL_PRINTF("magic_eval_get_func_result_cb: %s requested\n", name
);
90 if(strncmp(MAGIC_EVAL_FUNC_PREFIX
, name
, strlen(MAGIC_EVAL_FUNC_PREFIX
))) {
94 function
= magic_function_lookup_by_name(NULL
, name
);
98 magic_eval_func
= (magic_eval_func_t
) (long) function
->address
;
99 iarg
= arg
->type
== T_INT
? arg
->ival
: (long) arg
->rval
;
100 result
= magic_eval_func(iarg
);
104 if(magic_eval_print_style
& MAGIC_EVAL_PRINT_FUNC_RESULTS
) {
105 _magic_printf("FUNCTION: %s(%ld) = %ld\n", name
, iarg
, result
);
111 /*===========================================================================*
113 *===========================================================================*/
114 PUBLIC
void magic_eval_init()
116 eval_set_cb_get_var(magic_eval_get_var_cb
);
117 eval_set_cb_get_func_result(magic_eval_get_func_result_cb
);
120 /*===========================================================================*
122 *===========================================================================*/
123 PRIVATE
int magic_eval(char *expr
, struct val
* result
)
126 MAGIC_EVAL_PRINTF("magic_eval: Evaluating expression %s\n", expr
);
127 ret
= evaluate(expr
, result
, NULL
);
132 case ERROR_FUNCNOTFOUND
:
133 case ERROR_VARNOTFOUND
:
140 ret
= MAGIC_EBADMSTATE
;
146 ret
= MAGIC_EGENERIC
;
153 /*===========================================================================*
155 *===========================================================================*/
156 PUBLIC
int magic_eval_int(char *expr
, long *result
)
160 ret
= magic_eval(expr
, &val_res
);
164 *result
= val_res
.type
== T_INT
? val_res
.ival
: (long) val_res
.rval
;
168 /*===========================================================================*
170 *===========================================================================*/
171 PUBLIC
int magic_eval_bool(char *expr
, char *result
)
175 ret
= magic_eval(expr
, &val_res
);
179 if(val_res
.type
!= T_INT
) {
182 *result
= val_res
.ival
== 0 ? 0 : 1;
186 /*===========================================================================*
188 *===========================================================================*/
189 PUBLIC
int magic_eval_float(char *expr
, double *result
)
193 ret
= magic_eval(expr
, &val_res
);
197 *result
= val_res
.type
== T_INT
? (double) val_res
.ival
: val_res
.rval
;
201 /*===========================================================================*
202 * magic_eval_get_print_style *
203 *===========================================================================*/
204 PUBLIC
int magic_eval_get_print_style()
206 return magic_eval_print_style
;
209 /*===========================================================================*
210 * magic_eval_set_print_style *
211 *===========================================================================*/
212 PUBLIC
void magic_eval_set_print_style(int style
)
214 magic_eval_print_style
= style
;