endif
PIC_FLAGS = -fPIC
-R_CFLAGS = $(PIC_FLAGS) -pedantic -Wall -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wc++-compat -Wundef -Wswitch-default -Wconversion -Wfloat-equal $(CFLAGS)
+R_CFLAGS = $(PIC_FLAGS) -pedantic -Wall -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wc++-compat -Wundef -Wswitch-default -Wconversion $(CFLAGS)
uname := $(shell sh -c 'uname -s 2>/dev/null || echo false')
#include <stdlib.h>
#include <limits.h>
#include <ctype.h>
+#include <float.h>
#ifdef ENABLE_LOCALES
#include <locale.h>
#endif
#define false ((cJSON_bool)0)
+/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */
+#ifndef isinf
+#define isinf(d) (isnan((d - d)) && !isnan(d))
+#endif
+#ifndef isnan
+#define isnan(d) (d != d)
+#endif
+
typedef struct {
const unsigned char *json;
size_t position;
/* securely comparison of floating-point variables */
static cJSON_bool compare_double(double a, double b)
{
- return (fabs(a - b) <= CJSON_DOUBLE_PRECISION);
+ double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
+ return (fabs(a - b) <= maxVal * DBL_EPSILON);
}
/* Render the number nicely from the given item into a string. */
}
/* This checks for NaN and Infinity */
- if ((d * 0) != 0)
+ if (isnan(d) || isinf(d))
{
length = sprintf((char*)number_buffer, "null");
}
#define CJSON_NESTING_LIMIT 1000
#endif
-/* Precision of double variables comparison */
-#ifndef CJSON_DOUBLE_PRECISION
-#define CJSON_DOUBLE_PRECISION .0000000000000001
-#endif
-
/* returns the version of cJSON as a string */
CJSON_PUBLIC(const char*) cJSON_Version(void);
#include <stdio.h>
#include <limits.h>
#include <math.h>
+#include <float.h>
+#include <math.h>
#if defined(_MSC_VER)
#pragma warning (pop)
/* securely comparison of floating-point variables */
static cJSON_bool compare_double(double a, double b)
{
- return (fabs(a - b) <= CJSON_DOUBLE_PRECISION);
+ double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
+ return (fabs(a - b) <= maxVal * DBL_EPSILON);
}