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.c60
1 files changed, 18 insertions, 42 deletions
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; i<len; i++)
+ for (i=0; i<len; i++)
{
text_buffer_append (&pt->add, 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;
-}