>From: H.Yamamoto <ocean / m2.ccsnet.ne.jp> >Date: 02.02.2006 06:14:41 >Subject: Re: [PATCH] solaris 10 isinf and ruby_setenv fixes > >>>Hello. >>> >>>>This patch works correctly for me. However there is still the isinf >>trouble >>>>(e.g. configure cannot find isinf on solaris 10) >>> >>>Well, should I commit your patch [ruby-core:7273], >>>or define isinf/isnan in [ruby-core:7151] somewhere? >> >> The below thing seems to be bit kludge to me. I can test it if >> you can send me a patch that has it put somewhere. > >I'm not sure I understand [ruby-core:7151] well, but when I tried following >patch >on TestDrive, > >td189.testdrive.hp.com> ./miniruby -e "p 0.0 / 0.0" >Infinity > >Hmm... OK, I'll commit your patch. We can consider [ruby-core:7151] even after >that. I tested this patch and got the following errors: cc -xO3 -g -mt -fsimple=1 -xbuiltin=%all -xlibmil -xlibmopt -xtarget=opteron -xarch=amd64 -DRUBY_EXPORT -I. -I.. -c ../array.c "../missing.h", line 150: warning: macro redefined: isnan cc -xO3 -g -mt -fsimple=1 -xbuiltin=%all -xlibmil -xlibmopt -xtarget=opteron -xarch=amd64 -DRUBY_EXPORT -I. -I.. -c ../bignum.c "../missing.h", line 150: warning: macro redefined: isnan "/usr/include/ieeefp.h", line 59: syntax error before or at: ! "/usr/include/ieeefp.h", line 59: warning: old-style declaration or incorrect type for: isnan_ld "/usr/include/ieeefp.h", line 59: identifier redefined: isnan_ld current : function(double) returning int previous: function(long double) returning int : "../missing.h", line 156 "/usr/include/ieeefp.h", line 59: syntax error before or at: : "/usr/include/ieeefp.h", line 59: warning: old-style declaration or incorrect type for: isnan_d "/usr/include/ieeefp.h", line 59: identifier redefined: isnan_d current : function(double) returning int previous: function(double) returning int : "../missing.h", line 155 "/usr/include/ieeefp.h", line 59: syntax error before or at: : "/usr/include/ieeefp.h", line 59: warning: old-style declaration or incorrect type for: isnan_f "/usr/include/ieeefp.h", line 59: identifier redefined: isnan_f current : function(double) returning int previous: function(float) returning int : "../missing.h", line 154 "/usr/include/ieeefp.h", line 59: syntax error before or at: ) "/usr/include/ieeefp.h", line 59: warning: syntax error: empty declaration "../bignum.c", line 1309: warning: integer overflow detected: op "<<" cc: acomp failed for ../bignum.c > >Index: configure.in >=================================================================== >RCS file: /src/ruby/configure.in,v >retrieving revision 1.212.2.42 >diff -u -w -b -p -r1.212.2.42 configure.in >--- configure.in 1 Feb 2006 13:27:47 -0000 1.212.2.42 >+++ configure.in 2 Feb 2006 03:57:00 -0000 >@@ -436,7 +436,7 @@ AC_FUNC_FSEEKO >AC_CHECK_FUNCS(ftello) >AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\ >strchr strstr strtoul crypt flock vsnprintf\ >- isnan finite isinf hypot acosh erf) >+ hypot acosh erf) >AC_CHECK_FUNCS(fmod killpg wait4 waitpid syscall chroot fsync getcwd eaccess\ >truncate chsize times utimes fcntl lockf lstat symlink link\ >readlink setitimer setruid seteuid setreuid setresuid\ >Index: missing.h >=================================================================== >RCS file: /src/ruby/missing.h,v >retrieving revision 1.13.2.3 >diff -u -w -b -p -r1.13.2.3 missing.h >--- missing.h 25 Jan 2006 13:30:11 -0000 1.13.2.3 >+++ missing.h 2 Feb 2006 03:58:54 -0000 >@@ -43,9 +43,11 @@ extern int dup2 _((int, int)); >extern int eaccess _((const char*, int)); >#endif > >+/* >#ifndef HAVE_FINITE >extern int finite _((double)); >#endif >+*/ > >#ifndef HAVE_FLOCK >extern int flock _((int, int)); >@@ -66,6 +68,7 @@ extern double erf _((double)); >extern double erfc _((double)); >#endif > >+/* >#ifndef HAVE_ISINF ># if defined(HAVE_FINITE) && defined(HAVE_ISNAN) ># define isinf(x) (!finite(x) && !isnan(x)) >@@ -73,10 +76,13 @@ extern double erfc _((double)); >extern int isinf _((double)); ># endif >#endif >+*/ > >+/* >#ifndef HAVE_ISNAN >extern int isnan _((double)); >#endif >+*/ > >/* >#ifndef HAVE_MEMCMP >@@ -139,4 +145,30 @@ extern int snprintf __((char *, size_t n >extern int vsnprintf _((char *, size_t n, char const *, va_list)); >#endif > >+#ifndef isnan >+# include <math.h> >+# define isnan(x) \ >+ (sizeof (x) == sizeof (long double) ? isnan_ld (x) \ >+ : sizeof (x) == sizeof (double) ? isnan_d (x) \ >+ : isnan_f (x)) >+static inline int isnan_f (float x) { return x != x; } >+static inline int isnan_d (double x) { return x != x; } >+static inline int isnan_ld (long double x) { return x != x; } >+#endif >+ >+# include <math.h> >+# define isinf(x) \ >+ (sizeof (x) == sizeof (long double) ? isinf_ld (x) \ >+ : sizeof (x) == sizeof (double) ? isinf_d (x) \ >+ : isinf_f (x)) >+static inline int isinf_f (float x) { return isnan (x - x); } >+static inline int isinf_d (double x) { return isnan (x - x); } >+static inline int isinf_ld (long double x) { return isnan (x - x); } >+#endif >+ >+# define finite(x) (!isnan(x) && !isinf(x)) >+#endif >+ > > >