1 /* -----------------------------------------------------------------------------
2 * $Id: HsBase.h,v 1.12 2002/08/30 14:54:58 simonpj Exp $
4 * (c) The University of Glasgow 2001-2002
6 * Definitions for package `core' which are visible in Haskell land.
8 * ---------------------------------------------------------------------------*/
20 #ifdef HAVE_SYS_TYPES_H
21 #include <sys/types.h>
26 #ifdef HAVE_SYS_STAT_H
50 #if defined(HAVE_GETTIMEOFDAY)
51 # ifdef HAVE_SYS_TIME_H
52 # include <sys/time.h>
54 #elif defined(HAVE_GETCLOCK)
55 # ifdef HAVE_SYS_TIMERS_H
57 # include <sys/timers.h>
60 #if defined(HAVE_TIME_H)
63 #ifdef HAVE_SYS_TIMEB_H
64 #include <sys/timeb.h>
69 #ifdef HAVE_SYS_TIMES_H
70 #include <sys/times.h>
72 #if defined(HAVE_WINSOCK_H) && defined(__MINGW32__)
79 #if !defined(mingw32_TARGET_OS) && !defined(irix_TARGET_OS)
80 # if defined(HAVE_SYS_RESOURCE_H)
81 # include <sys/resource.h>
86 #include <sys/syscall.h>
87 #define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b)
88 #define HAVE_GETRUSAGE
92 #ifdef HAVE_SYS_WAIT_H
100 #include "errUtils.h"
102 #if defined(__MINGW32__)
105 #include "timeUtils.h"
112 HsInt systemCmd(HsAddr cmd);
115 HsInt rawSystemCmd(HsAddr cmd);
117 /* in inputReady.c */
118 int inputReady(int fd, int msecs, int isSock);
120 /* -----------------------------------------------------------------------------
121 64-bit operations, defined in longlong.c
122 -------------------------------------------------------------------------- */
124 #ifdef SUPPORT_LONG_LONGS
126 StgInt stg_gtWord64 (StgWord64, StgWord64);
127 StgInt stg_geWord64 (StgWord64, StgWord64);
128 StgInt stg_eqWord64 (StgWord64, StgWord64);
129 StgInt stg_neWord64 (StgWord64, StgWord64);
130 StgInt stg_ltWord64 (StgWord64, StgWord64);
131 StgInt stg_leWord64 (StgWord64, StgWord64);
133 StgInt stg_gtInt64 (StgInt64, StgInt64);
134 StgInt stg_geInt64 (StgInt64, StgInt64);
135 StgInt stg_eqInt64 (StgInt64, StgInt64);
136 StgInt stg_neInt64 (StgInt64, StgInt64);
137 StgInt stg_ltInt64 (StgInt64, StgInt64);
138 StgInt stg_leInt64 (StgInt64, StgInt64);
140 StgWord64 stg_remWord64 (StgWord64, StgWord64);
141 StgWord64 stg_quotWord64 (StgWord64, StgWord64);
143 StgInt64 stg_remInt64 (StgInt64, StgInt64);
144 StgInt64 stg_quotInt64 (StgInt64, StgInt64);
145 StgInt64 stg_negateInt64 (StgInt64);
146 StgInt64 stg_plusInt64 (StgInt64, StgInt64);
147 StgInt64 stg_minusInt64 (StgInt64, StgInt64);
148 StgInt64 stg_timesInt64 (StgInt64, StgInt64);
150 StgWord64 stg_and64 (StgWord64, StgWord64);
151 StgWord64 stg_or64 (StgWord64, StgWord64);
152 StgWord64 stg_xor64 (StgWord64, StgWord64);
153 StgWord64 stg_not64 (StgWord64);
155 StgWord64 stg_uncheckedShiftL64 (StgWord64, StgInt);
156 StgWord64 stg_uncheckedShiftRL64 (StgWord64, StgInt);
157 StgInt64 stg_uncheckedIShiftL64 (StgInt64, StgInt);
158 StgInt64 stg_uncheckedIShiftRL64 (StgInt64, StgInt);
159 StgInt64 stg_uncheckedIShiftRA64 (StgInt64, StgInt);
161 StgInt64 stg_intToInt64 (StgInt);
162 StgInt stg_int64ToInt (StgInt64);
163 StgWord64 stg_int64ToWord64 (StgInt64);
165 StgWord64 stg_wordToWord64 (StgWord);
166 StgWord stg_word64ToWord (StgWord64);
167 StgInt64 stg_word64ToInt64 (StgWord64);
169 StgInt64 stg_integerToInt64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da);
170 StgWord64 stg_integerToWord64 (StgInt sa, StgByteArray /* Really: mp_limb_t* */ da);
172 #endif /* SUPPORT_LONG_LONGS */
174 /* -----------------------------------------------------------------------------
177 These functions are given as inlines here for when compiling via C,
178 but we also generate static versions into the cbits library for
179 when compiling to native code.
180 -------------------------------------------------------------------------- */
183 #define INLINE extern inline
186 #if !defined(mingw32_TARGET_OS)
188 __hscore_sigaddset( sigset_t * set, int s )
189 { return sigaddset(set,s); }
192 INLINE int __hscore_s_isreg(m) { return S_ISREG(m); }
193 INLINE int __hscore_s_isdir(m) { return S_ISDIR(m); }
194 INLINE int __hscore_s_isfifo(m) { return S_ISFIFO(m); }
195 INLINE int __hscore_s_isblk(m) { return S_ISBLK(m); }
196 INLINE int __hscore_s_ischr(m) { return S_ISCHR(m); }
198 INLINE int __hscore_s_issock(m) { return S_ISSOCK(m); }
201 #ifndef mingw32_TARGET_OS
203 __hscore_sigemptyset( sigset_t *set )
204 { sigemptyset(set); }
208 __hscore_memcpy_dst_off( char *dst, int dst_off, char *src, size_t sz )
209 { return memcpy(dst+dst_off, src, sz); }
212 __hscore_memcpy_src_off( char *dst, char *src, int src_off, size_t sz )
213 { return memcpy(dst, src+src_off, sz); }
216 __hscore_supportsTextMode()
218 #if defined(mingw32_TARGET_OS)
219 return HS_BOOL_FALSE;
258 __hscore_o_wronly( void )
268 __hscore_o_rdwr( void )
278 __hscore_o_append( void )
288 __hscore_o_creat( void )
298 __hscore_o_excl( void )
308 __hscore_o_trunc( void )
318 __hscore_o_noctty( void )
328 __hscore_o_nonblock( void )
338 __hscore_seek_set( void )
344 __hscore_seek_end( void )
350 __hscore_setmode( HsInt fd, HsBool toBin )
352 #if defined(__MINGW32__)
353 return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT);
360 __hscore_PrelHandle_write( HsInt fd, HsBool isSock, HsAddr ptr,
363 #if defined(__MINGW32__)
365 return send(fd,ptr + off, sz, 0);
368 return write(fd,ptr + off, sz);
372 __hscore_PrelHandle_read( HsInt fd, HsBool isSock, HsAddr ptr,
375 #if defined(__MINGW32__)
377 return recv(fd,ptr + off, sz, 0);
380 return read(fd,ptr + off, sz);
384 #if defined(__MINGW32__)
386 __hscore_Time_ghcTimezone( void ) { return &_timezone; }
389 __hscore_Time_ghcTzname( void ) { return _tzname; }
393 __hscore_mkdir( HsAddr pathName, HsInt mode )
395 #if defined(__MINGW32__)
396 return mkdir(pathName);
398 return mkdir(pathName,mode);
403 __hscore_lstat( HsAddr fname, HsAddr st )
406 return lstat((const char*)fname, (struct stat*)st);
408 return stat((const char*)fname, (struct stat*)st);
412 INLINE HsInt __hscore_path_max() { return PATH_MAX; }
414 INLINE mode_t __hscore_R_OK() { return R_OK; }
415 INLINE mode_t __hscore_W_OK() { return W_OK; }
416 INLINE mode_t __hscore_X_OK() { return X_OK; }
418 INLINE mode_t __hscore_S_IRUSR() { return S_IRUSR; }
419 INLINE mode_t __hscore_S_IWUSR() { return S_IWUSR; }
420 INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; }
423 __hscore_d_name( struct dirent* d )
425 #ifndef mingw32_TARGET_OS
426 return (HsAddr)(&d->d_name);
428 return (HsAddr)(d->d_name);
433 __hscore_end_of_dir( void )
435 #ifndef mingw32_TARGET_OS
443 __hscore_free_dirent(HsAddr dEnt)
451 __hscore_sizeof_stat( void )
453 return sizeof(struct stat);
456 INLINE time_t __hscore_st_mtime ( struct stat* st ) { return st->st_mtime; }
457 INLINE off_t __hscore_st_size ( struct stat* st ) { return st->st_size; }
458 INLINE mode_t __hscore_st_mode ( struct stat* st ) { return st->st_mode; }
461 INLINE tcflag_t __hscore_lflag( struct termios* ts ) { return ts->c_lflag; }
464 __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; }
466 INLINE unsigned char*
467 __hscore_ptr_c_cc( struct termios* ts )
468 { return (unsigned char*) &ts->c_cc; }
472 __hscore_sizeof_termios( void )
474 #ifndef mingw32_TARGET_OS
475 return sizeof(struct termios);
482 __hscore_sizeof_sigset_t( void )
484 #ifndef mingw32_TARGET_OS
485 return sizeof(sigset_t);
492 __hscore_echo( void )
503 __hscore_tcsanow( void )
514 __hscore_icanon( void )
523 INLINE int __hscore_vmin( void )
532 INLINE int __hscore_vtime( void )
541 INLINE int __hscore_sigttou( void )
550 INLINE int __hscore_sig_block( void )
559 INLINE int __hscore_sig_setmask( void )
569 __hscore_f_getfl( void )
579 __hscore_f_setfl( void )
588 INLINE int __hscore_hs_fileno (FILE *f) { return fileno (f); }