/* 
 * (C) Copyright 1992, ..., 2003 the "DOSEMU-Development-Team".
 *
 * for details see file COPYING in the DOSEMU distribution
 */

#ifndef PARSGLOB_H
#define PARSGLOB_H

enum argument_type {
	TYPE_NONE,
	TYPE_INTEGER,
	TYPE_BOOLEAN,
	TYPE_REAL,
	TYPE_STRING = 0x10,
	TYPE_STRING1,
	TYPE_STRQUOTELESS
};

typedef struct {
	char placeholder[4];
	short token;
	char placeholder_;
	char type;
} __attribute__((packed)) ExprType;

#define EXPRTYPE(x) ((*(ExprType *)&(x)).type)
#define EXPRTOKEN(x) ((*(ExprType *)&(x)).token)

#define TYPINT(x) EXPRTYPE(x) = TYPE_INTEGER
#define TYPBOOL(x) EXPRTYPE(x) = TYPE_BOOLEAN
#define TYPREAL(x) EXPRTYPE(x) = TYPE_REAL
#define TYPSTR(x) EXPRTYPE(x) = TYPE_STRING

#define TOF(x) ( (EXPRTYPE(x) == TYPE_REAL) ? *((float *)&(x)) : *((int *)&(x)) )

#define ALL(x) ((*(YYSTYPE *)&(x)).all_value)

#define VAL_I(x) ( (*(YYSTYPE *)&(x)).i_value )
#define VAL_B(x) ( (*(YYSTYPE *)&(x)).i_value )
#define VAL_R(x) ( (*(YYSTYPE *)&(x)).r_value )
#define VAL_S(x) ( (*(YYSTYPE *)&(x)).s_value )


#define I_VAL(x) ( TYPINT(x), (*(YYSTYPE *)&(x)).i_value )
#define B_VAL(x) ( TYPBOOL(x), (*(YYSTYPE *)&(x)).i_value )
#define R_VAL(x) ( TYPREAL(x), (*(YYSTYPE *)&(x)).r_value )
#define S_VAL(x) ( TYPSTR(x), (*(YYSTYPE *)&(x)).s_value )
#define V_VAL(x,y) \
( (EXPRTYPE(y) == TYPE_REAL) ? R_VAL(x) : \
	( (EXPRTYPE(y) == TYPE_BOOLEAN) ? B_VAL(x) : I_VAL(x) ) )


#endif /* PARSGLOB_H */
