/* 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 . */ #ifndef PIECE_TABLE_INTERNALS_H #define 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); 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_str (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); void piece_table_optimize (piece_table *pt); #endif /* PIECE_TABLE_INTERNALS_H */