summaryrefslogtreecommitdiff
path: root/src/piece-table-internals.h
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/piece-table-internals.h
parent6ab9c91dccd1a52efdf531a6d5e9a10932f26f68 (diff)
piece-table: Better formatting and naming
Diffstat (limited to 'src/piece-table-internals.h')
-rw-r--r--src/piece-table-internals.h88
1 files changed, 88 insertions, 0 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);