Kaynağa Gözat

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.
Max Bruckner 8 yıl önce
ebeveyn
işleme
9f6fa94c91
1 değiştirilmiş dosya ile 15 ekleme ve 36 silme
  1. 15 36
      cJSON.c

+ 15 - 36
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)
     {
     {