Fixed some compatibility issues with C++ compilers.

Added error type to json value types. Also implemented strdup and strndup, since they can be problematic and are not implemented everywhere.
pull/1/head
Krzysztof Gabis 12 years ago
parent 2740213c5c
commit 410807850e
  1. 30
      parson.c
  2. 1
      parson.h
  3. 2
      tests.c

@ -76,6 +76,8 @@ static JSON_Value * json_value_init_boolean(int boolean);
static JSON_Value * json_value_init_null(); static JSON_Value * json_value_init_null();
/* Parser */ /* Parser */
char * parson_strndup(const char *string, size_t n);
char * parson_strdup(const char *string);
static const char * skip_string(const char *string); static const char * skip_string(const char *string);
static char * copy_and_remove_whitespaces(const char *string); static char * copy_and_remove_whitespaces(const char *string);
static int is_utf_string(const char *string); static int is_utf_string(const char *string);
@ -103,13 +105,13 @@ static int json_object_add(JSON_Object *object, const char *name, JSON_Value *va
size_t index; size_t index;
if (object->count >= object->capacity) { if (object->count >= object->capacity) {
size_t new_capacity = object->capacity * 2; size_t new_capacity = object->capacity * 2;
object->names = realloc(object->names, new_capacity * sizeof(const char*)); object->names = (const char**)realloc(object->names, new_capacity * sizeof(const char*));
object->values = realloc(object->values, new_capacity * sizeof(JSON_Value*)); object->values = (JSON_Value**)realloc(object->values, new_capacity * sizeof(JSON_Value*));
object->capacity = new_capacity; object->capacity = new_capacity;
} }
if (json_object_get_value(object, name) != NULL) { return 0; } if (json_object_get_value(object, name) != NULL) { return 0; }
index = object->count; index = object->count;
object->names[index] = strdup(name); object->names[index] = parson_strdup(name);
object->values[index] = value; object->values[index] = value;
object->count++; object->count++;
return 1; return 1;
@ -138,7 +140,7 @@ static JSON_Array * json_array_init() {
static void json_array_add(JSON_Array *array, JSON_Value *value) { static void json_array_add(JSON_Array *array, JSON_Value *value) {
if (array->count >= array->capacity) { if (array->count >= array->capacity) {
size_t new_capacity = array->capacity * 2; size_t new_capacity = array->capacity * 2;
array->items = realloc(array->items, new_capacity * sizeof(JSON_Value*)); array->items = (JSON_Value**)realloc(array->items, new_capacity * sizeof(JSON_Value*));
array->capacity = new_capacity; array->capacity = new_capacity;
} }
array->items[array->count] = value; array->items[array->count] = value;
@ -197,6 +199,16 @@ static JSON_Value * json_value_init_null() {
} }
/* Parser */ /* Parser */
char * parson_strndup(const char *string, size_t n) {
char *output_string = (char*)calloc(n + 1, 1);
strncpy(output_string, string, n);
return output_string;
}
char * parson_strdup(const char *string) {
return parson_strndup(string, strlen(string));
}
static const char * skip_string(const char *string) { static const char * skip_string(const char *string) {
string++; string++;
while (*string != '\0' && *string != '\"') { while (*string != '\0' && *string != '\"') {
@ -234,7 +246,7 @@ static char *copy_and_remove_whitespaces(const char *string) {
} }
} }
*output_string_ptr = '\0'; *output_string_ptr = '\0';
output_string = realloc(output_string, strlen(output_string) + 1); output_string = (char*)realloc(output_string, strlen(output_string) + 1);
return output_string; return output_string;
} }
@ -295,7 +307,7 @@ static const char * parse_escaped_characters(const char *string) {
string_ptr++; string_ptr++;
} }
*output_string_ptr = '\0'; *output_string_ptr = '\0';
output_string = realloc(output_string, strlen(output_string) + 1); output_string = (char*)realloc(output_string, strlen(output_string) + 1);
return output_string; return output_string;
} }
@ -307,7 +319,7 @@ static const char * get_string(const char **string) {
const char *parsed_string; const char *parsed_string;
const char *after_closing_quote_ptr = skip_string(*string); const char *after_closing_quote_ptr = skip_string(*string);
if (after_closing_quote_ptr == NULL) { return NULL; } if (after_closing_quote_ptr == NULL) { return NULL; }
quote_contents = strndup(*string + 1, after_closing_quote_ptr - *string - 2); quote_contents = parson_strndup(*string + 1, after_closing_quote_ptr - *string - 2);
*string = after_closing_quote_ptr; *string = after_closing_quote_ptr;
parsed_string = parse_escaped_characters(quote_contents); parsed_string = parse_escaped_characters(quote_contents);
free(quote_contents); free(quote_contents);
@ -502,7 +514,7 @@ JSON_Value * json_object_dotget_value(const JSON_Object *object, const char *nam
const char *object_name, *dot_position = strchr(name, '.'); const char *object_name, *dot_position = strchr(name, '.');
JSON_Value *output_value; JSON_Value *output_value;
if (dot_position == NULL) { return json_object_get_value(object, name); } if (dot_position == NULL) { return json_object_get_value(object, name); }
object_name = strndup(name, dot_position - name); object_name = parson_strndup(name, dot_position - name);
output_value = json_object_dotget_value(json_object_get_object(object, object_name), output_value = json_object_dotget_value(json_object_get_object(object, object_name),
dot_position + 1); dot_position + 1);
free((void*)object_name); free((void*)object_name);
@ -561,7 +573,7 @@ size_t json_array_get_count(const JSON_Array *array) {
/* JSON Value API */ /* JSON Value API */
enum json_value_type json_value_get_type(const JSON_Value *value) { enum json_value_type json_value_get_type(const JSON_Value *value) {
return value != NULL ? value->type : 0; return value != NULL ? value->type : JSONError;
} }
JSON_Object * json_value_get_object(const JSON_Value *value) { JSON_Object * json_value_get_object(const JSON_Value *value) {

@ -36,6 +36,7 @@ struct json_value_t;
typedef struct json_value_t JSON_Value; typedef struct json_value_t JSON_Value;
enum json_value_type { enum json_value_type {
JSONError = 0,
JSONNull = 1, JSONNull = 1,
JSONString = 2, JSONString = 2,
JSONNumber = 3, JSONNumber = 3,

@ -177,7 +177,7 @@ void print_commit_info(const char *username, const char * repo) {
char curl_command[512]; char curl_command[512];
char cleanup_command[256]; char cleanup_command[256];
char *output_filename = "commits.json"; char output_filename[] = "commits.json";
/* it ain't pretty, but it's not a libcurl tutorial */ /* it ain't pretty, but it's not a libcurl tutorial */
sprintf(curl_command, "curl \"https://api.github.com/repos/%s/%s/commits\"\ sprintf(curl_command, "curl \"https://api.github.com/repos/%s/%s/commits\"\

Loading…
Cancel
Save