mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
Fix float comparison also in cJSON_Utils
This commit is contained in:
parent
e79376f2d9
commit
4c2b3d8949
8
cJSON.c
8
cJSON.c
@ -582,15 +582,15 @@ static void update_offset(printbuffer * const buffer)
|
|||||||
|
|
||||||
/* securely comparison of floating-point variables */
|
/* securely comparison of floating-point variables */
|
||||||
#ifdef CJSON_FLOAT_USE_FLOAT
|
#ifdef CJSON_FLOAT_USE_FLOAT
|
||||||
static cJSON_bool compare_cJSON_float(float a, float b)
|
static cJSON_bool compare_cJSON_float(cJSON_float a, cJSON_float b)
|
||||||
{
|
{
|
||||||
float maxVal = fabsf(a) > fabsf(b) ? fabsf(a) : fabsf(b);
|
cJSON_float maxVal = fabsf(a) > fabsf(b) ? fabsf(a) : fabsf(b);
|
||||||
return (fabsf(a - b) <= maxVal * FLT_EPSILON);
|
return (fabsf(a - b) <= maxVal * FLT_EPSILON);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static cJSON_bool compare_cJSON_float(double a, double b)
|
static cJSON_bool compare_cJSON_float(cJSON_float a, cJSON_float b)
|
||||||
{
|
{
|
||||||
double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
cJSON_float maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
||||||
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -109,12 +109,19 @@ static int compare_strings(const unsigned char *string1, const unsigned char *st
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* securely comparison of floating-point variables */
|
/* securely comparison of floating-point variables */
|
||||||
static cJSON_bool compare_double(double a, double b)
|
#ifdef CJSON_FLOAT_USE_FLOAT
|
||||||
|
static cJSON_bool compare_cJSON_float(cJSON_float a, cJSON_float b)
|
||||||
{
|
{
|
||||||
double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
cJSON_float maxVal = fabsf(a) > fabsf(b) ? fabsf(a) : fabsf(b);
|
||||||
|
return (fabsf(a - b) <= maxVal * FLT_EPSILON);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static cJSON_bool compare_cJSON_float(cJSON_float a, cJSON_float b)
|
||||||
|
{
|
||||||
|
cJSON_float maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
||||||
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */
|
/* Compare the next path element of two JSON pointers, two NULL pointers are considered unequal: */
|
||||||
static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive)
|
static cJSON_bool compare_pointers(const unsigned char *name, const unsigned char *pointer, const cJSON_bool case_sensitive)
|
||||||
@ -612,7 +619,7 @@ static cJSON_bool compare_json(cJSON *a, cJSON *b, const cJSON_bool case_sensiti
|
|||||||
{
|
{
|
||||||
case cJSON_Number:
|
case cJSON_Number:
|
||||||
/* numeric mismatch. */
|
/* numeric mismatch. */
|
||||||
if ((a->valueint != b->valueint) || (!compare_double(a->valuedouble, b->valuedouble)))
|
if ((a->valueint != b->valueint) || (!compare_cJSON_float(a->valuedouble, b->valuedouble)))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1154,7 +1161,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
|
|||||||
switch (from->type & 0xFF)
|
switch (from->type & 0xFF)
|
||||||
{
|
{
|
||||||
case cJSON_Number:
|
case cJSON_Number:
|
||||||
if ((from->valueint != to->valueint) || !compare_double(from->valuedouble, to->valuedouble))
|
if ((from->valueint != to->valueint) || !compare_cJSON_float(from->valuedouble, to->valuedouble))
|
||||||
{
|
{
|
||||||
compose_patch(patches, (const unsigned char*)"replace", path, NULL, to);
|
compose_patch(patches, (const unsigned char*)"replace", path, NULL, to);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user