/*
 * An expression evaluator
 */
#ifndef _H_CPP_EVAL_
#define _H_CPP_EVAL_

/*
 * eval status
 * to gen Ada we want to grok strings/floats too
 */
typedef enum {
	eval_failed,
	eval_int,
	eval_float,
	eval_string
} cpp_eval_result_kind_t;

typedef struct {
	cpp_eval_result_kind_t	eval_result_kind;
	int						base;
	union {
		host_int_t			ival;
		double				fval;
		char				*sval;
	} eval_result;
} cpp_eval_result_t;

extern cpp_eval_result_t cpp_eval _ANSI_PROTO_((char*));

#define EVAL_FAILED(x)			((x).eval_result_kind == eval_failed)
#define IS_EVAL_INT(x)			((x).eval_result_kind == eval_int)
#define IS_EVAL_FLOAT(x)		((x).eval_result_kind == eval_float)
#define IS_EVAL_STRING(x)		((x).eval_result_kind == eval_string)

#define EVAL_INT(x)				((x).eval_result.ival)
#define EVAL_FLOAT(x)			((x).eval_result.fval)
#define EVAL_STRING(x)			((x).eval_result.sval)

#endif /* _H_CPP_EVAL_ */


syntax highlighted by Code2HTML, v. 0.9.1