From 8810409199accdba6523d17279437503fba310d6 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Wed, 13 Aug 2025 00:24:57 +0200 Subject: piece-table: Add piece_table_optimize --- src/piece-table.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) (limited to 'src/piece-table.c') diff --git a/src/piece-table.c b/src/piece-table.c index 43728e4..36556ae 100644 --- a/src/piece-table.c +++ b/src/piece-table.c @@ -405,10 +405,8 @@ piece_table_to_string (piece_table *pt, char *buf, size_t size) if (pt->length < size) size = pt->length; for (i = 0; i < size; i++) - { - buf[i] = piece_table_index (pt, i); - } - buf[i] = '\0'; + buf[i] = piece_table_index (pt, i); + buf[i] = '\0'; /* TODO: KILL ME */ } size_t @@ -416,3 +414,31 @@ piece_table_length (piece_table *pt) { return pt->length; } + +void +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); + 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); + p = piece_buffer_bump (pt->pieces); + pt->empty = NULL; + + p->next = pt->sentinel; + p->prev = pt->sentinel; + pt->sentinel->prev = p; + pt->sentinel->next = p; + + p->start = 0; + p->length = pt->length; + p->buffer = &pt->orig; +} -- cgit v1.2.3