#include "SDCCsymt.h"
+
+/* double to unsigned long conversion */
+/*
+ * See ISO/IEC 9899, chapter 6.3.1.4 Real floating and integer:
+ * If the value of the integral part cannot be represented by the integer type, the behavior is undefined.
+ * This shows up on Mac OS X i386 platform
+ */
+/*
+ * on Mac OS X ppc (long) 2147483648.0 equals to 2147483647, so we explicitely convert it to 0x80000000
+ * on other known platforms (long) 2147483648.0 equals to -2147483648
+ */
+#define double2ul(val) ((val <= (double)0x80000000UL) ? 0x80000000UL : (((val) < 0) ? (unsigned long) -((long) -(val)) : (unsigned long) (val)))
+
/* value wrapper */
typedef struct value
{
- char name[SDCC_NAME_MAX + 1]; /* operand accessing this value */
- sym_link *type; /* start of type chain */
- sym_link *etype; /* end of type chain */
- symbol *sym; /* Original Symbol */
- struct value *next; /* used in initializer list */
- unsigned vArgs:1; /* arg list ended with variable arg */
+ char name[SDCC_NAME_MAX + 1]; /* operand accessing this value */
+ sym_link *type; /* start of type chain */
+ sym_link *etype; /* end of type chain */
+ symbol *sym; /* Original Symbol */
+ struct value *next; /* used in initializer list */
+ unsigned vArgs:1; /* arg list ended with variable arg */
}
value;
char *filename;
union
{
- struct ast *node;
- struct initList *deep;
+ struct ast *node;
+ struct initList *deep;
}
init;
}
CCR_RESULT;
-#define IS_VARG(x) (x->vArgs)
+#define IS_VARG(x) (x->vArgs)
/* forward definitions for the symbol table related functions */
void initValue ();
value *newValue ();
-value *constVal (char *);
+value *constVal (const char *);
value *reverseVal (value *);
value *reverseValWithType (value *);
value *copyValue (value *);
value *copyValueChain (value *);
-value *strVal (char *);
-value *charVal (char *);
+value *strVal (const char *);
+value *charVal (const char *);
value *symbolVal (symbol *);
void printVal (value *);
double floatFromVal (value *);
+unsigned long ulFromVal (value *);
/* convert a fixed16x16 type to double */
double doubleFromFixed16x16(TYPE_TARGET_ULONG value);