From 574567b125d1a81bb191cfecdecc76c70f216231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Mon, 28 Sep 2020 15:42:14 +0200 Subject: text: move I/O related code to separate file This groups all I/O related code together to make it reusable in different core text data structure implementations. --- text-internal.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 text-internal.h (limited to 'text-internal.h') diff --git a/text-internal.h b/text-internal.h new file mode 100644 index 0000000..5ed84ae --- /dev/null +++ b/text-internal.h @@ -0,0 +1,35 @@ +#ifndef TEXT_INTERNAL +#define TEXT_INTERNAL + +#include +#include +#include "text.h" + +/* Block holding the file content, either readonly mmap(2)-ed from the original + * file or heap allocated to store the modifications. + */ +typedef struct { + size_t size; /* maximal capacity */ + size_t len; /* current used length / insertion position */ + char *data; /* actual data */ + enum { /* type of allocation */ + BLOCK_TYPE_MMAP_ORIG, /* mmap(2)-ed from an external file */ + BLOCK_TYPE_MMAP, /* mmap(2)-ed from a temporary file only known to this process */ + BLOCK_TYPE_MALLOC, /* heap allocated block using malloc(3) */ + } type; +} Block; + +Block *block_alloc(size_t size); +Block *block_read(size_t size, int fd); +Block *block_mmap(size_t size, int fd, off_t offset); +Block *block_load(int dirfd, const char *filename, enum TextLoadMethod method, struct stat *info); +void block_free(Block*); +bool block_capacity(Block*, size_t len); +const char *block_append(Block*, const char *data, size_t len); +bool block_insert(Block*, size_t pos, const char *data, size_t len); +bool block_delete(Block*, size_t pos, size_t len); + +Block *text_block_mmaped(Text*); +void text_saved(Text*, struct stat *meta); + +#endif -- cgit v1.2.3