diff options
Diffstat (limited to 'src/text-buffer.c')
-rw-r--r-- | src/text-buffer.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/text-buffer.c b/src/text-buffer.c new file mode 100644 index 0000000..caa1c3e --- /dev/null +++ b/src/text-buffer.c @@ -0,0 +1,83 @@ +/* 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/>. + */ +#include <assert.h> +#include <stdlib.h> +#include "text-buffer.h" + +void +text_buffer_init (text_buffer *tb) +{ + tb->used = 0; + tb->size = 0; + tb->contents = NULL; +} + +void +text_buffer_resize (text_buffer *tb, size_t size) +{ + tb->size = size; + tb->contents = realloc (tb->contents, sizeof (*tb->contents) * size); +} + +void +text_buffer_append (text_buffer *tb, char c) +{ + size_t base_size = 1024; + if (tb->size == 0) + { + tb->contents = malloc (sizeof (*tb->contents) * base_size); + tb->size = base_size; + } + else if (tb->size == tb->used) + text_buffer_resize (tb, tb->size * 2); + tb->contents[tb->used++] = c; +} + +char +text_buffer_index (text_buffer *tb, size_t pos) +{ + assert (pos < tb->used); + return tb->contents[pos]; +} + +void +text_buffer_empty (text_buffer *tb) +{ + free (tb->contents); + text_buffer_init (tb); +} + +void +text_buffer_fill (text_buffer *tb, char *fill, size_t size) +{ + size_t i; + tb->used = size; + tb->size = size; + free (tb->contents); + tb->contents = malloc (sizeof (*tb->contents) * size); + for (i=0; i<size; i++) + { + tb->contents[i] = fill[i]; + } +} + +void +text_buffer_free (text_buffer *tb) +{ + free (tb->contents); + text_buffer_init (tb); +} |