* Add casts from void* to type of assignment when using malloc
* Add #ifdef __cplusplus guards to all of the headers
* Add typedefs for json_object, json_tokener, array_list, printbuf, lh_table
Michael Clark, <michael@metaparadigm.com>
git-svn-id: http://svn.metaparadigm.com/svn/json-c/trunk@33 327403b1-1117-474d-bef2-5cb71233fd97
tags/json-c-0.10-20120530
| @@ -1,5 +1,8 @@ | |||||
| 0.9 | 0.9 | ||||
| * Don't use this as a variable, so we can compile with a C++ compiler | * Don't use this as a variable, so we can compile with a C++ compiler | ||||
| * Add casts from void* to type of assignment when using malloc | |||||
| * Add #ifdef __cplusplus guards to all of the headers | |||||
| * Add typedefs for json_object, json_tokener, array_list, printbuf, lh_table | |||||
| Michael Clark, <michael@metaparadigm.com> | Michael Clark, <michael@metaparadigm.com> | ||||
| * Null pointer dereference fix. Fix json_object_get_boolean strlen test | * Null pointer dereference fix. Fix json_object_get_boolean strlen test | ||||
| to not return TRUE for zero length string. Remove redundant includes. | to not return TRUE for zero length string. Remove redundant includes. | ||||
| @@ -28,11 +28,12 @@ array_list_new(array_list_free_fn *free_fn) | |||||
| { | { | ||||
| struct array_list *arr; | struct array_list *arr; | ||||
| if(!(arr = calloc(1, sizeof(struct array_list)))) return NULL; | |||||
| arr = (struct array_list*)calloc(1, sizeof(struct array_list)); | |||||
| if(!arr) return NULL; | |||||
| arr->size = ARRAY_LIST_DEFAULT_SIZE; | arr->size = ARRAY_LIST_DEFAULT_SIZE; | ||||
| arr->length = 0; | arr->length = 0; | ||||
| arr->free_fn = free_fn; | arr->free_fn = free_fn; | ||||
| if(!(arr->array = calloc(sizeof(void*), arr->size))) { | |||||
| if(!(arr->array = (void**)calloc(sizeof(void*), arr->size))) { | |||||
| free(arr); | free(arr); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| @@ -64,7 +65,7 @@ static int array_list_expand_internal(struct array_list *arr, int max) | |||||
| if(max < arr->size) return 0; | if(max < arr->size) return 0; | ||||
| new_size = max(arr->size << 1, max); | new_size = max(arr->size << 1, max); | ||||
| if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1; | if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1; | ||||
| arr->array = t; | |||||
| arr->array = (void**)t; | |||||
| (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); | (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); | ||||
| arr->size = new_size; | arr->size = new_size; | ||||
| return 0; | return 0; | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _arraylist_h_ | #ifndef _arraylist_h_ | ||||
| #define _arraylist_h_ | #define _arraylist_h_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| #define ARRAY_LIST_DEFAULT_SIZE 32 | #define ARRAY_LIST_DEFAULT_SIZE 32 | ||||
| typedef void (array_list_free_fn) (void *data); | typedef void (array_list_free_fn) (void *data); | ||||
| @@ -42,4 +46,8 @@ array_list_add(struct array_list *al, void *data); | |||||
| extern int | extern int | ||||
| array_list_length(struct array_list *al); | array_list_length(struct array_list *al); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _DEBUG_H_ | #ifndef _DEBUG_H_ | ||||
| #define _DEBUG_H_ | #define _DEBUG_H_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| extern void mc_set_debug(int debug); | extern void mc_set_debug(int debug); | ||||
| extern int mc_get_debug(void); | extern int mc_get_debug(void); | ||||
| @@ -39,4 +43,8 @@ extern void mc_info(const char *msg, ...); | |||||
| #define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__) | #define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__) | ||||
| #endif | #endif | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -159,7 +159,9 @@ static void json_object_generic_delete(struct json_object* jso) | |||||
| static struct json_object* json_object_new(enum json_type o_type) | static struct json_object* json_object_new(enum json_type o_type) | ||||
| { | { | ||||
| struct json_object *jso = calloc(sizeof(struct json_object), 1); | |||||
| struct json_object *jso; | |||||
| jso = (struct json_object*)calloc(sizeof(struct json_object), 1); | |||||
| if(!jso) return NULL; | if(!jso) return NULL; | ||||
| jso->o_type = o_type; | jso->o_type = o_type; | ||||
| jso->_ref_count = 1; | jso->_ref_count = 1; | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _json_object_h_ | #ifndef _json_object_h_ | ||||
| #define _json_object_h_ | #define _json_object_h_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| #define JSON_OBJECT_DEF_HASH_ENTRIES 16 | #define JSON_OBJECT_DEF_HASH_ENTRIES 16 | ||||
| #undef FALSE | #undef FALSE | ||||
| @@ -26,15 +30,16 @@ extern const char *json_hex_chars; | |||||
| /* forward structure definitions */ | /* forward structure definitions */ | ||||
| typedef int boolean; | typedef int boolean; | ||||
| struct printbuf; | |||||
| struct lh_table; | |||||
| struct array_list; | |||||
| struct json_object; | |||||
| struct json_object_iter; | |||||
| typedef struct printbuf printbuf; | |||||
| typedef struct lh_table lh_table; | |||||
| typedef struct array_list array_list; | |||||
| typedef struct json_object json_object; | |||||
| typedef struct json_object_iter json_object_iter; | |||||
| typedef struct json_tokener json_tokener; | |||||
| /* supported object types */ | /* supported object types */ | ||||
| enum json_type { | |||||
| typedef enum json_type { | |||||
| json_type_null, | json_type_null, | ||||
| json_type_boolean, | json_type_boolean, | ||||
| json_type_double, | json_type_double, | ||||
| @@ -42,7 +47,7 @@ enum json_type { | |||||
| json_type_object, | json_type_object, | ||||
| json_type_array, | json_type_array, | ||||
| json_type_string | json_type_string | ||||
| }; | |||||
| } json_type; | |||||
| /* reference counting functions */ | /* reference counting functions */ | ||||
| @@ -307,4 +312,8 @@ extern struct json_object* json_object_new_string_len(const char *s, int len); | |||||
| */ | */ | ||||
| extern const char* json_object_get_string(struct json_object *obj); | extern const char* json_object_get_string(struct json_object *obj); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _json_object_private_h_ | #ifndef _json_object_private_h_ | ||||
| #define _json_object_private_h_ | #define _json_object_private_h_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| typedef void (json_object_delete_fn)(struct json_object *o); | typedef void (json_object_delete_fn)(struct json_object *o); | ||||
| typedef int (json_object_to_json_string_fn)(struct json_object *o, | typedef int (json_object_to_json_string_fn)(struct json_object *o, | ||||
| struct printbuf *pb); | struct printbuf *pb); | ||||
| @@ -41,4 +45,8 @@ struct json_object_iter | |||||
| struct lh_entry *entry; | struct lh_entry *entry; | ||||
| }; | }; | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -57,7 +57,9 @@ const char* json_tokener_errors[] = { | |||||
| struct json_tokener* json_tokener_new(void) | struct json_tokener* json_tokener_new(void) | ||||
| { | { | ||||
| struct json_tokener *tok = calloc(1, sizeof(struct json_tokener)); | |||||
| struct json_tokener *tok; | |||||
| tok = (struct json_tokener*)calloc(1, sizeof(struct json_tokener)); | |||||
| tok->pb = printbuf_new(); | tok->pb = printbuf_new(); | ||||
| json_tokener_reset(tok); | json_tokener_reset(tok); | ||||
| return tok; | return tok; | ||||
| @@ -100,7 +102,7 @@ struct json_object* json_tokener_parse(char *str) | |||||
| tok = json_tokener_new(); | tok = json_tokener_new(); | ||||
| obj = json_tokener_parse_ex(tok, str, -1); | obj = json_tokener_parse_ex(tok, str, -1); | ||||
| if(tok->err != json_tokener_success) | if(tok->err != json_tokener_success) | ||||
| obj = error_ptr(-tok->err); | |||||
| obj = (struct json_object*)error_ptr(-tok->err); | |||||
| json_tokener_free(tok); | json_tokener_free(tok); | ||||
| return obj; | return obj; | ||||
| } | } | ||||
| @@ -15,6 +15,10 @@ | |||||
| #include <stddef.h> | #include <stddef.h> | ||||
| #include "json_object.h" | #include "json_object.h" | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| enum json_tokener_error { | enum json_tokener_error { | ||||
| json_tokener_success, | json_tokener_success, | ||||
| json_tokener_continue, | json_tokener_continue, | ||||
| @@ -87,4 +91,8 @@ extern struct json_object* json_tokener_parse(char *str); | |||||
| extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | ||||
| char *str, int len); | char *str, int len); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -62,11 +62,11 @@ struct json_object* json_object_from_file(char *filename) | |||||
| if((fd = open(filename, O_RDONLY)) < 0) { | if((fd = open(filename, O_RDONLY)) < 0) { | ||||
| MC_ERROR("json_object_from_file: error reading file %s: %s\n", | MC_ERROR("json_object_from_file: error reading file %s: %s\n", | ||||
| filename, strerror(errno)); | filename, strerror(errno)); | ||||
| return error_ptr(-1); | |||||
| return (struct json_object*)error_ptr(-1); | |||||
| } | } | ||||
| if(!(pb = printbuf_new())) { | if(!(pb = printbuf_new())) { | ||||
| MC_ERROR("json_object_from_file: printbuf_new failed\n"); | MC_ERROR("json_object_from_file: printbuf_new failed\n"); | ||||
| return error_ptr(-1); | |||||
| return (struct json_object*)error_ptr(-1); | |||||
| } | } | ||||
| while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) { | while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) { | ||||
| printbuf_memappend(pb, buf, ret); | printbuf_memappend(pb, buf, ret); | ||||
| @@ -76,7 +76,7 @@ struct json_object* json_object_from_file(char *filename) | |||||
| MC_ABORT("json_object_from_file: error reading file %s: %s\n", | MC_ABORT("json_object_from_file: error reading file %s: %s\n", | ||||
| filename, strerror(errno)); | filename, strerror(errno)); | ||||
| printbuf_free(pb); | printbuf_free(pb); | ||||
| return error_ptr(-1); | |||||
| return (struct json_object*)error_ptr(-1); | |||||
| } | } | ||||
| obj = json_tokener_parse(pb->buf); | obj = json_tokener_parse(pb->buf); | ||||
| printbuf_free(pb); | printbuf_free(pb); | ||||
| @@ -14,10 +14,18 @@ | |||||
| #include "json_object.h" | #include "json_object.h" | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| #define JSON_FILE_BUF_SIZE 4096 | #define JSON_FILE_BUF_SIZE 4096 | ||||
| /* utility functions */ | /* utility functions */ | ||||
| extern struct json_object* json_object_from_file(char *filename); | extern struct json_object* json_object_from_file(char *filename); | ||||
| extern int json_object_to_file(char *filename, struct json_object *obj); | extern int json_object_to_file(char *filename, struct json_object *obj); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -41,7 +41,7 @@ int lh_ptr_equal(const void *k1, const void *k2) | |||||
| unsigned long lh_char_hash(const void *k) | unsigned long lh_char_hash(const void *k) | ||||
| { | { | ||||
| unsigned int h = 0; | unsigned int h = 0; | ||||
| const char* data = k; | |||||
| const char* data = (const char*)k; | |||||
| while( *data!=0 ) h = h*129 + (unsigned int)(*data++) + LH_PRIME; | while( *data!=0 ) h = h*129 + (unsigned int)(*data++) + LH_PRIME; | ||||
| @@ -61,12 +61,12 @@ struct lh_table* lh_table_new(int size, const char *name, | |||||
| int i; | int i; | ||||
| struct lh_table *t; | struct lh_table *t; | ||||
| t = calloc(1, sizeof(struct lh_table)); | |||||
| t = (struct lh_table*)calloc(1, sizeof(struct lh_table)); | |||||
| if(!t) lh_abort("lh_table_new: calloc failed\n"); | if(!t) lh_abort("lh_table_new: calloc failed\n"); | ||||
| t->count = 0; | t->count = 0; | ||||
| t->size = size; | t->size = size; | ||||
| t->name = name; | t->name = name; | ||||
| t->table = calloc(size, sizeof(struct lh_entry)); | |||||
| t->table = (struct lh_entry*)calloc(size, sizeof(struct lh_entry)); | |||||
| if(!t->table) lh_abort("lh_table_new: calloc failed\n"); | if(!t->table) lh_abort("lh_table_new: calloc failed\n"); | ||||
| t->free_fn = free_fn; | t->free_fn = free_fn; | ||||
| t->hash_fn = hash_fn; | t->hash_fn = hash_fn; | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _linkhash_h_ | #ifndef _linkhash_h_ | ||||
| #define _linkhash_h_ | #define _linkhash_h_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| /** | /** | ||||
| * golden prime used in hash functions | * golden prime used in hash functions | ||||
| */ | */ | ||||
| @@ -261,4 +265,8 @@ extern int lh_table_delete(struct lh_table *t, const void *k); | |||||
| void lh_abort(const char *msg, ...); | void lh_abort(const char *msg, ...); | ||||
| void lh_table_resize(struct lh_table *t, int new_size); | void lh_table_resize(struct lh_table *t, int new_size); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -29,10 +29,11 @@ struct printbuf* printbuf_new(void) | |||||
| { | { | ||||
| struct printbuf *p; | struct printbuf *p; | ||||
| if(!(p = calloc(1, sizeof(struct printbuf)))) return NULL; | |||||
| p = (struct printbuf*)calloc(1, sizeof(struct printbuf)); | |||||
| if(!p) return NULL; | |||||
| p->size = 32; | p->size = 32; | ||||
| p->bpos = 0; | p->bpos = 0; | ||||
| if(!(p->buf = malloc(p->size))) { | |||||
| if(!(p->buf = (char*)malloc(p->size))) { | |||||
| free(p); | free(p); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| @@ -50,7 +51,7 @@ int printbuf_memappend(struct printbuf *p, const char *buf, int size) | |||||
| "bpos=%d wrsize=%d old_size=%d new_size=%d\n", | "bpos=%d wrsize=%d old_size=%d new_size=%d\n", | ||||
| p->bpos, size, p->size, new_size); | p->bpos, size, p->size, new_size); | ||||
| #endif /* PRINTBUF_DEBUG */ | #endif /* PRINTBUF_DEBUG */ | ||||
| if(!(t = realloc(p->buf, new_size))) return -1; | |||||
| if(!(t = (char*)realloc(p->buf, new_size))) return -1; | |||||
| p->size = new_size; | p->size = new_size; | ||||
| p->buf = t; | p->buf = t; | ||||
| } | } | ||||
| @@ -12,6 +12,10 @@ | |||||
| #ifndef _printbuf_h_ | #ifndef _printbuf_h_ | ||||
| #define _printbuf_h_ | #define _printbuf_h_ | ||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| #undef PRINTBUF_DEBUG | #undef PRINTBUF_DEBUG | ||||
| struct printbuf { | struct printbuf { | ||||
| @@ -35,4 +39,8 @@ printbuf_reset(struct printbuf *p); | |||||
| extern void | extern void | ||||
| printbuf_free(struct printbuf *p); | printbuf_free(struct printbuf *p); | ||||
| #ifdef __cplusplus | |||||
| } | |||||
| #endif | |||||
| #endif | #endif | ||||
| @@ -7,9 +7,9 @@ | |||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| { | { | ||||
| struct json_tokener *tok; | |||||
| struct json_object *my_string, *my_int, *my_object, *my_array; | |||||
| struct json_object *new_obj; | |||||
| json_tokener *tok; | |||||
| json_object *my_string, *my_int, *my_object, *my_array; | |||||
| json_object *new_obj; | |||||
| int i; | int i; | ||||
| MC_SET_DEBUG(1); | MC_SET_DEBUG(1); | ||||
| @@ -39,7 +39,7 @@ int main(int argc, char **argv) | |||||
| json_object_array_put_idx(my_array, 4, json_object_new_int(5)); | json_object_array_put_idx(my_array, 4, json_object_new_int(5)); | ||||
| printf("my_array=\n"); | printf("my_array=\n"); | ||||
| for(i=0; i < json_object_array_length(my_array); i++) { | for(i=0; i < json_object_array_length(my_array); i++) { | ||||
| struct json_object *obj = json_object_array_get_idx(my_array, i); | |||||
| json_object *obj = json_object_array_get_idx(my_array, i); | |||||
| printf("\t[%d]=%s\n", i, json_object_to_json_string(obj)); | printf("\t[%d]=%s\n", i, json_object_to_json_string(obj)); | ||||
| } | } | ||||
| printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array)); | printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array)); | ||||
| @@ -8,7 +8,7 @@ | |||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| { | { | ||||
| struct json_object *new_obj; | |||||
| json_object *new_obj; | |||||
| MC_SET_DEBUG(1); | MC_SET_DEBUG(1); | ||||