* 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-5cb71233fd97tags/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); | ||||