summaryrefslogtreecommitdiffstats
path: root/src/sql/drivers/psql
diff options
context:
space:
mode:
authorBill King <bill.king@nokia.com>2009-07-08 23:41:21 (GMT)
committerBill King <bill.king@nokia.com>2009-07-08 23:41:21 (GMT)
commit53228e1b1993524fb1422a8363647b468b3c7c8d (patch)
tree2adf3ed0cae75cf3beeefbc1010d4e7dd576ac7b /src/sql/drivers/psql
parent48f049d6fbddd60d99fb6ebc15fd5b52a3b515ec (diff)
downloadQt-53228e1b1993524fb1422a8363647b468b3c7c8d.zip
Qt-53228e1b1993524fb1422a8363647b468b3c7c8d.tar.gz
Qt-53228e1b1993524fb1422a8363647b468b3c7c8d.tar.bz2
Hopefully fix isnan/isinf for good (for all platforms)
Diffstat (limited to 'src/sql/drivers/psql')
-rw-r--r--src/sql/drivers/psql/qsql_psql.cpp32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp
index 33f2e2b..4eccf4b 100644
--- a/src/sql/drivers/psql/qsql_psql.cpp
+++ b/src/sql/drivers/psql/qsql_psql.cpp
@@ -59,21 +59,29 @@
#include <pg_config.h>
#include <stdlib.h>
-#if defined(_MSC_VER)
-#include <float.h>
-#define isnan(x) _isnan(x)
-int isinf(double x)
-{
- if(_fpclass(x) == _FPCLASS_NINF)
- return -1;
- else if(_fpclass(x) == _FPCLASS_PINF)
- return 1;
- else return 0;
-}
-#else
#include <math.h>
+// below code taken from an example at http://www.gnu.org/software/hello/manual/autoconf/Function-Portability.html
+#ifndef isnan
+ # 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
+#ifndef isinf
+ # 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
+
+
// workaround for postgres defining their OIDs in a private header file
#define QBOOLOID 16
#define QINT8OID 20