1 /* -----------------------------------------------------------------------------
2 * $Id: HsFFI.h,v 1.6 2000/08/29 13:34:21 qrczak Exp $
4 * (c) The GHC Team, 2000
6 * A mapping for Haskell types to C types, including the corresponding bounds.
7 * Intended to be used in conjuction with the FFI.
9 * WARNING: Keep this file and StgTypes.h in synch!
11 * ---------------------------------------------------------------------------*/
16 /* get types from GHC's runtime system */
20 /* get limits for integral types */
23 * "C++ implementations should define these macros only when
24 * __STDC_LIMIT_MACROS is defined before <stdint.h> is included."
26 #define __STDC_LIMIT_MACROS
29 /* second best guess (e.g. on Solaris) */
33 /* if we had no luck, let's do it for ourselves (assuming 64bit long longs) */
35 #define INT8_MIN (-128)
36 #define INT16_MIN (-32767-1)
37 #define INT32_MIN (-2147483647-1)
38 #define INT64_MIN (-9223372036854775807LL-1)
39 #define INT8_MAX (127)
40 #define INT16_MAX (32767)
41 #define INT32_MAX (2147483647)
42 #define INT64_MAX (9223372036854775807LL)
43 #define UINT8_MAX (255U)
44 #define UINT16_MAX (65535U)
45 #define UINT32_MAX (4294967295U)
46 #define UINT64_MAX (18446744073709551615ULL)
47 /* Define these types too. Some C 99 code may assume that if INT8_MIN
48 is defined then int8_t is also present. */
49 typedef StgInt8 int8_t;
50 typedef StgInt16 int16_t;
51 typedef StgInt32 int32_t;
52 typedef StgInt64 int64_t;
53 typedef StgWord8 uint8_t;
54 typedef StgWord16 uint16_t;
55 typedef StgWord32 uint32_t;
56 typedef StgWord64 uint64_t;
59 /* get limits for floating point types */
62 typedef StgChar HsChar;
64 typedef StgInt8 HsInt8;
65 typedef StgInt16 HsInt16;
66 typedef StgInt32 HsInt32;
67 typedef StgInt64 HsInt64;
68 typedef StgWord8 HsWord8;
69 typedef StgWord16 HsWord16;
70 typedef StgWord32 HsWord32;
71 typedef StgWord64 HsWord64;
72 typedef StgFloat HsFloat;
73 typedef StgDouble HsDouble;
74 typedef StgBool HsBool;
75 typedef void* HsAddr; /* this should better match StgAddr */
76 typedef void* HsForeignObj; /* ... and this StgForeignPtr */
77 typedef void* HsStablePtr;
79 /* this should correspond to the type of StgChar in StgTypes.h */
81 #define HS_CHAR_MAX INT32_MAX
83 /* this mirrors the distinction of cases in StgTypes.h */
84 #if SIZEOF_VOID_P == 8
85 #define HS_INT_MIN INT64_MIN
86 #define HS_INT_MAX INT64_MAX
87 #elif SIZEOF_VOID_P == 4
88 #define HS_INT_MIN INT32_MIN
89 #define HS_INT_MAX INT32_MAX
91 #error GHC untested on this architecture: sizeof(void *) != 4 or 8
94 #define HS_INT8_MIN INT8_MIN
95 #define HS_INT8_MAX INT8_MAX
96 #define HS_INT16_MIN INT16_MIN
97 #define HS_INT16_MAX INT16_MAX
98 #define HS_INT32_MIN INT32_MIN
99 #define HS_INT32_MAX INT32_MAX
100 #define HS_INT64_MIN INT64_MIN
101 #define HS_INT64_MAX INT64_MAX
102 #define HS_WORD8_MAX UINT8_MAX
103 #define HS_WORD16_MAX UINT16_MAX
104 #define HS_WORD32_MAX UINT32_MAX
105 #define HS_WORD64_MAX UINT64_MAX
107 #ifdef FLOATS_AS_DOUBLES
109 #define HS_FLOAT_RADIX DBL_RADIX
110 #define HS_FLOAT_ROUNDS DBL_ROUNDS
111 #define HS_FLOAT_EPSILON DBL_EPSILON
112 #define HS_FLOAT_DIG DBL_DIG
113 #define HS_FLOAT_MANT_DIG DBL_MANT_DIG
114 #define HS_FLOAT_MIN DBL_MIN
115 #define HS_FLOAT_MIN_EXP DBL_MIN_EXP
116 #define HS_FLOAT_MIN_10_EXP DBL_MIN_10_EXP
117 #define HS_FLOAT_MAX DBL_MAX
118 #define HS_FLOAT_MAX_EXP DBL_MAX_EXP
119 #define HS_FLOAT_MAX_10_EXP DBL_MAX_10_EXP
123 #define HS_FLOAT_RADIX FLT_RADIX
124 #define HS_FLOAT_ROUNDS FLT_ROUNDS
125 #define HS_FLOAT_EPSILON FLT_EPSILON
126 #define HS_FLOAT_DIG FLT_DIG
127 #define HS_FLOAT_MANT_DIG FLT_MANT_DIG
128 #define HS_FLOAT_MIN FLT_MIN
129 #define HS_FLOAT_MIN_EXP FLT_MIN_EXP
130 #define HS_FLOAT_MIN_10_EXP FLT_MIN_10_EXP
131 #define HS_FLOAT_MAX FLT_MAX
132 #define HS_FLOAT_MAX_EXP FLT_MAX_EXP
133 #define HS_FLOAT_MAX_10_EXP FLT_MAX_10_EXP
135 #endif /* FLOATS_AS_DOUBLES */
137 #define HS_DOUBLE_RADIX DBL_RADIX
138 #define HS_DOUBLE_ROUNDS DBL_ROUNDS
139 #define HS_DOUBLE_EPSILON DBL_EPSILON
140 #define HS_DOUBLE_DIG DBL_DIG
141 #define HS_DOUBLE_MANT_DIG DBL_MANT_DIG
142 #define HS_DOUBLE_MIN DBL_MIN
143 #define HS_DOUBLE_MIN_EXP DBL_MIN_EXP
144 #define HS_DOUBLE_MIN_10_EXP DBL_MIN_10_EXP
145 #define HS_DOUBLE_MAX DBL_MAX
146 #define HS_DOUBLE_MAX_EXP DBL_MAX_EXP
147 #define HS_DOUBLE_MAX_10_EXP DBL_MAX_10_EXP