2.replace json_object_get/put API with json_object_retain/release, as they operate the reference counter, and confused with array_list_get/put_idx. 3.replace array_list_get/put_idx API with array_list_get/insert to make them more clear to use.tags/json-c-0.13-20171207
| @@ -52,6 +52,8 @@ set(JSON_C_HEADERS | |||||
| ./linkhash.h | ./linkhash.h | ||||
| ./math_compat.h | ./math_compat.h | ||||
| ./strdup_compat.h | ./strdup_compat.h | ||||
| ./strerror_override.h | |||||
| ./strerror_override_private | |||||
| ./vasprintf_compat.h | ./vasprintf_compat.h | ||||
| ./printbuf.h | ./printbuf.h | ||||
| ./random_seed.h | ./random_seed.h | ||||
| @@ -66,6 +68,7 @@ set(JSON_C_SOURCES | |||||
| ./json_util.c | ./json_util.c | ||||
| ./linkhash.c | ./linkhash.c | ||||
| ./printbuf.c | ./printbuf.c | ||||
| ./strerror_override.c | |||||
| ./random_seed.c | ./random_seed.c | ||||
| ) | ) | ||||
| @@ -62,7 +62,7 @@ array_list_free(struct array_list *arr) | |||||
| } | } | ||||
| void* | void* | ||||
| array_list_get_idx(struct array_list *arr, size_t i) | |||||
| array_list_get(struct array_list *arr, size_t i) | |||||
| { | { | ||||
| if(i >= arr->length) return NULL; | if(i >= arr->length) return NULL; | ||||
| return arr->array[i]; | return arr->array[i]; | ||||
| @@ -92,7 +92,7 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||||
| } | } | ||||
| int | int | ||||
| array_list_put_idx(struct array_list *arr, size_t idx, void *data) | |||||
| array_list_insert(struct array_list *arr, size_t idx, void *data) | |||||
| { | { | ||||
| if (idx > SIZE_T_MAX - 1 ) return -1; | if (idx > SIZE_T_MAX - 1 ) return -1; | ||||
| if(array_list_expand_internal(arr, idx+1)) return -1; | if(array_list_expand_internal(arr, idx+1)) return -1; | ||||
| @@ -106,7 +106,7 @@ array_list_put_idx(struct array_list *arr, size_t idx, void *data) | |||||
| int | int | ||||
| array_list_add(struct array_list *arr, void *data) | array_list_add(struct array_list *arr, void *data) | ||||
| { | { | ||||
| return array_list_put_idx(arr, arr->length, data); | |||||
| return array_list_insert(arr, arr->length, data); | |||||
| } | } | ||||
| void | void | ||||
| @@ -35,10 +35,10 @@ extern void | |||||
| array_list_free(struct array_list *al); | array_list_free(struct array_list *al); | ||||
| extern void* | extern void* | ||||
| array_list_get_idx(struct array_list *al, size_t i); | |||||
| array_list_get(struct array_list *al, size_t i); | |||||
| extern int | extern int | ||||
| array_list_put_idx(struct array_list *al, size_t i, void *data); | |||||
| array_list_insert(struct array_list *al, size_t i, void *data); | |||||
| extern int | extern int | ||||
| array_list_add(struct array_list *al, void *data); | array_list_add(struct array_list *al, void *data); | ||||
| @@ -167,14 +167,14 @@ static int json_escape_str(struct printbuf *pb, const char *str, int len, int fl | |||||
| /* reference counting */ | /* reference counting */ | ||||
| extern struct json_object* json_object_get(struct json_object *jso) | |||||
| extern struct json_object* json_object_retain(struct json_object *jso) | |||||
| { | { | ||||
| if (jso) | if (jso) | ||||
| jso->_ref_count++; | jso->_ref_count++; | ||||
| return jso; | return jso; | ||||
| } | } | ||||
| int json_object_put(struct json_object *jso) | |||||
| int json_object_release(struct json_object *jso) | |||||
| { | { | ||||
| if(jso) | if(jso) | ||||
| { | { | ||||
| @@ -408,7 +408,7 @@ static void json_object_lh_entry_free(struct lh_entry *ent) | |||||
| { | { | ||||
| if (!ent->k_is_constant) | if (!ent->k_is_constant) | ||||
| free(lh_entry_k(ent)); | free(lh_entry_k(ent)); | ||||
| json_object_put((struct json_object*)lh_entry_v(ent)); | |||||
| json_object_release((struct json_object*)lh_entry_v(ent)); | |||||
| } | } | ||||
| static void json_object_object_delete(struct json_object* jso) | static void json_object_object_delete(struct json_object* jso) | ||||
| @@ -453,13 +453,15 @@ int json_object_object_add_ex(struct json_object* jso, | |||||
| struct json_object *const val, | struct json_object *const val, | ||||
| const unsigned opts) | const unsigned opts) | ||||
| { | { | ||||
| struct json_object *existing_value = NULL; | |||||
| struct lh_entry *existing_entry; | |||||
| unsigned long hash; | |||||
| assert(json_object_get_type(jso) == json_type_object); | assert(json_object_get_type(jso) == json_type_object); | ||||
| // We lookup the entry and replace the value, rather than just deleting | // We lookup the entry and replace the value, rather than just deleting | ||||
| // and re-adding it, so the existing key remains valid. | // and re-adding it, so the existing key remains valid. | ||||
| json_object *existing_value = NULL; | |||||
| struct lh_entry *existing_entry; | |||||
| const unsigned long hash = lh_get_hash(jso->o.c_object, (const void *)key); | |||||
| hash = lh_get_hash(jso->o.c_object, (const void *)key); | |||||
| existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL : | existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL : | ||||
| lh_table_lookup_entry_w_hash(jso->o.c_object, | lh_table_lookup_entry_w_hash(jso->o.c_object, | ||||
| (const void *)key, hash); | (const void *)key, hash); | ||||
| @@ -479,7 +481,7 @@ int json_object_object_add_ex(struct json_object* jso, | |||||
| } | } | ||||
| existing_value = (json_object *) lh_entry_v(existing_entry); | existing_value = (json_object *) lh_entry_v(existing_entry); | ||||
| if (existing_value) | if (existing_value) | ||||
| json_object_put(existing_value); | |||||
| json_object_release(existing_value); | |||||
| existing_entry->v = val; | existing_entry->v = val; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -841,11 +843,12 @@ struct json_object* json_object_new_double(double d) | |||||
| struct json_object* json_object_new_double_s(double d, const char *ds) | struct json_object* json_object_new_double_s(double d, const char *ds) | ||||
| { | { | ||||
| char *new_ds; | |||||
| struct json_object *jso = json_object_new_double(d); | struct json_object *jso = json_object_new_double(d); | ||||
| if (!jso) | if (!jso) | ||||
| return NULL; | return NULL; | ||||
| char *new_ds = strdup(ds); | |||||
| new_ds = strdup(ds); | |||||
| if (!new_ds) | if (!new_ds) | ||||
| { | { | ||||
| json_object_generic_delete(jso); | json_object_generic_delete(jso); | ||||
| @@ -1025,8 +1028,8 @@ int json_object_set_string(json_object* jso, const char* s) { | |||||
| } | } | ||||
| int json_object_set_string_len(json_object* jso, const char* s, int len){ | int json_object_set_string_len(json_object* jso, const char* s, int len){ | ||||
| if (jso==NULL || jso->o_type!=json_type_string) return 0; | |||||
| char *dstbuf; | char *dstbuf; | ||||
| if (jso==NULL || jso->o_type!=json_type_string) return 0; | |||||
| if (len<LEN_DIRECT_STRING_DATA) { | if (len<LEN_DIRECT_STRING_DATA) { | ||||
| dstbuf=jso->o.c_string.str.data; | dstbuf=jso->o.c_string.str.data; | ||||
| if (jso->o.c_string.len>=LEN_DIRECT_STRING_DATA) free(jso->o.c_string.str.ptr); | if (jso->o.c_string.len>=LEN_DIRECT_STRING_DATA) free(jso->o.c_string.str.ptr); | ||||
| @@ -1089,7 +1092,7 @@ static int json_object_array_to_json_string(struct json_object* jso, | |||||
| static void json_object_array_entry_free(void *data) | static void json_object_array_entry_free(void *data) | ||||
| { | { | ||||
| json_object_put((struct json_object*)data); | |||||
| json_object_release((struct json_object*)data); | |||||
| } | } | ||||
| static void json_object_array_delete(struct json_object* jso) | static void json_object_array_delete(struct json_object* jso) | ||||
| @@ -1166,7 +1169,7 @@ int json_object_array_put_idx(struct json_object *jso, size_t idx, | |||||
| struct json_object *val) | struct json_object *val) | ||||
| { | { | ||||
| assert(json_object_get_type(jso) == json_type_array); | assert(json_object_get_type(jso) == json_type_array); | ||||
| return array_list_put_idx(jso->o.c_array, idx, val); | |||||
| return array_list_insert(jso->o.c_array, idx, val); | |||||
| } | } | ||||
| int json_object_array_del_idx(struct json_object *jso, size_t idx, size_t count) | int json_object_array_del_idx(struct json_object *jso, size_t idx, size_t count) | ||||
| @@ -1179,7 +1182,7 @@ struct json_object* json_object_array_get_idx(const struct json_object *jso, | |||||
| size_t idx) | size_t idx) | ||||
| { | { | ||||
| assert(json_object_get_type(jso) == json_type_array); | assert(json_object_get_type(jso) == json_type_array); | ||||
| return (struct json_object*)array_list_get_idx(jso->o.c_array, idx); | |||||
| return (struct json_object*)array_list_get(jso->o.c_array, idx); | |||||
| } | } | ||||
| static int json_array_equal(struct json_object* jso1, | static int json_array_equal(struct json_object* jso1, | ||||
| @@ -182,7 +182,7 @@ typedef enum json_type { | |||||
| * | * | ||||
| * @param obj the json_object instance | * @param obj the json_object instance | ||||
| */ | */ | ||||
| JSON_EXPORT struct json_object* json_object_get(struct json_object *obj); | |||||
| JSON_EXPORT struct json_object* json_object_retain(struct json_object *obj); | |||||
| /** | /** | ||||
| * Decrement the reference count of json_object and free if it reaches zero. | * Decrement the reference count of json_object and free if it reaches zero. | ||||
| @@ -192,7 +192,7 @@ JSON_EXPORT struct json_object* json_object_get(struct json_object *obj); | |||||
| * @param obj the json_object instance | * @param obj the json_object instance | ||||
| * @returns 1 if the object was freed. | * @returns 1 if the object was freed. | ||||
| */ | */ | ||||
| JSON_EXPORT int json_object_put(struct json_object *obj); | |||||
| JSON_EXPORT int json_object_release(struct json_object *obj); | |||||
| /** | /** | ||||
| * Check if the json_object is of a given type | * Check if the json_object is of a given type | ||||
| @@ -240,7 +240,7 @@ int json_pointer_set(struct json_object **obj, const char *path, struct json_obj | |||||
| } | } | ||||
| if (path[0] == '\0') { | if (path[0] == '\0') { | ||||
| json_object_put(*obj); | |||||
| json_object_release(*obj); | |||||
| *obj = value; | *obj = value; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -294,7 +294,7 @@ int json_pointer_setf(struct json_object **obj, struct json_object *value, const | |||||
| return rc; | return rc; | ||||
| if (path_copy[0] == '\0') { | if (path_copy[0] == '\0') { | ||||
| json_object_put(*obj); | |||||
| json_object_release(*obj); | |||||
| *obj = value; | *obj = value; | ||||
| goto out; | goto out; | ||||
| } | } | ||||
| @@ -139,7 +139,7 @@ static void json_tokener_reset_level(struct json_tokener *tok, int depth) | |||||
| { | { | ||||
| tok->stack[depth].state = json_tokener_state_eatws; | tok->stack[depth].state = json_tokener_state_eatws; | ||||
| tok->stack[depth].saved_state = json_tokener_state_start; | tok->stack[depth].saved_state = json_tokener_state_start; | ||||
| json_object_put(tok->stack[depth].current); | |||||
| json_object_release(tok->stack[depth].current); | |||||
| tok->stack[depth].current = NULL; | tok->stack[depth].current = NULL; | ||||
| free(tok->stack[depth].obj_field_name); | free(tok->stack[depth].obj_field_name); | ||||
| tok->stack[depth].obj_field_name = NULL; | tok->stack[depth].obj_field_name = NULL; | ||||
| @@ -178,7 +178,7 @@ struct json_object* json_tokener_parse_verbose(const char *str, | |||||
| *error = tok->err; | *error = tok->err; | ||||
| if(tok->err != json_tokener_success) { | if(tok->err != json_tokener_success) { | ||||
| if (obj != NULL) | if (obj != NULL) | ||||
| json_object_put(obj); | |||||
| json_object_release(obj); | |||||
| obj = NULL; | obj = NULL; | ||||
| } | } | ||||
| @@ -378,7 +378,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | |||||
| case json_tokener_state_finish: | case json_tokener_state_finish: | ||||
| if(tok->depth == 0) goto out; | if(tok->depth == 0) goto out; | ||||
| obj = json_object_get(current); | |||||
| obj = json_object_retain(current); | |||||
| json_tokener_reset_level(tok, tok->depth); | json_tokener_reset_level(tok, tok->depth); | ||||
| tok->depth--; | tok->depth--; | ||||
| goto redo_char; | goto redo_char; | ||||
| @@ -387,10 +387,11 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | |||||
| { | { | ||||
| size_t size_inf; | size_t size_inf; | ||||
| int is_negative = 0; | int is_negative = 0; | ||||
| char *infbuf; | |||||
| printbuf_memappend_fast(tok->pb, &c, 1); | printbuf_memappend_fast(tok->pb, &c, 1); | ||||
| size_inf = json_min(tok->st_pos+1, json_inf_str_len); | size_inf = json_min(tok->st_pos+1, json_inf_str_len); | ||||
| char *infbuf = tok->pb->buf; | |||||
| infbuf = tok->pb->buf; | |||||
| if (*infbuf == '-') | if (*infbuf == '-') | ||||
| { | { | ||||
| infbuf++; | infbuf++; | ||||
| @@ -958,7 +959,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | |||||
| if (tok->err == json_tokener_success) | if (tok->err == json_tokener_success) | ||||
| { | { | ||||
| json_object *ret = json_object_get(current); | |||||
| json_object *ret = json_object_retain(current); | |||||
| int ii; | int ii; | ||||
| /* Partially reset, so we parse additional objects on subsequent calls. */ | /* Partially reset, so we parse additional objects on subsequent calls. */ | ||||
| @@ -560,6 +560,11 @@ int lh_table_resize(struct lh_table *t, int new_size) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| unsigned long lh_get_hash(const struct lh_table *t, const void *k) | |||||
| { | |||||
| return t->hash_fn(k); | |||||
| } | |||||
| void lh_table_free(struct lh_table *t) | void lh_table_free(struct lh_table *t) | ||||
| { | { | ||||
| struct lh_entry *c; | struct lh_entry *c; | ||||
| @@ -332,10 +332,7 @@ int lh_table_resize(struct lh_table *t, int new_size); | |||||
| * @param k a pointer to the key to lookup | * @param k a pointer to the key to lookup | ||||
| * @return the key's hash | * @return the key's hash | ||||
| */ | */ | ||||
| static inline unsigned long lh_get_hash(const struct lh_table *t, const void *k) | |||||
| { | |||||
| return t->hash_fn(k); | |||||
| } | |||||
| unsigned long lh_get_hash(const struct lh_table *t, const void *k); | |||||
| /* Don't use this outside of linkhash.h: */ | /* Don't use this outside of linkhash.h: */ | ||||
| #ifdef __UNCONST | #ifdef __UNCONST | ||||
| @@ -186,11 +186,11 @@ static int get_dev_random_seed() | |||||
| static int get_cryptgenrandom_seed() | static int get_cryptgenrandom_seed() | ||||
| { | { | ||||
| DEBUG_SEED("get_cryptgenrandom_seed"); | |||||
| HCRYPTPROV hProvider = 0; | HCRYPTPROV hProvider = 0; | ||||
| int r; | int r; | ||||
| DEBUG_SEED("get_cryptgenrandom_seed"); | |||||
| if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { | if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { | ||||
| fprintf(stderr, "error CryptAcquireContextW"); | fprintf(stderr, "error CryptAcquireContextW"); | ||||
| exit(1); | exit(1); | ||||