summaryrefslogtreecommitdiff
path: root/include/ruby/missing.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ruby/missing.h')
-rw-r--r--include/ruby/missing.h97
1 files changed, 64 insertions, 33 deletions
diff --git a/include/ruby/missing.h b/include/ruby/missing.h
index bded5521d1..4b88c9ea07 100644
--- a/include/ruby/missing.h
+++ b/include/ruby/missing.h
@@ -20,22 +20,41 @@ extern "C" {
#include "ruby/config.h"
#include <stddef.h>
+#include <math.h> /* for INFINITY and NAN */
+#ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
+# include RUBY_ALTERNATIVE_MALLOC_HEADER
+#endif
#ifdef RUBY_EXTCONF_H
#include RUBY_EXTCONF_H
#endif
+#if !defined(HAVE_STRUCT_TIMEVAL) || !defined(HAVE_STRUCT_TIMESPEC)
+#if defined(HAVE_TIME_H)
+# include <time.h>
+#endif
#if defined(HAVE_SYS_TIME_H)
-# include <sys/time.h>
-#elif !defined(_WIN32)
-# define time_t long
+# include <sys/time.h>
+#endif
+#endif
+
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+#ifndef M_PI_2
+# define M_PI_2 (M_PI/2)
+#endif
+
+#ifndef RUBY_SYMBOL_EXPORT_BEGIN
+# define RUBY_SYMBOL_EXPORT_BEGIN /* begin */
+# define RUBY_SYMBOL_EXPORT_END /* end */
+#endif
+
+#if !defined(HAVE_STRUCT_TIMEVAL)
struct timeval {
time_t tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
-#endif
-#if defined(HAVE_SYS_TYPES_H)
-# include <sys/types.h>
-#endif
+#endif /* HAVE_STRUCT_TIMEVAL */
#if !defined(HAVE_STRUCT_TIMESPEC)
struct timespec {
@@ -51,11 +70,6 @@ struct timezone {
};
#endif
-#if defined(HAVE___SYSCALL) && defined(__APPLE__)
-/* Mac OS X has __syscall but doen't defined in headers */
-off_t __syscall(quad_t number, ...);
-#endif
-
#ifdef RUBY_EXPORT
#undef RUBY_EXTERN
#endif
@@ -63,9 +77,7 @@ off_t __syscall(quad_t number, ...);
#define RUBY_EXTERN extern
#endif
-#if defined __GNUC__ && __GNUC__ >= 4
-#pragma GCC visibility push(default)
-#endif
+RUBY_SYMBOL_EXPORT_BEGIN
#ifndef HAVE_ACOSH
RUBY_EXTERN double acosh(double);
@@ -124,20 +136,23 @@ RUBY_EXTERN double lgamma_r(double, int *);
RUBY_EXTERN double cbrt(double);
#endif
-#ifdef INFINITY
-# define HAVE_INFINITY
-#else
+#if !defined(HAVE_INFINITY) || !defined(HAVE_NAN)
+union bytesequence4_or_float {
+ unsigned char bytesequence[4];
+ float float_value;
+};
+#endif
+
+#ifndef INFINITY
/** @internal */
-RUBY_EXTERN const unsigned char rb_infinity[];
-# define INFINITY (*(float *)rb_infinity)
+RUBY_EXTERN const union bytesequence4_or_float rb_infinity;
+# define INFINITY (rb_infinity.float_value)
#endif
-#ifdef NAN
-# define HAVE_NAN
-#else
+#ifndef NAN
/** @internal */
-RUBY_EXTERN const unsigned char rb_nan[];
-# define NAN (*(float *)rb_nan)
+RUBY_EXTERN const union bytesequence4_or_float rb_nan;
+# define NAN (rb_nan.float_value)
#endif
#ifndef isinf
@@ -147,6 +162,8 @@ RUBY_EXTERN const unsigned char rb_nan[];
# include <ieeefp.h>
# endif
# define isinf(x) (!finite(x) && !isnan(x))
+# elif defined(__cplusplus) && __cplusplus >= 201103L
+# include <cmath> // it must include constexpr bool isinf(double);
# else
RUBY_EXTERN int isinf(double);
# endif
@@ -155,10 +172,25 @@ RUBY_EXTERN int isinf(double);
#ifndef isnan
# ifndef HAVE_ISNAN
+# if defined(__cplusplus) && __cplusplus >= 201103L
+# include <cmath> // it must include constexpr bool isnan(double);
+# else
RUBY_EXTERN int isnan(double);
+# endif
# endif
#endif
+#ifndef isfinite
+# ifndef HAVE_ISFINITE
+# define HAVE_ISFINITE 1
+# define isfinite(x) finite(x)
+# endif
+#endif
+
+#ifndef HAVE_NEXTAFTER
+RUBY_EXTERN double nextafter(double x, double y);
+#endif
+
/*
#ifndef HAVE_MEMCMP
RUBY_EXTERN int memcmp(const void *, const void *, size_t);
@@ -188,12 +220,6 @@ RUBY_EXTERN char *strerror(int);
RUBY_EXTERN char *strstr(const char *, const char *);
#endif
-/*
-#ifndef HAVE_STRTOL
-RUBY_EXTERN long strtol(const char *, char **, int);
-#endif
-*/
-
#ifndef HAVE_STRLCPY
RUBY_EXTERN size_t strlcpy(char *, const char*, size_t);
#endif
@@ -223,10 +249,15 @@ RUBY_EXTERN int ruby_close(int);
RUBY_EXTERN void setproctitle(const char *fmt, ...);
#endif
-#if defined __GNUC__ && __GNUC__ >= 4
-#pragma GCC visibility pop
+#ifndef HAVE_EXPLICIT_BZERO
+RUBY_EXTERN void explicit_bzero(void *b, size_t len);
+# if defined SecureZeroMemory
+# define explicit_bzero(b, len) SecureZeroMemory(b, len)
+# endif
#endif
+RUBY_SYMBOL_EXPORT_END
+
#if defined(__cplusplus)
#if 0
{ /* satisfy cc-mode */