summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2025-08-13 00:22:14 +0200
committerEkaitz Zarraga <ekaitz@elenq.tech>2025-08-13 00:41:13 +0200
commitbb85111bc6d9f4f596f1cac6000a218b74ced376 (patch)
tree0eca2d68d073b2f2f97c5a5e4974dcce826f38b9 /src
parent6ab9c91dccd1a52efdf531a6d5e9a10932f26f68 (diff)
piece-table: Better formatting and naming
Diffstat (limited to 'src')
-rw-r--r--src/piece-table-internals.h88
-rw-r--r--src/piece-table.c58
-rw-r--r--src/piece-table.h2
3 files changed, 100 insertions, 48 deletions
diff --git a/src/piece-table-internals.h b/src/piece-table-internals.h
new file mode 100644
index 0000000..47a0f4a
--- /dev/null
+++ b/src/piece-table-internals.h
@@ -0,0 +1,88 @@
+/* parc
+ * Copyright (C) 2025 Ekaitz Zarraga <ekaitz@elenq.tech>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+typedef struct
+ {
+ size_t used;
+ size_t size;
+ char *contents;
+ }
+text_buffer;
+
+typedef struct _piece
+ {
+ text_buffer *buffer;
+ size_t start;
+ size_t length;
+ struct _piece *next;
+ struct _piece *prev;
+ }
+piece;
+
+typedef struct _piece_buffer
+ {
+ size_t used;
+ size_t size;
+ struct _piece_buffer *next;
+ piece *start;
+ }
+piece_buffer;
+
+typedef struct _piece_table
+ {
+ text_buffer orig;
+ text_buffer add;
+ piece_buffer *pieces;
+ piece *sentinel;
+ piece *empty;
+ size_t length;
+
+ piece *cached;
+ size_t cached_offset;
+ }
+piece_table;
+
+
+
+/* text_buffer */
+void text_buffer_init (text_buffer *tb);
+void text_buffer_resize (text_buffer *tb, size_t size);
+void text_buffer_append (text_buffer *tb, char c);
+char text_buffer_index (text_buffer *tb, size_t pos);
+void text_buffer_empty (text_buffer *tb);
+void text_buffer_fill (text_buffer *tb, char *fill, size_t size);
+void text_buffer_free (text_buffer *tb);
+
+/* piece_buffer */
+piece_buffer *piece_buffer_create (size_t size);
+void piece_buffer_destroy (piece_buffer *pb);
+void piece_buffer_empty (piece_buffer *pb);
+piece *piece_buffer_bump (piece_buffer *pb);
+
+/* piece_table */
+void piece_table_piece_mark_empty (piece_table *pt, piece *p);
+piece *piece_table_piece_new (piece_table *pt);
+piece *piece_table_piece_split (piece_table *pt, piece *p, size_t pos);
+void piece_table_piece_find (piece_table *pt, size_t pos);
+void piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len);
+void piece_table_delete (piece_table *pt, size_t pos, size_t len);
+piece_table *piece_table_create_from (char *orig, size_t size);
+piece_table *piece_table_create (char *orig, size_t size);
+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);
diff --git a/src/piece-table.c b/src/piece-table.c
index c170216..43728e4 100644
--- a/src/piece-table.c
+++ b/src/piece-table.c
@@ -20,49 +20,10 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include "piece-table-internals.h"
-typedef struct
- {
- size_t used;
- size_t size;
- char *contents;
- }
-text_buffer;
-
-typedef struct _piece
- {
- text_buffer *buffer;
- size_t start;
- size_t length;
- struct _piece *next;
- struct _piece *prev;
- }
-piece;
-
-typedef struct _piece_buffer
- {
- size_t used;
- size_t size;
- struct _piece_buffer *next;
- piece *start;
- }
-piece_buffer;
-
-typedef struct _piece_table
- {
- text_buffer orig;
- text_buffer add;
- piece_buffer *pieces;
- piece *sentinel;
- piece *empty;
- size_t length;
-
- piece *cached;
- size_t cached_offset;
- }
-piece_table;
+/* text_buffer */
-
void
text_buffer_init (text_buffer *tb)
{
@@ -128,6 +89,8 @@ text_buffer_free (text_buffer *tb)
}
+/* piece_buffer */
+
piece_buffer *
piece_buffer_create (size_t size)
{
@@ -175,6 +138,8 @@ piece_buffer_bump (piece_buffer *pb)
}
+/* piece_table */
+
void
piece_table_piece_mark_empty (piece_table *pt, piece *p)
{
@@ -222,7 +187,7 @@ piece_table_piece_split (piece_table *pt, piece *p, size_t pos)
}
void
-piece_find_by_pos (piece_table *pt, size_t pos)
+piece_table_piece_find (piece_table *pt, size_t pos)
{
piece *cur;
assert (pos < pt->length);
@@ -283,7 +248,7 @@ piece_table_insert (piece_table *pt, size_t pos, char *in, size_t len)
}
else
{
- piece_find_by_pos (pt, pos);
+ piece_table_piece_find (pt, pos);
start = piece_table_piece_split (pt, pt->cached,
pos - pt->cached_offset);
}
@@ -340,7 +305,7 @@ piece_table_delete (piece_table *pt, size_t pos, size_t len)
}
else
{
- piece_find_by_pos (pt, pos);
+ piece_table_piece_find (pt, pos);
off_start = pt->cached_offset;
start = piece_table_piece_split (pt, pt->cached,
pos - pt->cached_offset);
@@ -352,7 +317,7 @@ piece_table_delete (piece_table *pt, size_t pos, size_t len)
}
else
{
- piece_find_by_pos (pt, pos + len);
+ piece_table_piece_find (pt, pos + len);
end = piece_table_piece_split (pt, pt->cached,
pos + len - pt->cached_offset)->next;
}
@@ -415,7 +380,6 @@ piece_table_create (char *orig, size_t size)
return piece_table_create_from ("", 0);
}
-
void
piece_table_destroy (piece_table *pt)
{
@@ -429,7 +393,7 @@ char
piece_table_index (piece_table *pt, size_t pos)
{
assert (pos < pt->length);
- piece_find_by_pos (pt, pos);
+ piece_table_piece_find (pt, pos);
return text_buffer_index (pt->cached->buffer,
pt->cached->start + pos - pt->cached_offset);
}
diff --git a/src/piece-table.h b/src/piece-table.h
index 0182aad..a8f0769 100644
--- a/src/piece-table.h
+++ b/src/piece-table.h
@@ -23,7 +23,7 @@
typedef struct _piece_table piece_table;
piece_table *piece_table_create (void);
-piece_table * piece_table_create_from (char *orig, size_t size);
+piece_table *piece_table_create_from (char *orig, size_t size);
void piece_table_destroy (piece_table * piece_table);
char piece_table_index (piece_table *pt, size_t pos);