#define _REENTRANT 1 (needed to get the right errno on some OSs)
[ghc-base.git] / include / HsBase.h
index 9281db0..682d808 100644 (file)
 #undef PACKAGE_TARNAME
 #undef PACKAGE_VERSION
 
+/* Needed to get the macro version of errno on some OSs (eg. Solaris).
+   We must do this, because these libs are only compiled once, but
+   must work in both single-threaded and multi-threaded programs. */
+#define _REENTRANT 1
+
 #include "HsFFI.h"
 
 #include <stdio.h>
 #if HAVE_WCTYPE_H
 #include <wctype.h>
 #endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#elif HAVE_STDINT_H
+# include <stdint.h>
+#endif
 
 #if !defined(mingw32_HOST_OS) && !defined(irix_HOST_OS)
 # if HAVE_SYS_RESOURCE_H
@@ -210,10 +220,10 @@ StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */
 #ifndef INLINE
 # if defined(_MSC_VER)
 #  define INLINE extern __inline
-# elif defined(__HUGS__)
-#  define INLINE INLINE_ONLY
-# else
+# elif defined(__GNUC__)
 #  define INLINE extern inline
+# else
+#  define INLINE inline
 # endif
 #endif
 
@@ -417,6 +427,8 @@ __hscore_setmode( HsInt fd, HsBool toBin )
 #endif
 }
 
+#if __GLASGOW_HASKELL__
+
 INLINE HsInt
 __hscore_PrelHandle_write( HsInt fd, HsAddr ptr, HsInt off, int sz )
 {
@@ -444,6 +456,8 @@ __hscore_PrelHandle_recv( HsInt fd, HsAddr ptr, HsInt off, int sz )
 }
 #endif
 
+#endif /* __GLASGOW_HASKELL__ */
+
 #if defined(mingw32_HOST_OS) || defined(_MSC_VER)
 INLINE long *
 __hscore_Time_ghcTimezone( void ) { return &_timezone; }
@@ -696,6 +710,7 @@ INLINE int __hscore_fstat(int fd, struct stat *buf) {
 // select-related stuff
 
 #if !defined(mingw32_HOST_OS)
+INLINE int  hsFD_SETSIZE(void) { return FD_SETSIZE; }
 INLINE void hsFD_CLR(int fd, fd_set *fds) { FD_CLR(fd, fds); }
 INLINE int  hsFD_ISSET(int fd, fd_set *fds) { return FD_ISSET(fd, fds); }
 INLINE void hsFD_SET(int fd, fd_set *fds) { FD_SET(fd, fds); }
@@ -760,5 +775,11 @@ INLINE unsigned int __hscore_get_osver(void) { return _osver; }
 extern char** environ;
 INLINE char **__hscore_environ() { return environ; }
 
+/* lossless conversions between pointers and integral types */
+INLINE void *    __hscore_from_uintptr(uintptr_t n) { return (void *)n; }
+INLINE void *    __hscore_from_intptr (intptr_t n)  { return (void *)n; }
+INLINE uintptr_t __hscore_to_uintptr  (void *p)     { return (uintptr_t)p; }
+INLINE intptr_t  __hscore_to_intptr   (void *p)     { return (intptr_t)p; }
+
 #endif /* __HSBASE_H__ */