#ifndef _AUTO_EVAL_H
#define _AUTO_EVAL_H

#define CHAR_VAR	0
#define SHORT_VAR	1	
#define INT_VAR		2
#define BOOL_VAR	3
#define LONG_VAR	4
#define FLOAT_VAR	5	
#define DOUBLE_VAR	6	
#define STRING_VAR	7
#define NIL_VAR	7

extern "C" {

extern void eval_debug();

typedef void* (*pointer_function_type)();

typedef int var_type;

extern void create_eval();

extern void delete_eval();

extern void eval_push();

extern void eval_pop();

extern pointer_function_type eval(const char * expression);

extern void * interp(const char * expression);

extern void eval_release(pointer_function_type pf);

extern void register_var(const char * id, var_type var, void * ptr);

extern void register_array(const char * id, int dim);

extern void register_local_var(const char * id, var_type var, void * ptr);

extern void register_var2(const char * id, const char * type, void * ptr);

extern void register_local_var2(const char * id, const char * type, void * ptr);

extern void register_fun3(const char * cls, const char * name, void * code);

extern void register_fun(const char * id, void * ptr);

extern void register_var3(const char * cls, const char * name, unsigned int offset);

extern void delete_result(void * ptr);

extern var_type get_res_type(void * ptr);

extern int get_int_value(void * ptr);

extern float get_float_value(void * ptr);

extern long get_long_value(void * ptr);

extern double get_double_value(void * ptr);

extern char get_char_value(void * ptr);

extern short get_short_value(void * ptr);

extern char * get_string_value(void * ptr);

extern char * get_interp_string(void * ptr);
extern int get_interp_int(void * ptr);
extern double get_interp_double(void * ptr);
extern float get_interp_float(void * ptr);
extern short get_interp_short(void * ptr);
extern void * get_interp_pointer(void * ptr);

extern void clear_eval();

}

#endif /* _AUTO_EVAL_H */
