From ae304c39f5bbd530550262053a42e0f4a32c5946 Mon Sep 17 00:00:00 2001 From: Donald Maxwell Date: Mon, 11 Dec 2023 15:58:05 +0000 Subject: [PATCH 1/4] Add ks_json_replace_item and replace_value_string --- src/include/libks/ks_json.h | 5 ++++ src/ks_json.c | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) 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..9e060751 100644 --- a/src/ks_json.c +++ b/src/ks_json.c @@ -451,6 +451,55 @@ 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; + } + + replacement->next = (*item)->next; + replacement->prev = (*item)->prev; + + if ((*item)->string) { + if (replacement->string) { + free(replacement->string); + } + replacement->string = strdup((*item)->string); + } + + 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) { + free(string_item->valuestring); + } + + string_item->valuestring = value_string; + + return KS_TRUE; +} + /* For Emacs: * Local Variables: * mode:c From 97e77c63544bf227df4201d7af9226ec963ba8b0 Mon Sep 17 00:00:00 2001 From: Donald Maxwell Date: Mon, 11 Dec 2023 16:24:57 +0000 Subject: [PATCH 2/4] Small shortcut for when item already equals replacement --- src/ks_json.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ks_json.c b/src/ks_json.c index 9e060751..8106d95c 100644 --- a/src/ks_json.c +++ b/src/ks_json.c @@ -457,6 +457,12 @@ KS_DECLARE(ks_bool_t) ks_json_replace_item(ks_json_t *parent, ks_json_t **item, return KS_FALSE; } + if (replacement == *item) { + *item = NULL; + + return KS_TRUE; + } + replacement->next = (*item)->next; replacement->prev = (*item)->prev; From 1c1d25a1158b2b64af514459b5b696bad751e50e Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Thu, 14 Dec 2023 14:26:48 +0300 Subject: [PATCH 3/4] Coding guidelines. --- src/ks_json.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ks_json.c b/src/ks_json.c index 8106d95c..d8e20538 100644 --- a/src/ks_json.c +++ b/src/ks_json.c @@ -470,15 +470,18 @@ KS_DECLARE(ks_bool_t) ks_json_replace_item(ks_json_t *parent, ks_json_t **item, if (replacement->string) { free(replacement->string); } + replacement->string = strdup((*item)->string); } if (replacement->next != NULL) { replacement->next->prev = replacement; } + if (replacement->prev != NULL) { replacement->prev->next = replacement; } + if (parent->child == *item) { parent->child = replacement; } From 2a0ed417a965977299ac30d3ac4f6bcfb2053fc6 Mon Sep 17 00:00:00 2001 From: Donald Maxwell Date: Fri, 15 Dec 2023 10:02:33 +0000 Subject: [PATCH 4/4] Use kJSON_free in case special hook used for deallocate- re-use item string for replacement --- src/ks_json.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ks_json.c b/src/ks_json.c index d8e20538..3e74ccce 100644 --- a/src/ks_json.c +++ b/src/ks_json.c @@ -468,10 +468,11 @@ KS_DECLARE(ks_bool_t) ks_json_replace_item(ks_json_t *parent, ks_json_t **item, if ((*item)->string) { if (replacement->string) { - free(replacement->string); + kJSON_free(replacement->string); } - replacement->string = strdup((*item)->string); + replacement->string = (*item)->string; + (*item)->string = NULL; } if (replacement->next != NULL) { @@ -501,7 +502,7 @@ KS_DECLARE(ks_bool_t) ks_json_replace_value_string(ks_json_t *string_item, char } if (string_item->valuestring != NULL) { - free(string_item->valuestring); + kJSON_free(string_item->valuestring); } string_item->valuestring = value_string;