aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--register.c62
-rw-r--r--register.h16
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