diff options
| -rw-r--r-- | register.c | 62 | ||||
| -rw-r--r-- | register.h | 16 |
2 files changed, 78 insertions, 0 deletions
diff --git a/register.c b/register.c new file mode 100644 index 0000000..65de14d --- /dev/null +++ b/register.c @@ -0,0 +1,62 @@ +#include <stdlib.h> +#include <string.h> + +#include "register.h" +#include "util.h" + +#define REG_SIZE 1024 + +struct Register { + char *data; + size_t len; + size_t size; +}; + +bool register_alloc(Register *reg, size_t size) { + if (size < REG_SIZE) + size = REG_SIZE; + if (reg->size < size) { + reg->data = realloc(reg->data, size); + if (!reg->data) { + reg->size = 0; + reg->len = 0; + return false; + } + reg->size = size; + } + return true; +} + +void register_free(Register *reg) { + if (!reg) + return; + free(reg->data); + reg->data = NULL; + reg->len = 0; + reg->size = 0; +} + +bool register_store(Register *reg, const char *data, size_t len) { + if (!register_alloc(reg, len)) + return false; + memcpy(reg->data, data, len); + reg->len = len; + return true; +} + +bool register_put(Register *reg, Text *txt, Filerange *range) { + size_t len = range->end - range->start; + if (!register_alloc(reg, len)) + return false; + reg->len = text_bytes_get(txt, range->start, len, reg->data); + return true; +} + +bool register_append(Register *reg, Text *txt, Filerange *range) { + size_t rem = reg->size - reg->len; + size_t len = range->end - range->start; + if (len > rem && !register_alloc(reg, reg->size + len - rem)) + return false; + reg->len += text_bytes_get(txt, range->start, len, reg->data + reg->len); + return true; +} diff --git a/register.h b/register.h new file mode 100644 index 0000000..c6bdf4a --- /dev/null +++ b/register.h @@ -0,0 +1,16 @@ +#ifndef REGISTER_H +#define REGISTER_H + +#include <stddef.h> +#include <stdbool.h> +#include "text.h" + +typedef struct Register Register; + +bool register_alloc(Register *reg, size_t size); +void register_free(Register *reg); +bool register_store(Register *reg, const char *data, size_t len); +bool register_put(Register *reg, Text *txt, Filerange *range); +bool register_append(Register *reg, Text *txt, Filerange *range); + +#endif |
