1 /* -----------------------------------------------------------------------------
2 * $Id: HsFFI.h,v 1.13 2001/01/03 03:10:32 chak 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
28 #elif defined(HAVE_INTTYPES_H)
31 /* second best guess (e.g. on Solaris) */
36 #define __INT8_MIN INT8_MIN
37 #define __INT16_MIN INT16_MIN
38 #define __INT32_MIN INT32_MIN
39 #define __INT64_MIN INT64_MIN
40 #define __INT8_MAX INT8_MAX
41 #define __INT16_MAX INT16_MAX
42 #define __INT32_MAX INT32_MAX
43 #define __INT64_MAX INT64_MAX
44 #define __UINT8_MAX UINT8_MAX
45 #define __UINT16_MAX UINT16_MAX
46 #define __UINT32_MAX UINT32_MAX
47 #define __UINT64_MAX UINT64_MAX
49 /* if we had no luck, let's do it for ourselves (assuming 64bit long longs) */
50 #define __INT8_MIN (-128)
51 #define __INT16_MIN (-32767-1)
52 #define __INT32_MIN (-2147483647-1)
53 #define __INT64_MIN (-9223372036854775807LL-1)
54 #define __INT8_MAX (127)
55 #define __INT16_MAX (32767)
56 #define __INT32_MAX (2147483647)
57 #define __INT64_MAX (9223372036854775807LL)
58 #define __UINT8_MAX (255U)
59 #define __UINT16_MAX (65535U)
60 #define __UINT32_MAX (4294967295U)
61 #define __UINT64_MAX (18446744073709551615ULL)
64 /* get limits for floating point types */
67 typedef StgChar HsChar;
69 typedef StgInt8 HsInt8;
70 typedef StgInt16 HsInt16;
71 typedef StgInt32 HsInt32;
72 typedef StgInt64 HsInt64;
73 typedef StgWord HsWord;
74 typedef StgWord8 HsWord8;
75 typedef StgWord16 HsWord16;
76 typedef StgWord32 HsWord32;
77 typedef StgWord64 HsWord64;
78 typedef StgFloat HsFloat;
79 typedef StgDouble HsDouble;
80 typedef StgBool HsBool;
81 typedef void* HsPtr; /* this should better match StgAddr */
82 typedef void (*HsFunPtr)(void); /* this should better match StgAddr */
83 typedef void* HsForeignPtr; /* ... and this StgForeignPtr */
84 typedef void* HsStablePtr;
85 typedef void* HsAddr; /* DEPRECATED */
86 typedef void* HsForeignObj; /* DEPRECATED */
88 /* this should correspond to the type of StgChar in StgTypes.h */
90 #define HS_CHAR_MAX __INT32_MAX
92 /* this mirrors the distinction of cases in StgTypes.h */
93 #if SIZEOF_VOID_P == 8
94 #define HS_INT_MIN __INT64_MIN
95 #define HS_INT_MAX __INT64_MAX
96 #elif SIZEOF_VOID_P == 4
97 #define HS_INT_MIN __INT32_MIN
98 #define HS_INT_MAX __INT32_MAX
100 #error GHC untested on this architecture: sizeof(void *) != 4 or 8
103 #define HS_INT8_MIN __INT8_MIN
104 #define HS_INT8_MAX __INT8_MAX
105 #define HS_INT16_MIN __INT16_MIN
106 #define HS_INT16_MAX __INT16_MAX
107 #define HS_INT32_MIN __INT32_MIN
108 #define HS_INT32_MAX __INT32_MAX
109 #define HS_INT64_MIN __INT64_MIN
110 #define HS_INT64_MAX __INT64_MAX
111 #define HS_WORD8_MAX __UINT8_MAX
112 #define HS_WORD16_MAX __UINT16_MAX
113 #define HS_WORD32_MAX __UINT32_MAX
114 #define HS_WORD64_MAX __UINT64_MAX
116 #define HS_FLOAT_RADIX FLT_RADIX
117 #define HS_FLOAT_ROUNDS FLT_ROUNDS
118 #define HS_FLOAT_EPSILON FLT_EPSILON
119 #define HS_FLOAT_DIG FLT_DIG
120 #define HS_FLOAT_MANT_DIG FLT_MANT_DIG
121 #define HS_FLOAT_MIN FLT_MIN
122 #define HS_FLOAT_MIN_EXP FLT_MIN_EXP
123 #define HS_FLOAT_MIN_10_EXP FLT_MIN_10_EXP
124 #define HS_FLOAT_MAX FLT_MAX
125 #define HS_FLOAT_MAX_EXP FLT_MAX_EXP
126 #define HS_FLOAT_MAX_10_EXP FLT_MAX_10_EXP
128 #define HS_DOUBLE_RADIX DBL_RADIX
129 #define HS_DOUBLE_ROUNDS DBL_ROUNDS
130 #define HS_DOUBLE_EPSILON DBL_EPSILON
131 #define HS_DOUBLE_DIG DBL_DIG
132 #define HS_DOUBLE_MANT_DIG DBL_MANT_DIG
133 #define HS_DOUBLE_MIN DBL_MIN
134 #define HS_DOUBLE_MIN_EXP DBL_MIN_EXP
135 #define HS_DOUBLE_MIN_10_EXP DBL_MIN_10_EXP
136 #define HS_DOUBLE_MAX DBL_MAX
137 #define HS_DOUBLE_MAX_EXP DBL_MAX_EXP
138 #define HS_DOUBLE_MAX_10_EXP DBL_MAX_10_EXP