#ifndef RUBY_WIN32_H #define RUBY_WIN32_H 1 #if defined(__cplusplus) extern "C" { #if 0 } /* satisfy cc-mode */ #endif #endif RUBY_SYMBOL_EXPORT_BEGIN /* * Copyright (c) 1993, Intergraph Corporation * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the perl README file. * */ /* * Definitions for NT port of Perl */ /* * Ok now we can include the normal include files. */ /* #include conflict with varargs.h? */ #if !defined(WSAAPI) #if defined(__cplusplus) && defined(_MSC_VER) extern "C++" { /* template without extern "C++" */ #endif #if !defined(_WIN64) && !defined(WIN32) #define WIN32 #endif #include #include #if !defined(_MSC_VER) || _MSC_VER >= 1400 #include #endif #if defined(__cplusplus) && defined(_MSC_VER) } #endif #endif /* * We're not using Microsoft's "extensions" to C for * Structured Exception Handling (SEH) so we can nuke these */ #undef try #undef except #undef finally #undef leave #include #include #include #include #include #include #if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200 extern "C++" { /* template without extern "C++" */ #endif #include #if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200 } #endif #include #include #include #ifdef HAVE_SYS_UTIME_H # include #else # include #endif #include #include #if defined __MINGW32__ || __BORLANDC__ >= 0x0580 # include #else # if !defined(_INTPTR_T_DEFINED) # ifdef _WIN64 typedef __int64 intptr_t; # else typedef int intptr_t; # endif # define _INTPTR_T_DEFINED # endif # if !defined(INTPTR_MAX) # ifdef _WIN64 # define INTPTR_MAX 9223372036854775807I64 # else # define INTPTR_MAX 2147483647 # endif # define INTPTR_MIN (-INTPTR_MAX-1) # endif # if !defined(_UINTPTR_T_DEFINED) # ifdef _WIN64 typedef unsigned __int64 uintptr_t; # else typedef unsigned int uintptr_t; # endif # define _UINTPTR_T_DEFINED # endif # if !defined(UINTPTR_MAX) # ifdef _WIN64 # define UINTPTR_MAX 18446744073709551615UI64 # else # define UINTPTR_MAX 4294967295U # endif # endif #endif #ifndef __MINGW32__ # define mode_t int #endif #ifdef HAVE_UNISTD_H # include #endif #define rb_w32_iswinnt() TRUE #define rb_w32_iswin95() FALSE #define WNOHANG -1 typedef int clockid_t; #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #undef getc #undef putc #undef fgetc #undef fputc #undef getchar #undef putchar #undef fgetchar #undef fputchar #undef utime #undef lseek #undef stat #undef fstat #define getc(_stream) rb_w32_getc(_stream) #define getchar() rb_w32_getc(stdin) #define putc(_c, _stream) rb_w32_putc(_c, _stream) #define putchar(_c) rb_w32_putc(_c, stdout) #ifdef RUBY_EXPORT #define fgetc(_stream) getc(_stream) #define fputc(_c, _stream) putc(_c, _stream) #define fgetchar() getchar() #define fputchar(_c) putchar(_c) #define utime(_p, _t) rb_w32_utime(_p, _t) #define lseek(_f, _o, _w) _lseeki64(_f, _o, _w) #define pipe(p) rb_w32_pipe(p) #define open rb_w32_open #define close(h) rb_w32_close(h) #define fclose(f) rb_w32_fclose(f) #define read(f, b, s) rb_w32_read(f, b, s) #define write(f, b, s) rb_w32_write(f, b, s) #define getpid() rb_w32_getpid() #define getppid() rb_w32_getppid() #define sleep(x) rb_w32_Sleep((x)*1000) #define Sleep(msec) (void)rb_w32_Sleep(msec) #define fstati64(fd,st) rb_w32_fstati64(fd,st) #ifdef __BORLANDC__ #define creat(p, m) _creat(p, m) #define eof() _eof() #define filelength(h) _filelength(h) #define mktemp(t) _mktemp(t) #define tell(h) _tell(h) #define _open _sopen #define sopen _sopen #undef fopen #define fopen(p, m) rb_w32_fopen(p, m) #undef fdopen #define fdopen(h, m) rb_w32_fdopen(h, m) #undef fsopen #define fsopen(p, m, sh) rb_w32_fsopen(p, m, sh) #endif /* __BORLANDC__ */ #undef execv #define execv(path,argv) rb_w32_aspawn(P_OVERLAY,path,argv) #if !defined(__BORLANDC__) #undef isatty #define isatty(h) rb_w32_isatty(h) #endif /* __BORLANDC__ */ #undef mkdir #define mkdir(p, m) rb_w32_mkdir(p, m) #undef rmdir #define rmdir(p) rb_w32_rmdir(p) #undef unlink #define unlink(p) rb_w32_unlink(p) #endif /* RUBY_EXPORT */ #if SIZEOF_OFF_T == 8 #define off_t __int64 #define stat stati64 #define fstat(fd,st) fstati64(fd,st) #if defined(__BORLANDC__) #define stati64(path, st) rb_w32_stati64(path, st) #elif !defined(_MSC_VER) || RT_VER < 80 #define stati64 _stati64 #ifndef _stati64 #define _stati64(path, st) rb_w32_stati64(path, st) #endif #else #define stati64 _stat64 #define _stat64(path, st) rb_w32_stati64(path, st) #endif #else #define stat(path,st) rb_w32_stat(path,st) #define fstat(fd,st) rb_w32_fstat(fd,st) extern int rb_w32_stat(const char *, struct stat *); extern int rb_w32_fstat(int, struct stat *); #endif #define access(path,mode) rb_w32_access(path,mode) #define strcasecmp _stricmp #define strncasecmp _strnicmp #define fsync _commit struct timezone; #ifdef __MINGW32__ #undef isascii #define isascii __isascii #endif struct iovec { void *iov_base; size_t iov_len; }; struct msghdr { void *msg_name; int msg_namelen; struct iovec *msg_iov; int msg_iovlen; void *msg_control; int msg_controllen; int msg_flags; }; /* for getifaddrs() and others */ struct ifaddrs { struct ifaddrs *ifa_next; char *ifa_name; u_int ifa_flags; struct sockaddr *ifa_addr; struct sockaddr *ifa_netmask; struct sockaddr *ifa_broadaddr; struct sockaddr *ifa_dstaddr; void *ifa_data; }; #ifdef IF_NAMESIZE #define IFNAMSIZ IF_NAMESIZE #else #define IFNAMSIZ 256 #endif #ifdef IFF_POINTTOPOINT #define IFF_POINTOPOINT IFF_POINTTOPOINT #endif extern DWORD rb_w32_osid(void); extern int rb_w32_cmdvector(const char *, char ***); extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *); extern int flock(int fd, int oper); extern int rb_w32_io_cancelable_p(int); extern int rb_w32_is_socket(int); extern int WSAAPI rb_w32_accept(int, struct sockaddr *, int *); extern int WSAAPI rb_w32_bind(int, const struct sockaddr *, int); extern int WSAAPI rb_w32_connect(int, const struct sockaddr *, int); extern void rb_w32_fdset(int, fd_set*); extern void rb_w32_fdclr(int, fd_set*); extern int rb_w32_fdisset(int, fd_set*); extern int WSAAPI rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); extern int WSAAPI rb_w32_getpeername(int, struct sockaddr *, int *); extern int WSAAPI rb_w32_getsockname(int, struct sockaddr *, int *); extern int WSAAPI rb_w32_getsockopt(int, int, int, char *, int *); extern int WSAAPI rb_w32_ioctlsocket(int, long, u_long *); extern int WSAAPI rb_w32_listen(int, int); extern int WSAAPI rb_w32_recv(int, char *, int, int); extern int WSAAPI rb_w32_recvfrom(int, char *, int, int, struct sockaddr *, int *); extern int WSAAPI rb_w32_send(int, const char *, int, int); extern int WSAAPI rb_w32_sendto(int, const char *, int, int, const struct sockaddr *, int); extern int recvmsg(int, struct msghdr *, int); extern int sendmsg(int, const struct msghdr *, int); extern int WSAAPI rb_w32_setsockopt(int, int, int, const char *, int); extern int WSAAPI rb_w32_shutdown(int, int); extern int WSAAPI rb_w32_socket(int, int, int); extern SOCKET rb_w32_get_osfhandle(int); extern struct hostent *WSAAPI rb_w32_gethostbyaddr(const char *, int, int); extern struct hostent *WSAAPI rb_w32_gethostbyname(const char *); extern int WSAAPI rb_w32_gethostname(char *, int); extern struct protoent *WSAAPI rb_w32_getprotobyname(const char *); extern struct protoent *WSAAPI rb_w32_getprotobynumber(int); extern struct servent *WSAAPI rb_w32_getservbyname(const char *, const char *); extern struct servent *WSAAPI rb_w32_getservbyport(int, const char *); extern int socketpair(int, int, int, int *); extern int getifaddrs(struct ifaddrs **); extern void freeifaddrs(struct ifaddrs *); extern char * rb_w32_getcwd(char *, int); extern char * rb_w32_ugetenv(const char *); extern char * rb_w32_getenv(const char *); extern int rb_w32_rename(const char *, const char *); extern int rb_w32_urename(const char *, const char *); extern char **rb_w32_get_environ(void); extern void rb_w32_free_environ(char **); extern int rb_w32_map_errno(DWORD); extern const char *WSAAPI rb_w32_inet_ntop(int,const void *,char *,size_t); extern DWORD rb_w32_osver(void); extern int chown(const char *, int, int); extern int rb_w32_uchown(const char *, int, int); extern int link(const char *, const char *); extern int rb_w32_ulink(const char *, const char *); extern int gettimeofday(struct timeval *, struct timezone *); extern int clock_gettime(clockid_t, struct timespec *); extern int clock_getres(clockid_t, struct timespec *); extern rb_pid_t waitpid (rb_pid_t, int *, int); extern rb_pid_t rb_w32_spawn(int, const char *, const char*); extern rb_pid_t rb_w32_aspawn(int, const char *, char *const *); extern rb_pid_t rb_w32_aspawn_flags(int, const char *, char *const *, DWORD); extern rb_pid_t rb_w32_uspawn(int, const char *, const char*); extern rb_pid_t rb_w32_uaspawn(int, const char *, char *const *); extern rb_pid_t rb_w32_uaspawn_flags(int, const char *, char *const *, DWORD); extern int kill(int, int); extern int fcntl(int, int, ...); extern rb_pid_t rb_w32_getpid(void); extern rb_pid_t rb_w32_getppid(void); #if !defined(__BORLANDC__) extern int rb_w32_isatty(int); #endif extern int rb_w32_uchdir(const char *); extern int rb_w32_mkdir(const char *, int); extern int rb_w32_umkdir(const char *, int); extern int rb_w32_rmdir(const char *); extern int rb_w32_urmdir(const char *); extern int rb_w32_unlink(const char *); extern int rb_w32_uunlink(const char *); extern int rb_w32_uchmod(const char *, int); extern int rb_w32_stati64(const char *, struct stati64 *); extern int rb_w32_ustati64(const char *, struct stati64 *); extern int rb_w32_access(const char *, int); extern int rb_w32_uaccess(const char *, int); extern char rb_w32_fd_is_text(int); extern int rb_w32_fstati64(int, struct stati64 *); extern int rb_w32_dup2(int, int); #ifdef __BORLANDC__ extern off_t _lseeki64(int, off_t, int); extern FILE *rb_w32_fopen(const char *, const char *); extern FILE *rb_w32_fdopen(int, const char *); extern FILE *rb_w32_fsopen(const char *, const char *, int); #endif #include #if defined _MSC_VER && _MSC_VER >= 1800 && defined INFINITY #pragma warning(push) #pragma warning(disable:4756) static inline float rb_infinity_float(void) { return INFINITY; } #pragma warning(pop) #undef INFINITY #define INFINITY rb_infinity_float() #endif #if !defined __MINGW32__ || defined __NO_ISOCEXT #ifndef isnan #define isnan(x) _isnan(x) #endif static inline int finite(double x) { return _finite(x); } #ifndef copysign #define copysign(a, b) _copysign(a, b) #endif static inline double scalb(double a, long b) { return _scalb(a, b); } #else __declspec(dllimport) extern int finite(double); #endif #if !defined S_IFIFO && defined _S_IFIFO #define S_IFIFO _S_IFIFO #endif #if 0 && defined __BORLANDC__ #undef S_ISDIR #undef S_ISFIFO #undef S_ISBLK #undef S_ISCHR #undef S_ISREG #define S_ISDIR(m) (((unsigned short)(m) & S_IFMT) == S_IFDIR) #define S_ISFIFO(m) (((unsigned short)(m) & S_IFMT) == S_IFIFO) #define S_ISBLK(m) (((unsigned short)(m) & S_IFMT) == S_IFBLK) #define S_ISCHR(m) (((unsigned short)(m) & S_IFMT) == S_IFCHR) #define S_ISREG(m) (((unsigned short)(m) & S_IFMT) == S_IFREG) #endif #if !defined S_IRUSR && !defined __MINGW32__ #define S_IRUSR 0400 #endif #ifndef S_IRGRP #define S_IRGRP 0040 #endif #ifndef S_IROTH #define S_IROTH 0004 #endif #if !defined S_IWUSR && !defined __MINGW32__ #define S_IWUSR 0200 #endif #ifndef S_IWGRP #define S_IWGRP 0020 #endif #ifndef S_IWOTH #define S_IWOTH 0002 #endif #if !defined S_IXUSR && !defined __MINGW32__ #define S_IXUSR 0100 #endif #ifndef S_IXGRP #define S_IXGRP 0010 #endif #ifndef S_IXOTH #define S_IXOTH 0001 #endif /* * define this so we can do inplace editing */ #define SUFFIX extern int rb_w32_ftruncate(int fd, off_t length); extern int rb_w32_truncate(const char *path, off_t length); #undef HAVE_FTRUNCATE #define HAVE_FTRUNCATE 1 #if defined HAVE_FTRUNCATE64 #define ftruncate ftruncate64 #else #define ftruncate rb_w32_ftruncate #endif #undef HAVE_TRUNCATE #define HAVE_TRUNCATE 1 #if defined HAVE_TRUNCATE64 #define truncate truncate64 #else #define truncate rb_w32_truncate #endif #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1800 #define strtoll _strtoi64 #define strtoull _strtoui64 #endif /* * stubs */ extern int ioctl (int, int, ...); extern rb_uid_t getuid (void); extern rb_uid_t geteuid (void); extern rb_gid_t getgid (void); extern rb_gid_t getegid (void); extern int setuid (rb_uid_t); extern int setgid (rb_gid_t); extern int fstati64(int, struct stati64 *); extern char *rb_w32_strerror(int); #ifdef RUBY_EXPORT #define strerror(e) rb_w32_strerror(e) #endif #define PIPE_BUF 1024 #define LOCK_SH 1 #define LOCK_EX 2 #define LOCK_NB 4 #define LOCK_UN 8 #ifndef SIGINT #define SIGINT 2 #endif #ifndef SIGKILL #define SIGKILL 9 #endif /* #undef va_start */ /* #undef va_end */ /* winsock error map */ #include #ifndef EWOULDBLOCK # define EWOULDBLOCK WSAEWOULDBLOCK #endif #ifndef EINPROGRESS # define EINPROGRESS WSAEINPROGRESS #endif #ifndef EALREADY # define EALREADY WSAEALREADY #endif #ifndef ENOTSOCK # define ENOTSOCK WSAENOTSOCK #endif #ifndef EDESTADDRREQ # define EDESTADDRREQ WSAEDESTADDRREQ #endif #ifndef EMSGSIZE # define EMSGSIZE WSAEMSGSIZE #endif #ifndef EPROTOTYPE # define EPROTOTYPE WSAEPROTOTYPE #endif #ifndef ENOPROTOOPT # define ENOPROTOOPT WSAENOPROTOOPT #endif #ifndef EPROTONOSUPPORT # define EPROTONOSUPPORT WSAEPROTONOSUPPORT #endif #ifndef ESOCKTNOSUPPORT # define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #endif #ifndef EOPNOTSUPP # define EOPNOTSUPP WSAEOPNOTSUPP #endif #ifndef EPFNOSUPPORT # define EPFNOSUPPORT WSAEPFNOSUPPORT #endif #ifndef EAFNOSUPPORT # define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #ifndef EADDRINUSE # define EADDRINUSE WSAEADDRINUSE #endif #ifndef EADDRNOTAVAIL # define EADDRNOTAVAIL WSAEADDRNOTAVAIL #endif #ifndef ENETDOWN # define ENETDOWN WSAENETDOWN #endif #ifndef ENETUNREACH # define ENETUNREACH WSAENETUNREACH #endif #ifndef ENETRESET # define ENETRESET WSAENETRESET #endif #ifndef ECONNABORTED # define ECONNABORTED WSAECONNABORTED #endif #ifndef ECONNRESET # define ECONNRESET WSAECONNRESET #endif #ifndef ENOBUFS # define ENOBUFS WSAENOBUFS #endif #ifndef EISCONN # define EISCONN WSAEISCONN #endif #ifndef ENOTCONN # define ENOTCONN WSAENOTCONN #endif #ifndef ESHUTDOWN # define ESHUTDOWN WSAESHUTDOWN #endif #ifndef ETOOMANYREFS # define ETOOMANYREFS WSAETOOMANYREFS #endif #ifndef ETIMEDOUT # define ETIMEDOUT WSAETIMEDOUT #endif #ifndef ECONNREFUSED # define ECONNREFUSED WSAECONNREFUSED #endif #ifndef ELOOP # define ELOOP WSAELOOP #endif /*#define ENAMETOOLONG WSAENAMETOOLONG*/ #ifndef EHOSTDOWN # define EHOSTDOWN WSAEHOSTDOWN #endif #ifndef EHOSTUNREACH # define EHOSTUNREACH WSAEHOSTUNREACH #endif /*#define ENOTEMPTY WSAENOTEMPTY*/ #ifndef EPROCLIM # define EPROCLIM WSAEPROCLIM #endif #ifndef EUSERS # define EUSERS WSAEUSERS #endif #ifndef EDQUOT # define EDQUOT WSAEDQUOT #endif #ifndef ESTALE # define ESTALE WSAESTALE #endif #ifndef EREMOTE # define EREMOTE WSAEREMOTE #endif #define F_DUPFD 0 #if 0 #define F_GETFD 1 #define F_SETFD 2 #define F_GETFL 3 #endif #define F_SETFL 4 #if 0 #define FD_CLOEXEC 1 /* F_GETFD, F_SETFD */ #endif #define O_NONBLOCK 1 #undef FD_SET #define FD_SET(fd, set) do {\ unsigned int i;\ SOCKET s = _get_osfhandle(fd);\ \ for (i = 0; i < (set)->fd_count; i++) {\ if ((set)->fd_array[i] == s) {\ break;\ }\ }\ if (i == (set)->fd_count) {\ if ((set)->fd_count < FD_SETSIZE) {\ (set)->fd_array[i] = s;\ (set)->fd_count++;\ }\ }\ } while(0) #undef FD_CLR #define FD_CLR(f, s) rb_w32_fdclr(f, s) #undef FD_ISSET #define FD_ISSET(f, s) rb_w32_fdisset(f, s) #ifdef RUBY_EXPORT #undef inet_ntop #define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l) #undef accept #define accept(s, a, l) rb_w32_accept(s, a, l) #undef bind #define bind(s, a, l) rb_w32_bind(s, a, l) #undef connect #define connect(s, a, l) rb_w32_connect(s, a, l) #undef select #define select(n, r, w, e, t) rb_w32_select(n, r, w, e, t) #undef getpeername #define getpeername(s, a, l) rb_w32_getpeername(s, a, l) #undef getsockname #define getsockname(s, a, l) rb_w32_getsockname(s, a, l) #undef getsockopt #define getsockopt(s, v, n, o, l) rb_w32_getsockopt(s, v, n, o, l) #undef ioctlsocket #define ioctlsocket(s, c, a) rb_w32_ioctlsocket(s, c, a) #undef listen #define listen(s, b) rb_w32_listen(s, b) #undef recv #define recv(s, b, l, f) rb_w32_recv(s, b, l, f) #undef recvfrom #define recvfrom(s, b, l, f, fr, frl) rb_w32_recvfrom(s, b, l, f, fr, frl) #undef send #define send(s, b, l, f) rb_w32_send(s, b, l, f) #undef sendto #define sendto(s, b, l, f, t, tl) rb_w32_sendto(s, b, l, f, t, tl) #undef setsockopt #define setsockopt(s, v, n, o, l) rb_w32_setsockopt(s, v, n, o, l) #undef shutdown #define shutdown(s, h) rb_w32_shutdown(s, h) #undef socket #define socket(s, t, p) rb_w32_socket(s, t, p) #undef gethostbyaddr #define gethostbyaddr(a, l, t) rb_w32_gethostbyaddr(a, l, t) #undef gethostbyname #define gethostbyname(n) rb_w32_gethostbyname(n) #undef gethostname #define gethostname(n, l) rb_w32_gethostname(n, l) #undef getprotobyname #define getprotobyname(n) rb_w32_getprotobyname(n) #undef getprotobynumber #define getprotobynumber(n) rb_w32_getprotobynumber(n) #undef getservbyname #define getservbyname(n, p) rb_w32_getservbyname(n, p) #undef getservbyport #define getservbyport(p, pr) rb_w32_getservbyport(p, pr) #undef get_osfhandle #define get_osfhandle(h) rb_w32_get_osfhandle(h) #undef getcwd #define getcwd(b, s) rb_w32_getcwd(b, s) #undef getenv #define getenv(n) rb_w32_getenv(n) #undef rename #define rename(o, n) rb_w32_rename(o, n) #undef times #define times(t) rb_w32_times(t) #undef dup2 #define dup2(o, n) rb_w32_dup2(o, n) #endif struct tms { long tms_utime; long tms_stime; long tms_cutime; long tms_cstime; }; int rb_w32_times(struct tms *); struct tm *gmtime_r(const time_t *, struct tm *); struct tm *localtime_r(const time_t *, struct tm *); /* thread stuff */ int rb_w32_sleep(unsigned long msec); int rb_w32_putc(int, FILE*); int rb_w32_getc(FILE*); int rb_w32_open(const char *, int, ...); int rb_w32_uopen(const char *, int, ...); int rb_w32_wopen(const WCHAR *, int, ...); int rb_w32_close(int); int rb_w32_fclose(FILE*); int rb_w32_pipe(int[2]); ssize_t rb_w32_read(int, void *, size_t); ssize_t rb_w32_write(int, const void *, size_t); int rb_w32_utime(const char *, const struct utimbuf *); int rb_w32_uutime(const char *, const struct utimbuf *); long rb_w32_write_console(uintptr_t, int); /* use uintptr_t instead of VALUE because it's not defined yet here */ int WINAPI rb_w32_Sleep(unsigned long msec); int rb_w32_wait_events_blocking(HANDLE *events, int num, DWORD timeout); int rb_w32_time_subtract(struct timeval *rest, const struct timeval *wait); int rb_w32_wrap_io_handle(HANDLE, int); int rb_w32_unwrap_io_handle(int); /* == ***CAUTION*** Since this function is very dangerous, ((*NEVER*)) * lock any HANDLEs(i.e. Mutex, Semaphore, CriticalSection and so on) or, * use anything like rb_thread_call_without_gvl, in asynchronous_func_t. */ typedef uintptr_t (*asynchronous_func_t)(uintptr_t self, int argc, uintptr_t* argv); uintptr_t rb_w32_asynchronize(asynchronous_func_t func, uintptr_t self, int argc, uintptr_t* argv, uintptr_t intrval); RUBY_SYMBOL_EXPORT_END #ifdef __MINGW_ATTRIB_PURE /* License: Ruby's */ /* get rid of bugs in math.h of mingw */ #define frexp(_X, _Y) __extension__ ({\ int intpart_frexp_bug = intpart_frexp_bug;\ double result_frexp_bug = frexp((_X), &intpart_frexp_bug);\ *(_Y) = intpart_frexp_bug;\ result_frexp_bug;\ }) /* License: Ruby's */ #define modf(_X, _Y) __extension__ ({\ double intpart_modf_bug = intpart_modf_bug;\ double result_modf_bug = modf((_X), &intpart_modf_bug);\ *(_Y) = intpart_modf_bug;\ result_modf_bug;\ }) #endif #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ #endif } /* extern "C" { */ #endif #if defined(__MINGW64__) /* * Use powl() instead of broken pow() of x86_64-w64-mingw32. * This workaround will fix test failures in test_bignum.rb, * test_fixnum.rb and test_float.rb etc. */ static inline double rb_w32_pow(double x, double y) { return powl(x, y); } #elif defined(__MINGW64_VERSION_MAJOR) double rb_w32_pow(double x, double y); #endif #if defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__) #define pow rb_w32_pow #endif #endif /* RUBY_WIN32_H */