Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/include/libks/ks_json.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
49 changes: 49 additions & 0 deletions src/ks_json.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down