mirror of
https://github.com/DaveGamble/cJSON
synced 2025-04-27 05:37: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 "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 */
|
||||
typedef int cjbool;
|
||||
#define true ((cjbool)1)
|
||||
@ -223,27 +209,6 @@ double cJSON_SetNumberHelper(cJSON *object, double 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
|
||||
{
|
||||
unsigned char *buffer;
|
||||
@ -278,7 +243,21 @@ static unsigned char* ensure(printbuffer *p, size_t needed)
|
||||
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);
|
||||
if (!newbuffer)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user