From ebb4cc5b97b8565ceffa0d48301f8af9e6b884df Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Fri, 22 Aug 2025 00:35:21 +0200 Subject: piece-table: Take original buffer from outside --- src/piece-table.c | 60 +++++++++++++++++-------------------------------------- 1 file changed, 18 insertions(+), 42 deletions(-) (limited to 'src/piece-table.c') diff --git a/src/piece-table.c b/src/piece-table.c index 24e3671..070d265 100644 --- a/src/piece-table.c +++ b/src/piece-table.c @@ -91,7 +91,6 @@ piece_table_piece_new (piece_table *pt) pt->empty = pt->empty->next; return p; } - /* TODO: Resize if needed */ return piece_buffer_bump (pt->pieces); } @@ -102,7 +101,7 @@ piece_table_piece_split (piece_table *pt, piece *p, size_t pos) /* Returns the first piece */ piece *second; assert (pos < p->length); - assert (p->buffer != NULL); /* Not a sentinel piece */ + assert (p->type != PIECE_SENTINEL); /* Not a sentinel piece */ assert (p->length != 0); /* Not an empty piece (they should not exist) */ if ( pos == 0 ) { @@ -116,7 +115,7 @@ piece_table_piece_split (piece_table *pt, piece *p, size_t pos) p->next = second; second->prev = p; second->start = p->start + pos; - second->buffer = p->buffer; + second->type = p->type; return p; } @@ -165,7 +164,7 @@ piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len) assert ( pos <= pt->length ); assert ( len > 0 ); - for (i = 0; iadd, in[i]); } @@ -202,7 +201,7 @@ piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len) * Add in the end of the buffer, and the end of the piece: enlarge */ if ( pt->add.used != 0 && - start->buffer == &pt->add && + start->type == PIECE_ADD && pt->cached_offset + start->length == pos && pt->add.used == start->start + start->length + len ) { pt->length += len; @@ -213,7 +212,7 @@ piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len) /* Make a new piece and insert it */ new = piece_table_piece_new (pt); - new->buffer = &pt->add; + new->type = PIECE_ADD; new->start = pt->add.used - len; new->length = len; @@ -284,8 +283,7 @@ piece_table_create_from_str (char *orig, size_t size) pt->length = size; /* Original buffer */ - text_buffer_init (&pt->orig); - text_buffer_fill (&pt->orig, orig, size); + pt->orig = orig; /* Add buffer */ text_buffer_init (&pt->add); @@ -294,7 +292,7 @@ piece_table_create_from_str (char *orig, size_t size) pt->sentinel = piece_buffer_bump (pt->pieces); original = piece_buffer_bump (pt->pieces); - original->buffer = &pt->orig; + original->type = PIECE_ORIG; original->start = 0; original->length = pt->length; original->next = pt->sentinel; @@ -317,7 +315,6 @@ piece_table_create (char *orig, size_t size) void piece_table_destroy (piece_table *pt) { - text_buffer_clear (&pt->orig); text_buffer_clear (&pt->add); piece_buffer_destroy (pt->pieces); free (pt); @@ -328,8 +325,17 @@ piece_table_index (piece_table *pt, size_t pos) { assert (pos < pt->length); piece_table_piece_find (pt, pos); - return text_buffer_index (pt->cached->buffer, - pt->cached->start + pos - pt->cached_offset); + switch (pt->cached->type) + { + case PIECE_ORIG: + return pt->orig[pt->cached->start + pos - pt->cached_offset]; + case PIECE_ADD: + return text_buffer_index (&pt->add, + pt->cached->start + pos - pt->cached_offset); + default: + assert (0 && "UNREACHABLE: indexing the sentinel piece"); + break; + } } void @@ -348,33 +354,3 @@ 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); - free (buff); - text_buffer_clear (&pt->add); - text_buffer_init (&pt->add); - - 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; - - pt->cached_offset = 0; - pt->cached = p; -} -- cgit v1.2.3