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-internals.h | 1 + src/piece-table.c | 34 ++++++++++++++++++++++++++++++---- src/piece-table.h | 2 ++ 3 files changed, 33 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/piece-table-internals.h b/src/piece-table-internals.h index 47a0f4a..af0e8b1 100644 --- a/src/piece-table-internals.h +++ b/src/piece-table-internals.h @@ -86,3 +86,4 @@ void piece_table_destroy (piece_table *pt); char piece_table_index (piece_table *pt, size_t pos); void piece_table_to_string (piece_table *pt, char *buf, size_t size); size_t piece_table_length (piece_table *pt); +void piece_table_optimize (piece_table *pt); 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; +} diff --git a/src/piece-table.h b/src/piece-table.h index a8f0769..70cb91c 100644 --- a/src/piece-table.h +++ b/src/piece-table.h @@ -33,4 +33,6 @@ void piece_table_delete (piece_table *pt, size_t pos, size_t len); void piece_table_to_string (piece_table *pt, char *buf, size_t size); size_t piece_table_length (piece_table *pt); +void piece_table_optimize (piece_table *pt); + #endif -- cgit v1.2.3