diff --git a/parson.c b/parson.c index 5712848..73047f1 100644 --- a/parson.c +++ b/parson.c @@ -37,6 +37,7 @@ #define sizeof_token(a) (sizeof(a) - 1) #define skip_char(str) ((*str)++) #define skip_whitespaces(str) while (isspace(**string)) { skip_char(string); } +#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define parson_malloc(a) malloc(a) #define parson_free(a) free((void*)a) @@ -139,11 +140,9 @@ static int is_decimal(const char *string, size_t length) { static JSON_Object * json_object_init(void) { JSON_Object *new_obj = (JSON_Object*)parson_malloc(sizeof(JSON_Object)); if (!new_obj) { return NULL; } - new_obj->names = (const char**)parson_malloc(sizeof(char*) * STARTING_CAPACITY); - if (!new_obj->names) { parson_free(new_obj); return NULL; } - new_obj->values = (JSON_Value**)parson_malloc(sizeof(JSON_Value*) * STARTING_CAPACITY); - if (!new_obj->values) { parson_free(new_obj->names); parson_free(new_obj); return NULL; } - new_obj->capacity = STARTING_CAPACITY; + new_obj->names = (const char**)NULL; + new_obj->values = (JSON_Value**)NULL; + new_obj->capacity = 0; new_obj->count = 0; return new_obj; } @@ -151,7 +150,7 @@ static JSON_Object * json_object_init(void) { static int json_object_add(JSON_Object *object, const char *name, JSON_Value *value) { size_t index; if (object->count >= object->capacity) { - size_t new_capacity = object->capacity * 2; + size_t new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY); if (new_capacity > OBJECT_MAX_CAPACITY) { return ERROR; } if (json_object_resize(object, new_capacity) == ERROR) { return ERROR; } } @@ -195,16 +194,15 @@ static void json_object_free(JSON_Object *object) { static JSON_Array * json_array_init(void) { JSON_Array *new_array = (JSON_Array*)parson_malloc(sizeof(JSON_Array)); if (!new_array) { return NULL; } - new_array->items = (JSON_Value**)parson_malloc(STARTING_CAPACITY * sizeof(JSON_Value*)); - if (!new_array->items) { parson_free(new_array); return NULL; } - new_array->capacity = STARTING_CAPACITY; + new_array->items = (JSON_Value**)NULL; + new_array->capacity = 0; new_array->count = 0; return new_array; } static int json_array_add(JSON_Array *array, JSON_Value *value) { if (array->count >= array->capacity) { - size_t new_capacity = array->capacity * 2; + size_t new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY); if (new_capacity > ARRAY_MAX_CAPACITY) { return ERROR; } if (!json_array_resize(array, new_capacity)) { return ERROR; } }