#ifndef HSFFI_H #define HSFFI_H #ifdef __cplusplus extern "C" { #endif /* extremely poor autoconf replacement, probably needs some update... */ #if defined(__sun__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(_AIX) #define HAVE_INTTYPES_H #else #ifdef Plan9 #include #else #define HAVE_STDINT_H #endif #endif /* end of poor autoconf replacement */ /* get limits for integral types */ #ifdef HAVE_STDINT_H /* ISO C 99 says: * "C++ implementations should define these macros only when * __STDC_LIMIT_MACROS is defined before is included." */ #define __STDC_LIMIT_MACROS #include #elif defined(HAVE_INTTYPES_H) #include #else /* second best guess (e.g. on Solaris) */ #include #endif #ifdef INT8_MIN #define __INT8_MIN INT8_MIN #define __INT16_MIN INT16_MIN #define __INT32_MIN INT32_MIN #define __INT64_MIN INT64_MIN #define __INT8_MAX INT8_MAX #define __INT16_MAX INT16_MAX #define __INT32_MAX INT32_MAX #define __INT64_MAX INT64_MAX #define __UINT8_MAX UINT8_MAX #define __UINT16_MAX UINT16_MAX #define __UINT32_MAX UINT32_MAX #define __UINT64_MAX UINT64_MAX #else /* if we had no luck, let's do it for ourselves (assuming 64bit long longs) */ #define __INT8_MIN (-128) #define __INT16_MIN (-32767-1) #define __INT32_MIN (-2147483647-1) #define __INT64_MIN (-9223372036854775807LL-1) #define __INT8_MAX (127) #define __INT16_MAX (32767) #define __INT32_MAX (2147483647) #define __INT64_MAX (9223372036854775807LL) #define __UINT8_MAX (255U) #define __UINT16_MAX (65535U) #define __UINT32_MAX (4294967295U) #define __UINT64_MAX (18446744073709551615ULL) #endif /* get limits for floating point types */ #include #ifdef Plan9 typedef unsigned char HsWord8; /* uint8_t */ typedef unsigned short HsWord16; /* uint16_t */ typedef unsigned int HsWord32; /* uint32_t */ typedef unsigned long long HsWord64; /* uint64_t */ typedef signed char HsInt8; /* int8_t */ typedef signed short HsInt16; /* int16_t */ typedef signed int HsInt32; /* int32_t */ typedef signed long long HsInt64; /* int64_t */ #else typedef int8_t HsInt8; typedef int16_t HsInt16; typedef int32_t HsInt32; typedef int64_t HsInt64; typedef uint8_t HsWord8; typedef uint16_t HsWord16; typedef uint32_t HsWord32; typedef uint64_t HsWord64; #endif typedef char HsChar; typedef int HsInt; typedef float HsFloat; typedef double HsDouble; typedef int HsBool; typedef void* HsPtr; typedef void (*HsFunPtr)(void); typedef void* HsForeignPtr; typedef void* HsStablePtr; typedef void* HsAddr; /* DEPRECATED */ typedef void* HsForeignObj; /* DEPRECATED */ /* ToDo: is HS_CHAR_MAX really 0xff??? No Unicode support??? */ #define HS_CHAR_MIN 0 #define HS_CHAR_MAX 0xff /* is it true or not? */ #define HS_BOOL_FALSE 0 #define HS_BOOL_TRUE 1 #define HS_BOOL_MIN HS_BOOL_FALSE #define HS_BOOL_MAX HS_BOOL_TRUE #define HS_INT_MIN HS_INT32_MIN #define HS_INT_MAX HS_INT32_MAX #define HS_INT8_MIN __INT8_MIN #define HS_INT8_MAX __INT8_MAX #define HS_INT16_MIN __INT16_MIN #define HS_INT16_MAX __INT16_MAX #define HS_INT32_MIN __INT32_MIN #define HS_INT32_MAX __INT32_MAX #define HS_INT64_MIN __INT64_MIN #define HS_INT64_MAX __INT64_MAX #define HS_WORD8_MAX __UINT8_MAX #define HS_WORD16_MAX __UINT16_MAX #define HS_WORD32_MAX __UINT32_MAX #define HS_WORD64_MAX __UINT64_MAX #define HS_FLOAT_RADIX FLT_RADIX #define HS_FLOAT_ROUNDS FLT_ROUNDS #define HS_FLOAT_EPSILON FLT_EPSILON #define HS_FLOAT_DIG FLT_DIG #define HS_FLOAT_MANT_DIG FLT_MANT_DIG #define HS_FLOAT_MIN FLT_MIN #define HS_FLOAT_MIN_EXP FLT_MIN_EXP #define HS_FLOAT_MIN_10_EXP FLT_MIN_10_EXP #define HS_FLOAT_MAX FLT_MAX #define HS_FLOAT_MAX_EXP FLT_MAX_EXP #define HS_FLOAT_MAX_10_EXP FLT_MAX_10_EXP #define HS_DOUBLE_RADIX DBL_RADIX #define HS_DOUBLE_ROUNDS DBL_ROUNDS #define HS_DOUBLE_EPSILON DBL_EPSILON #define HS_DOUBLE_DIG DBL_DIG #define HS_DOUBLE_MANT_DIG DBL_MANT_DIG #define HS_DOUBLE_MIN DBL_MIN #define HS_DOUBLE_MIN_EXP DBL_MIN_EXP #define HS_DOUBLE_MIN_10_EXP DBL_MIN_10_EXP #define HS_DOUBLE_MAX DBL_MAX #define HS_DOUBLE_MAX_EXP DBL_MAX_EXP #define HS_DOUBLE_MAX_10_EXP DBL_MAX_10_EXP /* ToDo: Missing... extern void hs_init (int *argc, char **argv[]); extern void hs_exit (void); extern void hs_set_argv (int argc, char *argv[]); extern void hs_add_root (void (*init_root)(void)); extern void hs_perform_gc (void); extern void hs_free_stable_ptr (HsStablePtr sp); extern void hs_free_fun_ptr (HsFunPtr fp); */ /* -------------------------------------------------------------------------- */ #ifdef __cplusplus } #endif #endif /* HSFFI_H */