X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FHsBase.h;h=6471aa1c82f6c895051c2529cf70a2770fcf43f8;hb=1e076454862442966918e6b1b9095e43eab7c770;hp=1af22ca4f0214a3bd0be4fa1f619a6920eba7554;hpb=e0b4718ee302c4349eb892369b63098bc1e02488;p=ghc-base.git diff --git a/include/HsBase.h b/include/HsBase.h index 1af22ca..6471aa1 100644 --- a/include/HsBase.h +++ b/include/HsBase.h @@ -11,21 +11,15 @@ #include "ghcconfig.h" -/* redefined in HsBaseConfig.h */ -#ifdef PACKAGE_NAME -# undef PACKAGE_NAME -#endif -#ifdef PACKAGE_STRING -# undef PACKAGE_STRING -#endif -#ifdef PACKAGE_BUGREPORT -# undef PACKAGE_BUGREPORT -#endif -#ifdef PACKAGE_TARNAME -# undef PACKAGE_TARNAME -#endif - #include "HsBaseConfig.h" + +/* ultra-evil... */ +#undef PACKAGE_BUGREPORT +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_VERSION + #include "HsFFI.h" #include @@ -92,7 +86,7 @@ #if HAVE_SYS_TIMES_H #include #endif -#if HAVE_WINSOCK_H && defined(mingw32_TARGET_OS) +#if HAVE_WINSOCK_H && defined(mingw32_HOST_OS) #include #endif #if HAVE_LIMITS_H @@ -102,13 +96,13 @@ #include #endif -#if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS) +#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 @@ -123,26 +117,29 @@ #endif #include "lockFile.h" #include "dirUtils.h" +#include "WCsubst.h" #include "runProcess.h" -#if defined(mingw32_TARGET_OS) +#if defined(mingw32_HOST_OS) #include #include #include "timeUtils.h" #include +#include +#endif + +#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, HsInt len); - /* in Signals.c */ extern HsInt nocldstop; -#if !defined(mingw32_TARGET_OS) +#if !defined(mingw32_HOST_OS) /* in execvpe.c */ extern int execvpe(char *name, char *const argv[], char **envp); extern void pPrPr_disableITimers (void); @@ -234,7 +231,7 @@ INLINE int __hscore_s_issock(m) { return S_ISSOCK(m); } #endif #endif -#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER) +#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) INLINE int __hscore_sigemptyset( sigset_t *set ) { return sigemptyset(set); } @@ -267,7 +264,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; @@ -398,10 +395,22 @@ __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_TARGET_OS) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(_MSC_VER) return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT); #else return 0; @@ -421,7 +430,7 @@ __hscore_PrelHandle_read( HsInt fd, HsAddr ptr, HsInt off, int sz ) } -#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(_MSC_VER) INLINE HsInt __hscore_PrelHandle_send( HsInt fd, HsAddr ptr, HsInt off, int sz ) { @@ -435,7 +444,7 @@ __hscore_PrelHandle_recv( HsInt fd, HsAddr ptr, HsInt off, int sz ) } #endif -#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(_MSC_VER) INLINE long * __hscore_Time_ghcTimezone( void ) { return &_timezone; } @@ -446,7 +455,7 @@ __hscore_Time_ghcTzname( void ) { return _tzname; } INLINE HsInt __hscore_mkdir( HsAddr pathName, HsInt mode ) { -#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(_MSC_VER) return mkdir(pathName); #else return mkdir(pathName,mode); @@ -496,11 +505,7 @@ INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; } INLINE HsAddr __hscore_d_name( struct dirent* d ) { -#if defined(STRUCT_DIRENT_FLAT_LAYOUT) - return (HsAddr)(&d->d_name); -#else return (HsAddr)(d->d_name); -#endif } INLINE HsInt @@ -542,7 +547,7 @@ __hscore_ptr_c_cc( struct termios* ts ) INLINE HsInt __hscore_sizeof_termios( void ) { -#ifndef mingw32_TARGET_OS +#ifndef mingw32_HOST_OS return sizeof(struct termios); #else return 0; @@ -550,7 +555,7 @@ __hscore_sizeof_termios( void ) } #endif -#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER) +#if !defined(mingw32_HOST_OS) && !defined(_MSC_VER) INLINE HsInt __hscore_sizeof_sigset_t( void ) { @@ -661,52 +666,21 @@ 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; } -#ifdef 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 */ +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 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)); } @@ -719,7 +693,41 @@ INLINE int __hscore_fstat(int fd, struct stat *buf) { return (fstat(fd,buf)); } -#if defined(mingw32_TARGET_OS) +// 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. @@ -743,5 +751,10 @@ 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__ */