[project @ 2003-11-02 00:06:23 by panne]
[ghc-base.git] / include / HsBase.h
index d124107..f9c6e1d 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: HsBase.h,v 1.22 2003/06/12 16:06:07 simonmar Exp $
+ * $Id: HsBase.h,v 1.35 2003/11/02 00:06:23 panne Exp $
  *
  * (c) The University of Glasgow 2001-2002
  *
 #endif
 #ifdef HAVE_SIGNAL_H
 #include <signal.h>
+/* Ultra-ugly: OpenBSD uses a broken macro for sigfillset (missing cast) */
+#if __OpenBSD__
+#undef sigfillset
+#endif
 #endif
 #ifdef HAVE_ERRNO_H
 #include <errno.h>
 #ifdef HAVE_SYS_TIMES_H
 #include <sys/times.h>
 #endif
-#if defined(HAVE_WINSOCK_H) && defined(__MINGW32__)
+#if defined(HAVE_WINSOCK_H) && defined(mingw32_TARGET_OS)
 #include <winsock.h>
 #endif
 #ifdef HAVE_LIMITS_H
 #include <limits.h>
 #endif
+#ifdef HAVE_WCTYPE_H
+#include <wctype.h>
+#endif
 
 #if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS)
 # if defined(HAVE_SYS_RESOURCE_H)
 #include "lockFile.h"
 #include "dirUtils.h"
 
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS)
 #include <io.h>
 #include <fcntl.h>
 #include "timeUtils.h"
@@ -126,6 +133,9 @@ int inputReady(int fd, int msecs, int isSock);
 /* in writeError.c */
 void writeErrString__(HsAddr msg_hdr, HsAddr msg, HsInt len);
 
+/* in Signals.c */
+extern HsInt nocldstop;
+
 /* -----------------------------------------------------------------------------
    64-bit operations, defined in longlong.c
    -------------------------------------------------------------------------- */
@@ -189,9 +199,14 @@ StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */
    -------------------------------------------------------------------------- */
 
 #ifndef INLINE
-#define INLINE extern inline
+# if defined(_MSC_VER)
+#  define INLINE extern __inline
+# else
+#  define INLINE extern inline
+# endif
 #endif
 
+#if !defined(_MSC_VER)
 INLINE int __hscore_s_isreg(m)  { return S_ISREG(m);  }
 INLINE int __hscore_s_isdir(m)  { return S_ISDIR(m);  }
 INLINE int __hscore_s_isfifo(m) { return S_ISFIFO(m); }
@@ -200,8 +215,9 @@ INLINE int __hscore_s_ischr(m)  { return S_ISCHR(m);  }
 #ifdef S_ISSOCK
 INLINE int __hscore_s_issock(m) { return S_ISSOCK(m); }
 #endif
+#endif
 
-#ifndef mingw32_TARGET_OS
+#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER)
 INLINE int
 __hscore_sigemptyset( sigset_t *set )
 { return sigemptyset(set); }
@@ -256,10 +272,10 @@ __hscore_seek_cur()
 INLINE HsInt
 __hscore_o_binary()
 {
-#ifdef HAVE_O_BINARY
+#if defined(_MSC_VER)
   return O_BINARY;
 #else
-  return 0;
+  return CONST_O_BINARY;
 #endif
 }
 
@@ -368,7 +384,7 @@ __hscore_seek_end( void )
 INLINE HsInt
 __hscore_setmode( HsInt fd, HsBool toBin )
 {
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS) || defined(_MSC_VER)
   return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT);
 #else
   return 0;
@@ -379,7 +395,7 @@ INLINE HsInt
 __hscore_PrelHandle_write( HsInt fd, HsBool isSock, HsAddr ptr, 
                           HsInt off, int sz )
 {
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS) || defined(_MSC_VER)
   if (isSock) {
     return send(fd,(char *)ptr + off, sz, 0);
   }
@@ -391,7 +407,7 @@ INLINE HsInt
 __hscore_PrelHandle_read( HsInt fd, HsBool isSock, HsAddr ptr, 
                          HsInt off, int sz )
 {
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS) || defined(_MSC_VER)
   if (isSock) {
     return recv(fd,(char *)ptr + off, sz, 0);
   }
@@ -400,7 +416,7 @@ __hscore_PrelHandle_read( HsInt fd, HsBool isSock, HsAddr ptr,
 
 }
 
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS) || defined(_MSC_VER)
 INLINE long *
 __hscore_Time_ghcTimezone( void ) { return &_timezone; }
 
