From bb85111bc6d9f4f596f1cac6000a218b74ced376 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Wed, 13 Aug 2025 00:22:14 +0200 Subject: piece-table: Better formatting and naming --- src/piece-table-internals.h | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/piece-table-internals.h (limited to 'src/piece-table-internals.h') 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 + * + * 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 . + */ + +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); -- cgit v1.2.3