From b841391bbd08e101b76cb6cddb26bf8faaee6203 Mon Sep 17 00:00:00 2001 From: Ayush Singh Date: Thu, 5 Jun 2025 16:18:06 +0530 Subject: [PATCH] srcpos: Define srcpos_free srcpos can be chained together using srcpos_extend. However, in such cases, we need to free all the chained nodes. srcpos_free is a helper to recursively free all the linked srcpos. Signed-off-by: Ayush Singh Message-ID: <20250605-previous-value-v3-1-0983d0733a07@beagleboard.org> Signed-off-by: David Gibson --- livetree.c | 2 +- srcpos.c | 11 +++++++++++ srcpos.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/livetree.c b/livetree.c index 93c77d9..d51d058 100644 --- a/livetree.c +++ b/livetree.c @@ -174,7 +174,7 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node) old_prop->val = new_prop->val; old_prop->deleted = 0; - free(old_prop->srcpos); + srcpos_free(old_prop->srcpos); old_prop->srcpos = new_prop->srcpos; free(new_prop); new_prop = NULL; diff --git a/srcpos.c b/srcpos.c index 5e2f7dd..5bb57bf 100644 --- a/srcpos.c +++ b/srcpos.c @@ -287,6 +287,17 @@ struct srcpos *srcpos_extend(struct srcpos *pos, struct srcpos *newtail) return pos; } +void srcpos_free(struct srcpos *pos) +{ + struct srcpos *p_next; + + while (pos) { + p_next = pos->next; + free(pos); + pos = p_next; + } +} + char * srcpos_string(struct srcpos *pos) { diff --git a/srcpos.h b/srcpos.h index 4318d7a..4d60b50 100644 --- a/srcpos.h +++ b/srcpos.h @@ -88,6 +88,7 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len); extern struct srcpos *srcpos_copy(struct srcpos *pos); extern struct srcpos *srcpos_extend(struct srcpos *new_srcpos, struct srcpos *old_srcpos); +extern void srcpos_free(struct srcpos *pos); extern char *srcpos_string(struct srcpos *pos); extern char *srcpos_string_first(struct srcpos *pos, int level); extern char *srcpos_string_last(struct srcpos *pos, int level);