summaryrefslogtreecommitdiff
path: root/xpath.c
diff options
context:
space:
mode:
authorBjorn Reese <breese@src.gnome.org>2001-08-21 09:23:53 +0000
committerBjorn Reese <breese@src.gnome.org>2001-08-21 09:23:53 +0000
commit450296070e14629141738fbb34b9a0ad13af1f02 (patch)
treec3e9f2e34493913acd797598ed74d843f8a3dd61 /xpath.c
parent344cee76a675e83ff159ffc02b009f304569ceda (diff)
downloadlibxml2-450296070e14629141738fbb34b9a0ad13af1f02.tar.gz
Re-worked NaN and Inf support
Diffstat (limited to 'xpath.c')
-rw-r--r--xpath.c146
1 files changed, 16 insertions, 130 deletions
diff --git a/xpath.c b/xpath.c
index 2228ff57..984752ac 100644
--- a/xpath.c
+++ b/xpath.c
@@ -30,12 +30,6 @@
#ifdef HAVE_FLOAT_H
#include <float.h>
#endif
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-#ifdef HAVE_NAN_H
-#include <nan.h>
-#endif
#ifdef HAVE_CTYPE_H
#include <ctype.h>
#endif
@@ -57,6 +51,7 @@
#include <libxml/debugXML.h>
#endif
#include <libxml/xmlerror.h>
+#include <libxml/trionan.h>
/* #define DEBUG */
/* #define DEBUG_STEP */
@@ -81,108 +76,6 @@ double xmlXPathNAN = 0;
double xmlXPathPINF = 1;
double xmlXPathNINF = -1;
-#ifndef isinf
-#ifndef HAVE_ISINF
-
-#if HAVE_FPCLASS
-
-int isinf(double d) {
- fpclass_t type = fpclass(d);
- switch (type) {
- case FP_NINF:
- return(-1);
- case FP_PINF:
- return(1);
- }
- return(0);
-}
-
-#elif defined(HAVE_FP_CLASS) || defined(HAVE_FP_CLASS_D)
-
-#if HAVE_FP_CLASS_H
-#include <fp_class.h>
-#endif
-
-int isinf(double d) {
-#if HAVE_FP_CLASS
- int fpclass = fp_class(d);
-#else
- int fpclass = fp_class_d(d);
-#endif
- if (fpclass == FP_POS_INF)
- return(1);
- if (fpclass == FP_NEG_INF)
- return(-1);
- return(0);
-}
-
-#elif defined(HAVE_CLASS)
-
-int isinf(double d) {
- int fpclass = class(d);
- if (fpclass == FP_PLUS_INF)
- return(1);
- if (fpclass == FP_MINUS_INF)
- return(-1);
- return(0);
-}
-#elif defined(finite) || defined(HAVE_FINITE)
-int isinf(double x) { return !finite(x) && x==x; }
-#elif defined(HUGE_VAL)
-int isinf(double x)
-{
- if (x == HUGE_VAL)
- return(1);
- if (x == -HUGE_VAL)
- return(-1);
- return(0);
-}
-#endif
-
-#endif /* ! HAVE_ISINF */
-#endif /* ! defined(isinf) */
-
-#ifndef isnan
-#ifndef HAVE_ISNAN
-
-#ifdef HAVE_ISNAND
-#define isnan(f) isnand(f)
-#endif /* HAVE_iSNAND */
-
-#endif /* ! HAVE_iSNAN */
-#endif /* ! defined(isnan) */
-
-
-/**
- * xmlXPathDivideBy:
- *
- * The best way found so far to generate the NAN, +-INF
- * without hitting a compiler bug or optimization :-\
- *
- * Returns the double resulting from the division
- */
-double
-xmlXPathDivideBy(double f, double fzero) {
- double ret;
-#ifdef HAVE_SIGNAL
-#ifdef SIGFPE
-#ifdef SIG_IGN
- void (*sighandler)(int);
- sighandler = signal(SIGFPE, SIG_IGN);
-#endif
-#endif
-#endif
- ret = f / fzero;
-#ifdef HAVE_SIGNAL
-#ifdef SIGFPE
-#ifdef SIG_IGN
- signal(SIGFPE, sighandler);
-#endif
-#endif
-#endif
- return(ret);
-}
-
/**
* xmlXPathInit:
*
@@ -194,16 +87,9 @@ xmlXPathInit(void) {
if (initialized) return;
-#if defined(HUGE_VAL) && defined(DBL_MAX)
- xmlXPathPINF = (HUGE_VAL == DBL_MAX) ?
- xmlXPathDivideBy(1.0, 0.0) : HUGE_VAL;
- xmlXPathNINF = -xmlXPathPINF;
- xmlXPathNAN = xmlXPathDivideBy(xmlXPathPINF, xmlXPathPINF);
-#else
- xmlXPathNAN = xmlXPathDivideBy(0.0, 0.0);
- xmlXPathPINF = xmlXPathDivideBy(1.0, 0.0);
- xmlXPathNINF = xmlXPathDivideBy(-1.0, 0.0);
-#endif
+ xmlXPathPINF = trio_pinf();
+ xmlXPathNINF = trio_ninf();
+ xmlXPathNAN = trio_nan();
initialized = 1;
}
@@ -640,7 +526,7 @@ xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) {
else fprintf(output, "false\n");
break;
case XPATH_NUMBER:
- switch (isinf(cur->floatval)) {
+ switch (trio_isinf(cur->floatval)) {
case 1:
fprintf(output, "Object is a number : +Infinity\n");
break;
@@ -648,7 +534,7 @@ xmlXPathDebugDumpObject(FILE *output, xmlXPathObjectPtr cur, int depth) {
fprintf(output, "Object is a number : -Infinity\n");
break;
default:
- if (isnan(cur->floatval)) {
+ if (trio_isnan(cur->floatval)) {
fprintf(output, "Object is a number : NaN\n");
} else {
fprintf(output, "Object is a number : %0g\n", cur->floatval);
@@ -1169,7 +1055,7 @@ xmlXPathPopExternal (xmlXPathParserContextPtr ctxt) {
static void
xmlXPathFormatNumber(double number, char buffer[], int buffersize)
{
- switch (isinf(number)) {
+ switch (trio_isinf(number)) {
case 1:
if (buffersize > (int)sizeof("+Infinity"))
sprintf(buffer, "+Infinity");
@@ -1179,7 +1065,7 @@ xmlXPathFormatNumber(double number, char buffer[], int buffersize)
sprintf(buffer, "-Infinity");
break;
default:
- if (isnan(number)) {
+ if (trio_isnan(number)) {
if (buffersize > (int)sizeof("NaN"))
sprintf(buffer, "NaN");
} else {
@@ -2927,7 +2813,7 @@ xmlXPathCastBooleanToString (int val) {
xmlChar *
xmlXPathCastNumberToString (double val) {
xmlChar *ret;
- switch (isinf(val)) {
+ switch (trio_isinf(val)) {
case 1:
ret = xmlStrdup((const xmlChar *) "+Infinity");
break;
@@ -2935,7 +2821,7 @@ xmlXPathCastNumberToString (double val) {
ret = xmlStrdup((const xmlChar *) "-Infinity");
break;
default:
- if (isnan(val)) {
+ if (trio_isnan(val)) {
ret = xmlStrdup((const xmlChar *) "NaN");
} else {
/* could be improved */
@@ -3221,7 +3107,7 @@ xmlXPathConvertNumber(xmlXPathObjectPtr val) {
*/
int
xmlXPathCastNumberToBoolean (double val) {
- if (isnan(val) || (val == 0.0))
+ if (trio_isnan(val) || (val == 0.0))
return(0);
return(1);
}
@@ -3828,13 +3714,13 @@ xmlXPathCompareNodeSets(int inf, int strict,
}
for (i = 0;i < ns1->nodeNr;i++) {
val1 = xmlXPathCastNodeToNumber(ns1->nodeTab[i]);
- if (isnan(val1))
+ if (trio_isnan(val1))
continue;
for (j = 0;j < ns2->nodeNr;j++) {
if (init == 0) {
values2[j] = xmlXPathCastNodeToNumber(ns2->nodeTab[j]);
}
- if (isnan(values2[j]))
+ if (trio_isnan(values2[j]))
continue;
if (inf && strict)
ret = (val1 < values2[j]);
@@ -6291,9 +6177,9 @@ xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) {
CAST_TO_NUMBER;
CHECK_TYPE(XPATH_NUMBER);
- if ((ctxt->value->floatval == xmlXPathNAN) ||
- (ctxt->value->floatval == xmlXPathPINF) ||
- (ctxt->value->floatval == xmlXPathNINF) ||
+ if ((trio_isnan(ctxt->value->floatval)) ||
+ (trio_isinf(ctxt->value->floatval) == 1) ||
+ (trio_isinf(ctxt->value->floatval) == -1) ||
(ctxt->value->floatval == 0.0))
return;