diff --git a/cJSON.c b/cJSON.c index f1c9f4d..3bba46d 100644 --- a/cJSON.c +++ b/cJSON.c @@ -32,6 +32,20 @@ #include #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 + static const char *global_ep; const char *cJSON_GetErrorPtr(void) @@ -207,8 +221,15 @@ static int pow2gt (int 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 INT_SIZE & 0x1000 /* 64 bit */ + x |= x >> 32; +#endif return x + 1; }