summaryrefslogtreecommitdiff
path: root/src/piece-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/piece-table.c')
-rw-r--r--src/piece-table.c13
1 files changed, 8 insertions, 5 deletions
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;
}