summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2025-08-13 00:24:57 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2025-08-13 00:41:13 +0200
commit8810409199accdba6523d17279437503fba310d6 (patch)
tree7431fa4102fa1ee5865081c11e9c8a7bbaa218ff /src
parentbb85111bc6d9f4f596f1cac6000a218b74ced376 (diff)
piece-table: Add piece_table_optimize
Diffstat (limited to 'src')
-rw-r--r--src/piece-table-internals.h1
-rw-r--r--src/piece-table.c34
-rw-r--r--src/piece-table.h2
3 files changed, 33 insertions, 4 deletions
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