@@ -411,7 +427,7 @@ __hscore_Time_ghcTzname( void ) { return _tzname; }
 INLINE HsInt
 __hscore_mkdir( HsAddr pathName, HsInt mode )
 {
-#if defined(__MINGW32__)
+#if defined(mingw32_TARGET_OS) || defined(_MSC_VER)
   return mkdir(pathName);
 #else
   return mkdir(pathName,mode);
@@ -428,25 +444,47 @@ __hscore_lstat( HsAddr fname, HsAddr st )
 #endif
 }
 
-INLINE HsInt __hscore_path_max() { return PATH_MAX; }
+#ifdef PATH_MAX
+/* A size that will contain many path names, but not necessarily all
+ * (PATH_MAX is not defined on systems with unlimited path length,
+ * e.g. the Hurd).
+ */
+INLINE HsInt __hscore_long_path_size() { return PATH_MAX; }
+#else
+INLINE HsInt __hscore_long_path_size() { return 4096; }
+#endif
 
+#ifdef R_OK
 INLINE mode_t __hscore_R_OK() { return R_OK; }
+#endif
+#ifdef W_OK
 INLINE mode_t __hscore_W_OK() { return W_OK; }
+#endif
+#ifdef X_OK
 INLINE mode_t __hscore_X_OK() { return X_OK; }
+#endif
 
+#ifdef S_IRUSR
 INLINE mode_t __hscore_S_IRUSR() { return S_IRUSR; }
+#endif
+#ifdef S_IWUSR
 INLINE mode_t __hscore_S_IWUSR() { return S_IWUSR; }
+#endif
+#ifdef S_IXUSR
 INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; }
+#endif
 
+#if !defined(_MSC_VER)
 INLINE HsAddr
 __hscore_d_name( struct dirent* d )
 { 
-#ifndef mingw32_TARGET_OS
+#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER)
   return (HsAddr)(&d->d_name);
 #else
   return (HsAddr)(d->d_name);
 #endif
 }
+#endif
 
 INLINE HsInt
 __hscore_end_of_dir( void )
@@ -474,7 +512,9 @@ __hscore_sizeof_stat( void )
 
 INLINE time_t __hscore_st_mtime ( struct stat* st ) { return st->st_mtime; }
 INLINE off_t  __hscore_st_size  ( struct stat* st ) { return st->st_size; }
+#if !defined(_MSC_VER)
 INLINE mode_t __hscore_st_mode  ( struct stat* st ) { return st->st_mode; }
+#endif
 
 #if HAVE_TERMIOS_H
 INLINE tcflag_t __hscore_lflag( struct termios* ts ) { return ts->c_lflag; }
@@ -485,7 +525,6 @@ __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; }
 INLINE unsigned char*
 __hscore_ptr_c_cc( struct termios* ts ) 
 { return (unsigned char*) &ts->c_cc; }
-#endif
 
 INLINE HsInt
 __hscore_sizeof_termios( void )
@@ -496,16 +535,15 @@ __hscore_sizeof_termios( void )
   return 0;
 #endif
 }
+#endif
 
+#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER)
 INLINE HsInt
 __hscore_sizeof_sigset_t( void )
 {
-#ifndef mingw32_TARGET_OS
   return sizeof(sigset_t);
-#else
-  return 0;
-#endif
 }
+#endif
 
 INLINE int
 __hscore_echo( void )
@@ -604,9 +642,13 @@ __hscore_f_setfl( void )
 #endif
 }
 
+// defined in rts/RtsStartup.c.
+extern void* __hscore_get_saved_termios(int fd);
+extern void __hscore_set_saved_termios(int fd, void* ts);
+
 INLINE int __hscore_hs_fileno (FILE *f) { return fileno (f); }
 
-#ifndef mingw32_TARGET_OS
+#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER)
 INLINE int __hsposix_SIGABRT()   { return SIGABRT; }
 INLINE int __hsposix_SIGALRM()   { return SIGALRM; }
 INLINE int __hsposix_SIGBUS()    { return SIGBUS; }
@@ -639,8 +681,8 @@ INLINE int __hsposix_SIGXCPU()   { return SIGXCPU; }
 INLINE int __hsposix_SIGXFSZ()   { return SIGXFSZ; }
 
 INLINE int __hsposix_SIG_BLOCK()   { return SIG_BLOCK; }
-INLINE int __hsposix_SIG_UNBLOCK() { return SIG_SETMASK; }
-INLINE int __hsposix_SIG_SETMASK() { return SIG_UNBLOCK; }
+INLINE int __hsposix_SIG_UNBLOCK() { return SIG_UNBLOCK; }
+INLINE int __hsposix_SIG_SETMASK() { return SIG_SETMASK; }
 #endif /* mingw32_TARGET_OS */
 
 #endif /* __HSBASE_H__ */