From f76234700febab324f6a4b0eb3cdf449fc732c51 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Fri, 15 Aug 2025 01:13:54 +0200 Subject: test: piece-table-internals: Add test and pass it Fixes the optimization that avoids adding a new piece when the addition happens in the end of the buffer. Fixes leaks produced in piece_table_optimize --- src/piece-table.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/piece-table.c') diff --git a/src/piece-table.c b/src/piece-table.c index 36556ae..40d8407 100644 --- a/src/piece-table.c +++ b/src/piece-table.c @@ -119,7 +119,8 @@ void piece_buffer_empty (piece_buffer *pb) { piece_buffer_destroy (pb->next); - pb->start -= pb->used; + pb->next = NULL; + pb->used = 0; } piece * @@ -270,7 +271,7 @@ piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len) if ( pt->add.used != 0 && start->buffer == &pt->add && pt->cached_offset + start->length == pos && - pt->add.used == start->start + start->length ) { + pt->add.used == start->start + start->length + len ) { pt->length += len; start->length += len; return; @@ -421,12 +422,11 @@ piece_table_optimize (piece_table *pt) piece *p; char *buff = malloc (sizeof (*buff) * pt->length + 1); /*TODO remove +1*/ piece_table_to_string (pt, buff, pt->length); - text_buffer_fill (&pt->orig, buff, pt->length); + free (buff); + text_buffer_empty (&pt->add); text_buffer_init (&pt->add); - for (p = pt->sentinel->next; p != pt->sentinel; p = p->next) - piece_table_piece_mark_empty (pt, p); piece_buffer_empty (pt->pieces); pt->sentinel = piece_buffer_bump (pt->pieces); @@ -441,4 +441,7 @@ piece_table_optimize (piece_table *pt) p->start = 0; p->length = pt->length; p->buffer = &pt->orig; + + pt->cached_offset = 0; + pt->cached = p; } -- cgit v1.2.3