mirror of
https://github.com/DaveGamble/cJSON
synced 2025-04-27 13:47:55 +00:00
ensure: replace pow2gt with multiplication by two
This replaces the bit fiddling involved with calculating a new buffer size by just multiplying the required length by two, paving the way to a complete switch to size_t at a later point in time.
This commit is contained in:
parent
123bb1af7b
commit
9f6fa94c91
51
cJSON.c
51
cJSON.c
@ -32,20 +32,6 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
|
|
||||||
/* Determine the number of bits that an integer has using the preprocessor */
|
|
||||||
#if INT_MAX == 32767
|
|
||||||
/* 16 bits */
|
|
||||||
#define INTEGER_SIZE 0x0010
|
|
||||||
#elif INT_MAX == 2147483647
|
|
||||||
/* 32 bits */
|
|
||||||
#define INTEGER_SIZE 0x0100
|
|
||||||
#elif INT_MAX == 9223372036854775807
|
|
||||||
/* 64 bits */
|
|
||||||
#define INTEGER_SIZE 0x1000
|
|
||||||
#else
|
|
||||||
#error "Failed to determine the size of an integer"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* define our own boolean type */
|
/* define our own boolean type */
|
||||||
typedef int cjbool;
|
typedef int cjbool;
|
||||||
#define true ((cjbool)1)
|
#define true ((cjbool)1)
|
||||||
@ -223,27 +209,6 @@ double cJSON_SetNumberHelper(cJSON *object, double number)
|
|||||||
return object->valuedouble = number;
|
return object->valuedouble = number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calculate the next largest power of 2 */
|
|
||||||
static int pow2gt (int x)
|
|
||||||
{
|
|
||||||
--x;
|
|
||||||
|
|
||||||
x |= x >> 1;
|
|
||||||
x |= x >> 2;
|
|
||||||
x |= x >> 4;
|
|
||||||
#if INTEGER_SIZE & 0x1110 /* at least 16 bit */
|
|
||||||
x |= x >> 8;
|
|
||||||
#endif
|
|
||||||
#if INTEGER_SIZE & 0x1100 /* at least 32 bit */
|
|
||||||
x |= x >> 16;
|
|
||||||
#endif
|
|
||||||
#if INTEGER_SIZE & 0x1000 /* 64 bit */
|
|
||||||
x |= x >> 32;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
@ -278,7 +243,21 @@ static unsigned char* ensure(printbuffer *p, size_t needed)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
newsize = (size_t) pow2gt((int)needed);
|
/* calculate new buffer size */
|
||||||
|
newsize = needed * 2;
|
||||||
|
if (newsize > INT_MAX)
|
||||||
|
{
|
||||||
|
/* overflow of int, use INT_MAX if possible */
|
||||||
|
if (needed <= INT_MAX)
|
||||||
|
{
|
||||||
|
newsize = INT_MAX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
newbuffer = (unsigned char*)cJSON_malloc(newsize);
|
newbuffer = (unsigned char*)cJSON_malloc(newsize);
|
||||||
if (!newbuffer)
|
if (!newbuffer)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user