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 +++++++++++++++++++++++++++++++++++++++++++++ src/piece-table.c | 58 ++++++------------------------ src/piece-table.h | 2 +- 3 files changed, 100 insertions(+), 48 deletions(-) create mode 100644 src/piece-table-internals.h (limited to 'src') 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); 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 #include #include +#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); -- cgit v1.2.3