diff --git a/src/include/libks/ks_json.h b/src/include/libks/ks_json.h index e89047d8..048e49fc 100644 --- a/src/include/libks/ks_json.h +++ b/src/include/libks/ks_json.h @@ -115,6 +115,11 @@ KS_DECLARE(ks_bool_t) ks_json_type_is_bool(ks_json_t *item); KS_DECLARE(ks_json_t *) ks_json_enum_child(ks_json_t *item); KS_DECLARE(ks_json_t *) ks_json_enum_next(ks_json_t *item); +KS_DECLARE(ks_bool_t) ks_json_replace_item(ks_json_t *parent, ks_json_t **item, ks_json_t *replacement); +KS_DECLARE(ks_bool_t) ks_json_replace_value_string(ks_json_t *string_item, char *value_string); + +#define HAVE_KS_JSON_REPLACE_ITEM + #define KS_JSON_ARRAY_FOREACH(element, array) for(element = ks_json_enum_child((array)) \ ; element != NULL; element = ks_json_enum_next(element)) diff --git a/src/ks_json.c b/src/ks_json.c index eea9e354..3e74ccce 100644 --- a/src/ks_json.c +++ b/src/ks_json.c @@ -451,6 +451,65 @@ KS_DECLARE(ks_json_t *) ks_json_enum_next(ks_json_t *item) return item->next; } +KS_DECLARE(ks_bool_t) ks_json_replace_item(ks_json_t *parent, ks_json_t **item, ks_json_t *replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL) || (*item == NULL)) { + return KS_FALSE; + } + + if (replacement == *item) { + *item = NULL; + + return KS_TRUE; + } + + replacement->next = (*item)->next; + replacement->prev = (*item)->prev; + + if ((*item)->string) { + if (replacement->string) { + kJSON_free(replacement->string); + } + + replacement->string = (*item)->string; + (*item)->string = NULL; + } + + if (replacement->next != NULL) { + replacement->next->prev = replacement; + } + + if (replacement->prev != NULL) { + replacement->prev->next = replacement; + } + + if (parent->child == *item) { + parent->child = replacement; + } + + (*item)->next = NULL; + (*item)->prev = NULL; + + ks_json_delete(item); + + return KS_TRUE; +} + +KS_DECLARE(ks_bool_t) ks_json_replace_value_string(ks_json_t *string_item, char *value_string) +{ + if (string_item == NULL || !ks_json_type_is_string(string_item)) { + return KS_FALSE; + } + + if (string_item->valuestring != NULL) { + kJSON_free(string_item->valuestring); + } + + string_item->valuestring = value_string; + + return KS_TRUE; +} + /* For Emacs: * Local Variables: * mode:c