port: Add an isfinite() implementation for Solaris.
Francois Gouget
fgouget at free.fr
Fri Nov 29 08:06:33 CST 2013
---
configure | 36 +++++++++++++++++++++++++++++-
configure.ac | 11 +++++++++-
dlls/msvcrt/math.c | 61 ++++++++++++++++++++++-----------------------------
include/config.h.in | 6 ++---
include/wine/port.h | 4 ++++
libs/port/Makefile.in | 1 +
libs/port/isfinite.c | 46 ++++++++++++++++++++++++++++++++++++++
7 files changed, 125 insertions(+), 40 deletions(-)
create mode 100644 libs/port/isfinite.c
diff --git a/configure b/configure
index 69c181f..80348f3 100755
--- a/configure
+++ b/configure
@@ -14056,7 +14056,6 @@ for ac_func in \
dlopen \
epoll_create \
ffs \
- finite \
fnmatch \
fork \
fpclass \
@@ -15797,6 +15796,41 @@ fi
ac_save_LIBS="$LIBS"
LIBS="$LIBS -lm"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5
+$as_echo_n "checking for isfinite... " >&6; }
+if ${ac_cv_have_isfinite+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <math.h>
+int
+main ()
+{
+float f = 0.0; return isfinite(f)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_have_isfinite="yes"
+else
+ ac_cv_have_isfinite="no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_isfinite" >&5
+$as_echo "$ac_cv_have_isfinite" >&6; }
+if test "$ac_cv_have_isfinite" = "yes"
+then
+
+$as_echo "#define HAVE_ISFINITE 1" >>confdefs.h
+
+fi
+
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS -lm"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5
$as_echo_n "checking for isinf... " >&6; }
if ${ac_cv_have_isinf+:} false; then :
diff --git a/configure.ac b/configure.ac
index e7f9988..81b7027 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2050,7 +2050,6 @@ AC_CHECK_FUNCS(\
dlopen \
epoll_create \
ffs \
- finite \
fnmatch \
fork \
fpclass \
@@ -2551,6 +2550,16 @@ then
AC_DEFINE(HAVE_DAYLIGHT, 1, [Define if you have the daylight variable])
fi
+dnl Check for isfinite
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS -lm"
+AC_CACHE_CHECK([for isfinite], ac_cv_have_isfinite,
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; return isfinite(f)]])],[ac_cv_have_isfinite="yes"],[ac_cv_have_isfinite="no"]))
+if test "$ac_cv_have_isfinite" = "yes"
+then
+ AC_DEFINE(HAVE_ISFINITE, 1, [Define to 1 if you have the `isfinite' function.])
+fi
+
dnl Check for isinf
ac_save_LIBS="$LIBS"
LIBS="$LIBS -lm"
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 68b0dfe..4ec225c 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
+#include "wine/port.h"
#include <stdio.h>
#define __USE_ISOC9X 1
@@ -33,16 +34,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
-#ifndef HAVE_FINITE
-#ifndef finite /* Could be a macro */
-#ifdef isfinite
-#define finite(x) isfinite(x)
-#else
-#define finite(x) (!isnan(x)) /* At least catch some cases */
-#endif
-#endif
-#endif
-
#ifndef signbit
#define signbit(x) 0
#endif
@@ -336,7 +327,7 @@ double CDECL MSVCRT_modff( float x, float *iptr )
*/
double CDECL MSVCRT_acos( double x )
{
- if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
/* glibc implements acos() as the FPU equivalent of atan2(sqrt(1 - x ^ 2), x).
* asin() uses a similar construction. This is bad because as x gets nearer to
* 1 the error in the expression "1 - x^2" can get relatively large due to
@@ -350,7 +341,7 @@ double CDECL MSVCRT_acos( double x )
*/
double CDECL MSVCRT_asin( double x )
{
- if (x < -1.0 || x > 1.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < -1.0 || x > 1.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2(x, sqrt((1 - x) * (1 + x)));
}
@@ -359,7 +350,7 @@ double CDECL MSVCRT_asin( double x )
*/
double CDECL MSVCRT_atan( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan(x);
}
@@ -368,7 +359,7 @@ double CDECL MSVCRT_atan( double x )
*/
double CDECL MSVCRT_atan2( double x, double y )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return atan2(x,y);
}
@@ -377,7 +368,7 @@ double CDECL MSVCRT_atan2( double x, double y )
*/
double CDECL MSVCRT_cos( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return cos(x);
}
@@ -386,7 +377,7 @@ double CDECL MSVCRT_cos( double x )
*/
double CDECL MSVCRT_cosh( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return cosh(x);
}
@@ -395,7 +386,7 @@ double CDECL MSVCRT_cosh( double x )
*/
double CDECL MSVCRT_exp( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return exp(x);
}
@@ -404,7 +395,7 @@ double CDECL MSVCRT_exp( double x )
*/
double CDECL MSVCRT_fmod( double x, double y )
{
- if (!finite(x) || !finite(y)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x) || !isfinite(y)) *MSVCRT__errno() = MSVCRT_EDOM;
return fmod(x,y);
}
@@ -413,7 +404,7 @@ double CDECL MSVCRT_fmod( double x, double y )
*/
double CDECL MSVCRT_log( double x)
{
- if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < 0.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE;
return log(x);
}
@@ -423,7 +414,7 @@ double CDECL MSVCRT_log( double x)
*/
double CDECL MSVCRT_log10( double x )
{
- if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < 0.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
if (x == 0.0) *MSVCRT__errno() = MSVCRT_ERANGE;
return log10(x);
}
@@ -435,7 +426,7 @@ double CDECL MSVCRT_pow( double x, double y )
{
/* FIXME: If x < 0 and y is not integral, set EDOM */
double z = pow(x,y);
- if (!finite(z)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(z)) *MSVCRT__errno() = MSVCRT_EDOM;
return z;
}
@@ -444,7 +435,7 @@ double CDECL MSVCRT_pow( double x, double y )
*/
double CDECL MSVCRT_sin( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sin(x);
}
@@ -453,7 +444,7 @@ double CDECL MSVCRT_sin( double x )
*/
double CDECL MSVCRT_sinh( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sinh(x);
}
@@ -462,7 +453,7 @@ double CDECL MSVCRT_sinh( double x )
*/
double CDECL MSVCRT_sqrt( double x )
{
- if (x < 0.0 || !finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (x < 0.0 || !isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return sqrt(x);
}
@@ -471,7 +462,7 @@ double CDECL MSVCRT_sqrt( double x )
*/
double CDECL MSVCRT_tan( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tan(x);
}
@@ -480,7 +471,7 @@ double CDECL MSVCRT_tan( double x )
*/
double CDECL MSVCRT_tanh( double x )
{
- if (!finite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(x)) *MSVCRT__errno() = MSVCRT_EDOM;
return tanh(x);
}
@@ -698,7 +689,7 @@ int CDECL MSVCRT__fpclass(double num)
}
return signbit(num) ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN;
#else
- if (!finite(num))
+ if (!isfinite(num))
return MSVCRT__FPCLASS_QNAN;
return num == 0.0 ? MSVCRT__FPCLASS_PZ : (num < 0 ? MSVCRT__FPCLASS_NN : MSVCRT__FPCLASS_PN);
#endif
@@ -787,7 +778,7 @@ __int64 CDECL _abs64( __int64 n )
*/
double CDECL MSVCRT__logb(double num)
{
- if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
return logb(num);
}
@@ -796,7 +787,7 @@ double CDECL MSVCRT__logb(double num)
*/
double CDECL MSVCRT__scalb(double num, MSVCRT_long power)
{
- if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
return ldexp(num, power);
}
@@ -996,7 +987,7 @@ double CDECL MSVCRT_ldexp(double num, MSVCRT_long exp)
{
double z = ldexp(num,exp);
- if (!finite(z))
+ if (!isfinite(z))
*MSVCRT__errno() = MSVCRT_ERANGE;
else if (z == 0 && signbit(z))
z = 0.0; /* Convert -0 -> +0 */
@@ -1226,7 +1217,7 @@ double CDECL MSVCRT__copysign(double num, double sign)
*/
int CDECL MSVCRT__finite(double num)
{
- return (finite(num)?1:0); /* See comment for _isnan() */
+ return (isfinite(num)?1:0); /* See comment for _isnan() */
}
/*********************************************************************
@@ -1291,7 +1282,7 @@ double CDECL MSVCRT__jn(int n, double num)
double CDECL MSVCRT__y0(double num)
{
double retval;
- if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
retval = y0(num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
@@ -1307,7 +1298,7 @@ double CDECL MSVCRT__y0(double num)
double CDECL MSVCRT__y1(double num)
{
double retval;
- if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
retval = y1(num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
@@ -1323,7 +1314,7 @@ double CDECL MSVCRT__y1(double num)
double CDECL MSVCRT__yn(int order, double num)
{
double retval;
- if (!finite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
retval = yn(order,num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
@@ -1339,7 +1330,7 @@ double CDECL MSVCRT__yn(int order, double num)
double CDECL MSVCRT__nextafter(double num, double next)
{
double retval;
- if (!finite(num) || !finite(next)) *MSVCRT__errno() = MSVCRT_EDOM;
+ if (!isfinite(num) || !isfinite(next)) *MSVCRT__errno() = MSVCRT_EDOM;
retval = nextafter(num,next);
return retval;
}
diff --git a/include/config.h.in b/include/config.h.in
index 54dceba..a14db5b 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -111,9 +111,6 @@
/* Define to 1 if you have the `ffs' function. */
#undef HAVE_FFS
-/* Define to 1 if you have the `finite' function. */
-#undef HAVE_FINITE
-
/* Define to 1 if you have the <float.h> header file. */
#undef HAVE_FLOAT_H
@@ -294,6 +291,9 @@
/* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H
+/* Define to 1 if you have the `isfinite' function. */
+#undef HAVE_ISFINITE
+
/* Define to 1 if you have the `isinf' function. */
#undef HAVE_ISINF
diff --git a/include/wine/port.h b/include/wine/port.h
index c5359dd..406f190 100644
--- a/include/wine/port.h
+++ b/include/wine/port.h
@@ -260,6 +260,10 @@ extern int getopt_long_only (int ___argc, char *const *___argv,
int ffs( int x );
#endif
+#ifndef HAVE_ISFINITE
+int isfinite(double x);
+#endif
+
#ifndef HAVE_ISINF
int isinf(double x);
#endif
diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in
index bcf4c66..f59862c 100644
--- a/libs/port/Makefile.in
+++ b/libs/port/Makefile.in
@@ -7,6 +7,7 @@ C_SRCS = \
getopt.c \
getopt1.c \
interlocked.c \
+ isfinite.c \
isinf.c \
isnan.c \
lstat.c \
diff --git a/libs/port/isfinite.c b/libs/port/isfinite.c
new file mode 100644
index 0000000..0ff6bff
--- /dev/null
+++ b/libs/port/isfinite.c
@@ -0,0 +1,46 @@
+/*
+ * isfinite function
+ *
+ * Copyright 2013 Francois Gouget
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#ifndef HAVE_ISFINITE
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+int isfinite(double x)
+{
+ return finite(x);
+}
+
+#elif defined(HAVE_FLOAT_H) && defined(HAVE__FINITE)
+#include <float.h>
+
+int isfinite(double x)
+{
+ return _finite(x);
+}
+
+#else
+#error No isfinite() implementation available.
+#endif
+
+#endif /* HAVE_ISFINITE */
--
1.8.4.2
More information about the wine-patches
mailing list