X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FHsBase.h;h=11d89bae2a4ae9d6730a8b99f30a3c31bb7b09c4;hb=54cfece8e071df96435ea1abd3b083931f1d8cfd;hp=5ec4a06166d535e99baa848810a5531992c95d05;hpb=12ef6a068f01d7ebb676475bba4ffdd9c93048d9;p=ghc-base.git diff --git a/include/HsBase.h b/include/HsBase.h index 5ec4a06..11d89ba 100644 --- a/include/HsBase.h +++ b/include/HsBase.h @@ -1,82 +1,93 @@ /* ----------------------------------------------------------------------------- - * $Id: HsBase.h,v 1.2 2002/02/13 10:17:29 simonmar Exp $ * * (c) The University of Glasgow 2001-2002 * - * Definitions for package `core' which are visible in Haskell land. + * Definitions for package `base' which are visible in Haskell land. * * ---------------------------------------------------------------------------*/ -#ifndef HSCORE_H -#define HSCORE_H +#ifndef __HSBASE_H__ +#define __HSBASE_H__ -#include "config.h" +#include "ghcconfig.h" #include "HsFFI.h" #include #include +#include -#ifdef HAVE_SYS_TYPES_H +#if HAVE_SYS_TYPES_H #include #endif -#ifdef HAVE_UNISTD_H +#if HAVE_UNISTD_H #include #endif -#ifdef HAVE_SYS_STAT_H +#if HAVE_SYS_STAT_H #include #endif -#ifdef HAVE_FCNTL_H +#if HAVE_FCNTL_H # include #endif -#ifdef HAVE_TERMIOS_H +#if HAVE_TERMIOS_H #include #endif -#ifdef HAVE_SIGNAL_H +#if HAVE_SIGNAL_H #include +/* Ultra-ugly: OpenBSD uses broken macros for sigemptyset and sigfillset (missing casts) */ +#if __OpenBSD__ +#undef sigemptyset +#undef sigfillset +#endif #endif -#ifdef HAVE_ERRNO_H +#if HAVE_ERRNO_H #include #endif -#ifdef HAVE_STRING_H +#if HAVE_STRING_H #include #endif -#ifdef HAVE_DIRENT_H +#if HAVE_DIRENT_H #include #endif -#ifdef HAVE_UTIME_H +#if HAVE_UTIME_H #include #endif -#if defined(HAVE_GETTIMEOFDAY) -# ifdef HAVE_SYS_TIME_H +#if HAVE_SYS_UTSNAME_H +#include +#endif +#if HAVE_GETTIMEOFDAY +# if HAVE_SYS_TIME_H # include # endif -#elif defined(HAVE_GETCLOCK) -# ifdef HAVE_SYS_TIMERS_H +#elif HAVE_GETCLOCK +# if HAVE_SYS_TIMERS_H # define POSIX_4D9 1 # include # endif #endif -#if defined(HAVE_TIME_H) -# include +#if HAVE_TIME_H +#include #endif -#ifdef HAVE_SYS_TIMEB_H +#if HAVE_SYS_TIMEB_H #include #endif -#ifdef HAVE_WINDOWS_H +#if HAVE_WINDOWS_H #include #endif -#ifdef HAVE_SYS_TIMES_H +#if HAVE_SYS_TIMES_H #include #endif -#ifdef HAVE_WINSOCK_H +#if HAVE_WINSOCK_H && defined(mingw32_TARGET_OS) #include #endif -#ifdef HAVE_LIMITS_H +#if HAVE_LIMITS_H #include #endif +#if HAVE_WCTYPE_H +#include +#endif #if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS) -# if defined(HAVE_SYS_RESOURCE_H) +# if HAVE_SYS_RESOURCE_H # include # endif #endif @@ -88,30 +99,95 @@ #endif /* For System */ -#ifdef HAVE_SYS_WAIT_H +#if HAVE_SYS_WAIT_H #include #endif -#ifdef HAVE_VFORK_H +#if HAVE_VFORK_H #include #endif #include "lockFile.h" #include "dirUtils.h" -#include "errUtils.h" -#ifdef _WIN32 +#if defined(mingw32_TARGET_OS) #include #include +#include "timeUtils.h" +#include #endif -/* in ghc_errno.c */ -int *ghcErrno(void); - /* in system.c */ HsInt systemCmd(HsAddr cmd); +/* in rawSystem.c */ +#if defined(mingw32_TARGET_OS) +HsInt rawSystem(HsAddr cmd); +#else +HsInt rawSystem(HsAddr cmd, HsAddr args); +#endif + /* in inputReady.c */ int inputReady(int fd, int msecs, int isSock); +/* in writeError.c */ +void writeErrString__(HsAddr msg, HsInt len); + +/* in Signals.c */ +extern HsInt nocldstop; + +/* ----------------------------------------------------------------------------- + 64-bit operations, defined in longlong.c + -------------------------------------------------------------------------- */ + +#ifdef SUPPORT_LONG_LONGS + +StgInt stg_gtWord64 (StgWord64, StgWord64); +StgInt stg_geWord64 (StgWord64, StgWord64); +StgInt stg_eqWord64 (StgWord64, StgWord64); +StgInt stg_neWord64 (StgWord64, StgWord64); +StgInt stg_ltWord64 (StgWord64, StgWord64); +StgInt stg_leWord64 (StgWord64, StgWord64); + +StgInt stg_gtInt64 (StgInt64, StgInt64); +StgInt stg_geInt64 (StgInt64, StgInt64); +StgInt stg_eqInt64 (StgInt64, StgInt64); +StgInt stg_neInt64 (StgInt64, StgInt64); +StgInt stg_ltInt64 (StgInt64, StgInt64); +StgInt stg_leInt64 (StgInt64, StgInt64); + +StgWord64 stg_remWord64 (StgWord64, StgWord64); +StgWord64 stg_quotWord64 (StgWord64, StgWord64); + +StgInt64 stg_remInt64 (StgInt64, StgInt64); +StgInt64 stg_quotInt64 (StgInt64, StgInt64); +StgInt64 stg_negateInt64 (StgInt64); +StgInt64 stg_plusInt64 (StgInt64, StgInt64); +StgInt64 stg_minusInt64 (StgInt64, StgInt64); +StgInt64 stg_timesInt64 (StgInt64, StgInt64); + +StgWord64 stg_and64 (StgWord64, StgWord64); +StgWord64 stg_or64 (StgWord64, StgWord64); +StgWord64 stg_xor64 (StgWord64, StgWord64); +StgWord64 stg_not64 (StgWord64); + +StgWord64 stg_uncheckedShiftL64 (StgWord64, StgInt); +StgWord64 stg_uncheckedShiftRL64 (StgWord64, StgInt); +StgInt64 stg_uncheckedIShiftL64 (StgInt64, StgInt); +StgInt64 stg_uncheckedIShiftRL64 (StgInt64, StgInt); +StgInt64 stg_uncheckedIShiftRA64 (StgInt64, StgInt); + +StgInt64 stg_intToInt64 (StgInt); +StgInt stg_int64ToInt (StgInt64); +StgWord64 stg_int64ToWord64 (StgInt64); + +StgWord64 stg_wordToWord64 (StgWord); +StgWord stg_word64ToWord (StgWord64); +StgInt64 stg_word64ToInt64 (StgWord64); + +StgInt64 stg_integerToInt64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da); +StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da); + +#endif /* SUPPORT_LONG_LONGS */ + /* ----------------------------------------------------------------------------- INLINE functions. @@ -121,9 +197,19 @@ int inputReady(int fd, int msecs, int isSock); -------------------------------------------------------------------------- */ #ifndef INLINE -#define INLINE extern inline +# if defined(_MSC_VER) +# define INLINE extern __inline +# elif defined(__HUGS__) +# define INLINE INLINE_ONLY +# else +# define INLINE extern inline +# endif #endif +INLINE int __hscore_get_errno(void) { return errno; } +INLINE void __hscore_set_errno(int e) { errno = e; } + +#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); } @@ -132,11 +218,28 @@ 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 -INLINE void +#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER) +INLINE int __hscore_sigemptyset( sigset_t *set ) -{ sigemptyset(set); } +{ return sigemptyset(set); } + +INLINE int +__hscore_sigfillset( sigset_t *set ) +{ return sigfillset(set); } + +INLINE int +__hscore_sigaddset( sigset_t * set, int s ) +{ return sigaddset(set,s); } + +INLINE int +__hscore_sigdelset( sigset_t * set, int s ) +{ return sigdelset(set,s); } + +INLINE int +__hscore_sigismember( sigset_t * set, int s ) +{ return sigismember(set,s); } #endif INLINE void * @@ -172,10 +275,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 } @@ -284,39 +387,41 @@ __hscore_seek_end( void ) INLINE HsInt __hscore_setmode( HsInt fd, HsBool toBin ) { -#ifdef _WIN32 +#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT); #else return 0; -#endif +#endif } INLINE HsInt -__hscore_PrelHandle_write( HsInt fd, HsBool isSock, HsAddr ptr, - HsInt off, int sz ) +__hscore_PrelHandle_write( HsInt fd, HsAddr ptr, HsInt off, int sz ) { -#ifdef _WIN32 - if (isSock) { - return send(fd,ptr + off, sz, 0); - } -#endif - return write(fd,ptr + off, sz); + return write(fd,(char *)ptr + off, sz); } INLINE HsInt -__hscore_PrelHandle_read( HsInt fd, HsBool isSock, HsAddr ptr, - HsInt off, int sz ) +__hscore_PrelHandle_read( HsInt fd, HsAddr ptr, HsInt off, int sz ) { -#ifdef _WIN32 - if (isSock) { - return recv(fd,ptr + off, sz, 0); - } -#endif - return read(fd,ptr + off, sz); + return read(fd,(char *)ptr + off, sz); } -#ifdef mingw32_TARGET_OS +#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) +INLINE HsInt +__hscore_PrelHandle_send( HsInt fd, HsAddr ptr, HsInt off, int sz ) +{ + return send(fd,(char *)ptr + off, sz, 0); +} + +INLINE HsInt +__hscore_PrelHandle_recv( HsInt fd, HsAddr ptr, HsInt off, int sz ) +{ + return recv(fd,(char *)ptr + off, sz, 0); +} +#endif + +#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) INLINE long * __hscore_Time_ghcTimezone( void ) { return &_timezone; } @@ -327,7 +432,7 @@ __hscore_Time_ghcTzname( void ) { return _tzname; } INLINE HsInt __hscore_mkdir( HsAddr pathName, HsInt mode ) { -#if defined(mingw32_TARGET_OS) +#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) return mkdir(pathName); #else return mkdir(pathName,mode); @@ -337,32 +442,54 @@ __hscore_mkdir( HsAddr pathName, HsInt mode ) INLINE HsInt __hscore_lstat( HsAddr fname, HsAddr st ) { -#ifdef HAVE_LSTAT +#if HAVE_LSTAT return lstat((const char*)fname, (struct stat*)st); #else return stat((const char*)fname, (struct stat*)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 ) @@ -371,7 +498,7 @@ __hscore_end_of_dir( void ) return 0; #else return ENOENT; -#endif +#endif } INLINE void @@ -390,7 +517,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; } @@ -399,9 +528,8 @@ INLINE void __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; } INLINE unsigned char* -__hscore_ptr_c_cc( struct termios* ts ) +__hscore_ptr_c_cc( struct termios* ts ) { return (unsigned char*) &ts->c_cc; } -#endif INLINE HsInt __hscore_sizeof_termios( void ) @@ -412,16 +540,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 ) @@ -520,5 +647,74 @@ __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); } + +#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; } +INLINE int __hsposix_SIGCHLD() { return SIGCHLD; } +INLINE int __hsposix_SIGCONT() { return SIGCONT; } +INLINE int __hsposix_SIGFPE() { return SIGFPE; } +INLINE int __hsposix_SIGHUP() { return SIGHUP; } +INLINE int __hsposix_SIGILL() { return SIGILL; } +INLINE int __hsposix_SIGINT() { return SIGINT; } +INLINE int __hsposix_SIGKILL() { return SIGKILL; } +INLINE int __hsposix_SIGPIPE() { return SIGPIPE; } +INLINE int __hsposix_SIGQUIT() { return SIGQUIT; } +INLINE int __hsposix_SIGSEGV() { return SIGSEGV; } +INLINE int __hsposix_SIGSTOP() { return SIGSTOP; } +INLINE int __hsposix_SIGTERM() { return SIGTERM; } +INLINE int __hsposix_SIGTSTP() { return SIGTSTP; } +INLINE int __hsposix_SIGTTIN() { return SIGTTIN; } +INLINE int __hsposix_SIGTTOU() { return SIGTTOU; } +INLINE int __hsposix_SIGUSR1() { return SIGUSR1; } +INLINE int __hsposix_SIGUSR2() { return SIGUSR2; } +#if HAVE_SIGPOLL +INLINE int __hsposix_SIGPOLL() { return SIGPOLL; } +#endif +INLINE int __hsposix_SIGPROF() { return SIGPROF; } +INLINE int __hsposix_SIGSYS() { return SIGSYS; } +INLINE int __hsposix_SIGTRAP() { return SIGTRAP; } +INLINE int __hsposix_SIGURG() { return SIGURG; } +INLINE int __hsposix_SIGVTALRM() { return SIGVTALRM; } +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_UNBLOCK; } +INLINE int __hsposix_SIG_SETMASK() { return SIG_SETMASK; } +#endif /* mingw32_TARGET_OS */ + +// These are wrapped because on some OSs (eg. Linux) they are +// macros which redirect to the 64-bit-off_t versions when large file +// support is enabled. +// +INLINE int __hscore_open(char *file, int how, mode_t mode) { + return (open(file,how,mode)); +} + +INLINE off_t __hscore_lseek(int fd, off_t off, int whence) { + return (lseek(fd,off,whence)); +} + +INLINE int __hscore_stat(char *file, struct stat *buf) { + return (stat(file,buf)); +} + +INLINE int __hscore_fstat(int fd, struct stat *buf) { + return (fstat(fd,buf)); +} + +#if defined(mingw32_TARGET_OS) +INLINE int __hscore_CSIDL_PROFILE() { return CSIDL_PROFILE; } +INLINE int __hscore_CSIDL_APPDATA() { return CSIDL_APPDATA; } +INLINE int __hscore_CSIDL_WINDOWS() { return CSIDL_WINDOWS; } #endif +#endif /* __HSBASE_H__ */ +