X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FHsBase.h;h=e8b7ae3a3cb501a5307ce4c5043158ca3ffb7c16;hb=ec3ba94b254bd444e7a1c560c1d91c4879948c69;hp=b92303a457b6e9e817c52dd762fa74954c6367cc;hpb=f3dac5d39fabca642d74ebc321361960df7aa943;p=ghc-base.git diff --git a/include/HsBase.h b/include/HsBase.h index b92303a..e8b7ae3 100644 --- a/include/HsBase.h +++ b/include/HsBase.h @@ -1,7 +1,6 @@ /* ----------------------------------------------------------------------------- - * $Id: HsBase.h,v 1.32 2003/10/13 05:09:40 sof Exp $ * - * (c) The University of Glasgow 2001-2002 + * (c) The University of Glasgow 2001-2004 * * Definitions for package `base' which are visible in Haskell land. * @@ -10,128 +9,144 @@ #ifndef __HSBASE_H__ #define __HSBASE_H__ -#include "config.h" +#include "ghcconfig.h" + +#include "HsBaseConfig.h" + +/* ultra-evil... */ +#undef PACKAGE_BUGREPORT +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_VERSION + #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 -#ifdef HAVE_SYS_UTSNAME_H +#if HAVE_SYS_UTSNAME_H #include #endif -#if defined(HAVE_GETTIMEOFDAY) -# ifdef HAVE_SYS_TIME_H +#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 -#if defined(HAVE_WINSOCK_H) && defined(__MINGW32__) +#if HAVE_WINSOCK_H && defined(mingw32_HOST_OS) #include #endif -#ifdef HAVE_LIMITS_H +#if HAVE_LIMITS_H #include #endif -#ifdef HAVE_WCTYPE_H +#if HAVE_WCTYPE_H #include #endif -#if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS) -# if defined(HAVE_SYS_RESOURCE_H) +#if !defined(mingw32_HOST_OS) && !defined(irix_HOST_OS) +# if HAVE_SYS_RESOURCE_H # include # endif #endif -#ifdef hpux_TARGET_OS +#ifdef hpux_HOST_OS #include #define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b) #define HAVE_GETRUSAGE #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" -#if defined(__MINGW32__) +#include "runProcess.h" + +#if defined(mingw32_HOST_OS) #include #include #include "timeUtils.h" +#include +#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); +#if HAVE_SYS_SELECT_H +#include #endif /* in inputReady.c */ int inputReady(int fd, int msecs, int isSock); /* in writeError.c */ -void writeErrString__(HsAddr msg_hdr, HsAddr msg, HsInt len); +void writeErrString__(HsAddr msg, HsInt len); /* in Signals.c */ extern HsInt nocldstop; +#if !defined(mingw32_HOST_OS) +/* in execvpe.c */ +extern int execvpe(char *name, char *const argv[], char **envp); +extern void pPrPr_disableITimers (void); +#endif + /* ----------------------------------------------------------------------------- 64-bit operations, defined in longlong.c -------------------------------------------------------------------------- */ @@ -197,11 +212,16 @@ 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 # 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); } @@ -213,7 +233,7 @@ INLINE int __hscore_s_issock(m) { return S_ISSOCK(m); } #endif #endif -#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER) && !defined(__MINGW32__) +#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) INLINE int __hscore_sigemptyset( sigset_t *set ) { return sigemptyset(set); } @@ -246,7 +266,7 @@ __hscore_memcpy_src_off( char *dst, char *src, int src_off, size_t sz ) INLINE HsBool __hscore_supportsTextMode() { -#if defined(mingw32_TARGET_OS) +#if defined(mingw32_HOST_OS) return HS_BOOL_FALSE; #else return HS_BOOL_TRUE; @@ -377,42 +397,56 @@ __hscore_seek_end( void ) return SEEK_END; } +INLINE int +__hscore_ftruncate( int fd, off_t where ) +{ +#if defined(HAVE_FTRUNCATE) + return ftruncate(fd,where); +#elif defined(HAVE__CHSIZE) + return _chsize(fd,where); +#else +#error at least ftruncate or _chsize functions are required to build +#endif +} + INLINE HsInt __hscore_setmode( HsInt fd, HsBool toBin ) { -#if defined(__MINGW32__) +#if defined(mingw32_HOST_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 ) { -#if defined(__MINGW32__) - if (isSock) { - return send(fd,(char *)ptr + off, sz, 0); - } -#endif 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 ) { -#if defined(__MINGW32__) - if (isSock) { - return recv(fd,(char *)ptr + off, sz, 0); - } -#endif return read(fd,(char *)ptr + off, sz); } -#if defined(__MINGW32__) +#if defined(mingw32_HOST_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_HOST_OS) || defined(_MSC_VER) INLINE long * __hscore_Time_ghcTimezone( void ) { return &_timezone; } @@ -423,7 +457,7 @@ __hscore_Time_ghcTzname( void ) { return _tzname; } INLINE HsInt __hscore_mkdir( HsAddr pathName, HsInt mode ) { -#if defined(__MINGW32__) +#if defined(mingw32_HOST_OS) || defined(_MSC_VER) return mkdir(pathName); #else return mkdir(pathName,mode); @@ -433,7 +467,7 @@ __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); @@ -470,26 +504,16 @@ INLINE mode_t __hscore_S_IWUSR() { return S_IWUSR; } INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; } #endif -#if !defined(_MSC_VER) INLINE HsAddr __hscore_d_name( struct dirent* d ) -{ -#if !defined(mingw32_TARGET_OS) && !defined(__MINGW32__) - return (HsAddr)(&d->d_name); -#else +{ return (HsAddr)(d->d_name); -#endif } -#endif INLINE HsInt __hscore_end_of_dir( void ) { -#ifndef mingw32_TARGET_OS - return 0; -#else - return ENOENT; -#endif + return READDIR_ERRNO_EOF; } INLINE void @@ -519,13 +543,13 @@ 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; } INLINE HsInt __hscore_sizeof_termios( void ) { -#ifndef mingw32_TARGET_OS +#ifndef mingw32_HOST_OS return sizeof(struct termios); #else return 0; @@ -533,15 +557,11 @@ __hscore_sizeof_termios( void ) } #endif -#if !defined(_MSC_VER) && !defined(__MINGW32__) +#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) INLINE HsInt __hscore_sizeof_sigset_t( void ) { -#ifndef mingw32_TARGET_OS return sizeof(sigset_t); -#else - return 0; -#endif } #endif @@ -648,7 +668,7 @@ 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) && !defined(__MINGW32__) +#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) INLINE int __hsposix_SIGABRT() { return SIGABRT; } INLINE int __hsposix_SIGALRM() { return SIGALRM; } INLINE int __hsposix_SIGBUS() { return SIGBUS; } @@ -669,7 +689,7 @@ 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 +#ifdef SIGPOLL INLINE int __hsposix_SIGPOLL() { return SIGPOLL; } #endif INLINE int __hsposix_SIGPROF() { return SIGPROF; } @@ -681,9 +701,100 @@ 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; } -#endif /* mingw32_TARGET_OS */ +INLINE int __hsposix_SIG_UNBLOCK() { return SIG_UNBLOCK; } +INLINE int __hsposix_SIG_SETMASK() { return SIG_SETMASK; } + +#endif /* mingw32_HOST_OS */ + +INLINE int __hscore_open(char *file, int how, mode_t mode) { +#ifdef mingw32_HOST_OS + if ((how & O_WRONLY) || (how & O_RDWR) || (how & O_APPEND)) + return _sopen(file,how,_SH_DENYRW,mode); + else + return _sopen(file,how,_SH_DENYWR,mode); +#else + return open(file,how,mode); +#endif +} + +// 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 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)); +} + +// select-related stuff + +#if !defined(mingw32_HOST_OS) +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); } +INLINE int sizeof_fd_set(void) { return sizeof(fd_set); } +extern void hsFD_ZERO(fd_set *fds); +#endif + +// gettimeofday()-related + +#if !defined(mingw32_HOST_OS) +#define TICK_FREQ 50 + +INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); } + +INLINE HsInt getTicksOfDay(void) +{ + struct timeval tv; + gettimeofday(&tv, (struct timezone *) NULL); + return (tv.tv_sec * TICK_FREQ + + tv.tv_usec * TICK_FREQ / 1000000); +} + +INLINE void setTimevalTicks(struct timeval *p, HsInt ticks) +{ + p->tv_sec = ticks / TICK_FREQ; + p->tv_usec = (ticks % TICK_FREQ) * (1000000 / TICK_FREQ); +} +#endif // !defined(mingw32_HOST_OS) + +// Directory-related + +#if defined(mingw32_HOST_OS) + +/* Make sure we've got the reqd CSIDL_ constants in scope; + * w32api header files are lagging a bit in defining the full set. + */ +#if !defined(CSIDL_APPDATA) +#define CSIDL_APPDATA 0x001a +#endif +#if !defined(CSIDL_PERSONAL) +#define CSIDL_PERSONAL 0x0005 +#endif +#if !defined(CSIDL_PROFILE) +#define CSIDL_PROFILE 0x0028 +#endif +#if !defined(CSIDL_WINDOWS) +#define CSIDL_WINDOWS 0x0024 +#endif + +INLINE int __hscore_CSIDL_PROFILE() { return CSIDL_PROFILE; } +INLINE int __hscore_CSIDL_APPDATA() { return CSIDL_APPDATA; } +INLINE int __hscore_CSIDL_WINDOWS() { return CSIDL_WINDOWS; } +INLINE int __hscore_CSIDL_PERSONAL() { return CSIDL_PERSONAL; } +#endif + +/* ToDo: write a feature test that doesn't assume 'environ' to + * be in scope at link-time. */ +extern char** environ; +INLINE char **__hscore_environ() { return environ; } #endif /* __HSBASE_H__ */