f51d41a17b2e143307bfefdf0c9e03b2596f9459
[ghc-hetmet.git] / ghc / includes / HsFFI.h
1 /* -----------------------------------------------------------------------------
2  * $Id: HsFFI.h,v 1.5 2000/08/18 18:08:48 qrczak Exp $
3  *
4  * (c) The GHC Team, 2000
5  *
6  * A mapping for Haskell types to C types, including the corresponding bounds.
7  * Intended to be used in conjuction with the FFI.
8  *
9  * WARNING: Keep this file and StgTypes.h in synch!
10  *
11  * ---------------------------------------------------------------------------*/
12
13 #ifndef HSFFI_H
14 #define HSFFI_H
15
16 /* get types from GHC's runtime system */
17 #include "config.h"
18 #include "StgTypes.h"
19
20 /* get limits for integral types */
21 #ifdef HAVE_STDINT_H
22 /* ISO C 99 requires this */
23 #define __STDC_LIMIT_MACROS
24 #include <stdint.h>
25 #else
26 /* second best guess (e.g. on Solaris) */
27 #include <limits.h>
28 #endif
29
30 /* if we had no luck, let's do it for ourselves (assuming 64bit long longs) */
31 #ifndef INT8_MIN
32 #define INT8_MIN                (-128)
33 #define INT16_MIN               (-32767-1)
34 #define INT32_MIN               (-2147483647-1)
35 #define INT64_MIN               (-9223372036854775807LL-1)
36 #define INT8_MAX                (127)
37 #define INT16_MAX               (32767)
38 #define INT32_MAX               (2147483647)
39 #define INT64_MAX               (9223372036854775807LL)
40 #define UINT8_MAX               (255U)
41 #define UINT16_MAX              (65535U)
42 #define UINT32_MAX              (4294967295U)
43 #define UINT64_MAX              (18446744073709551615ULL)
44 #endif
45
46 /* get limits for floating point types */
47 #include <float.h>
48
49 typedef StgChar                 HsChar;
50 typedef StgInt                  HsInt;
51 typedef StgInt8                 HsInt8;
52 typedef StgInt16                HsInt16;
53 typedef StgInt32                HsInt32;
54 typedef StgInt64                HsInt64;
55 typedef StgWord8                HsWord8;
56 typedef StgWord16               HsWord16;
57 typedef StgWord32               HsWord32;
58 typedef StgWord64               HsWord64;
59 typedef StgFloat                HsFloat;
60 typedef StgDouble               HsDouble;
61 typedef StgBool                 HsBool;
62 typedef void*                   HsAddr;         /* this should better match StgAddr */
63 typedef void*                   HsForeignObj;   /* ... and this StgForeignPtr       */
64 typedef void*                   HsStablePtr;
65
66 /* this should correspond to the type of StgChar in StgTypes.h */
67 #define HS_CHAR_MIN             0
68 #define HS_CHAR_MAX             INT32_MAX
69
70 /* this mirrors the distinction of cases in StgTypes.h */
71 #if   SIZEOF_VOID_P == 8
72 #define HS_INT_MIN              INT64_MIN
73 #define HS_INT_MAX              INT64_MAX
74 #elif SIZEOF_VOID_P == 4
75 #define HS_INT_MIN              INT32_MIN
76 #define HS_INT_MAX              INT32_MAX
77 #else
78 #error GHC untested on this architecture: sizeof(void *) != 4 or 8
79 #endif
80
81 #define HS_INT8_MIN             INT8_MIN
82 #define HS_INT8_MAX             INT8_MAX
83 #define HS_INT16_MIN            INT16_MIN
84 #define HS_INT16_MAX            INT16_MAX
85 #define HS_INT32_MIN            INT32_MIN
86 #define HS_INT32_MAX            INT32_MAX
87 #define HS_INT64_MIN            INT64_MIN
88 #define HS_INT64_MAX            INT64_MAX
89 #define HS_WORD8_MAX            UINT8_MAX
90 #define HS_WORD16_MAX           UINT16_MAX
91 #define HS_WORD32_MAX           UINT32_MAX
92 #define HS_WORD64_MAX           UINT64_MAX
93
94 #ifdef FLOATS_AS_DOUBLES
95
96 #define HS_FLOAT_RADIX          DBL_RADIX
97 #define HS_FLOAT_ROUNDS         DBL_ROUNDS
98 #define HS_FLOAT_EPSILON        DBL_EPSILON
99 #define HS_FLOAT_DIG            DBL_DIG
100 #define HS_FLOAT_MANT_DIG       DBL_MANT_DIG
101 #define HS_FLOAT_MIN            DBL_MIN
102 #define HS_FLOAT_MIN_EXP        DBL_MIN_EXP
103 #define HS_FLOAT_MIN_10_EXP     DBL_MIN_10_EXP
104 #define HS_FLOAT_MAX            DBL_MAX
105 #define HS_FLOAT_MAX_EXP        DBL_MAX_EXP
106 #define HS_FLOAT_MAX_10_EXP     DBL_MAX_10_EXP
107                            
108 #else                      
109                            
110 #define HS_FLOAT_RADIX          FLT_RADIX
111 #define HS_FLOAT_ROUNDS         FLT_ROUNDS
112 #define HS_FLOAT_EPSILON        FLT_EPSILON
113 #define HS_FLOAT_DIG            FLT_DIG
114 #define HS_FLOAT_MANT_DIG       FLT_MANT_DIG
115 #define HS_FLOAT_MIN            FLT_MIN
116 #define HS_FLOAT_MIN_EXP        FLT_MIN_EXP
117 #define HS_FLOAT_MIN_10_EXP     FLT_MIN_10_EXP
118 #define HS_FLOAT_MAX            FLT_MAX
119 #define HS_FLOAT_MAX_EXP        FLT_MAX_EXP
120 #define HS_FLOAT_MAX_10_EXP     FLT_MAX_10_EXP
121
122 #endif /* FLOATS_AS_DOUBLES */
123
124 #define HS_DOUBLE_RADIX         DBL_RADIX
125 #define HS_DOUBLE_ROUNDS        DBL_ROUNDS
126 #define HS_DOUBLE_EPSILON       DBL_EPSILON
127 #define HS_DOUBLE_DIG           DBL_DIG
128 #define HS_DOUBLE_MANT_DIG      DBL_MANT_DIG
129 #define HS_DOUBLE_MIN           DBL_MIN
130 #define HS_DOUBLE_MIN_EXP       DBL_MIN_EXP
131 #define HS_DOUBLE_MIN_10_EXP    DBL_MIN_10_EXP
132 #define HS_DOUBLE_MAX           DBL_MAX
133 #define HS_DOUBLE_MAX_EXP       DBL_MAX_EXP
134 #define HS_DOUBLE_MAX_10_EXP    DBL_MAX_10_EXP
135
136 #endif /* HSFFI_H */