summaryrefslogtreecommitdiff
path: root/src/dged/buffers.c
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2023-05-07 23:59:22 +0200
committerAlbert Cervin <albert@acervin.com>2023-05-08 00:00:36 +0200
commit24cff0ec31970d5d57f61ba99ba7bfdda725cf94 (patch)
tree8304f69e38ec33d663db21ee26dbee14bf8d7a2f /src/dged/buffers.c
parent8d73eace6806bd67852189b1a16de5895c565688 (diff)
downloaddged-24cff0ec31970d5d57f61ba99ba7bfdda725cf94.tar.gz
dged-24cff0ec31970d5d57f61ba99ba7bfdda725cf94.tar.xz
dged-24cff0ec31970d5d57f61ba99ba7bfdda725cf94.zip
Implement file reloading
When for examplue using formatters or doing vc updates, it is useful if the file is reloaded from disk.
Diffstat (limited to 'src/dged/buffers.c')
-rw-r--r--src/dged/buffers.c52
1 files changed, 34 insertions, 18 deletions
diff --git a/src/dged/buffers.c b/src/dged/buffers.c
index 38b51b7..aa6bcea 100644
--- a/src/dged/buffers.c
+++ b/src/dged/buffers.c
@@ -2,42 +2,58 @@
#include "buffer.h"
#include <stdlib.h>
+
#include <string.h>
void buffers_init(struct buffers *buffers, uint32_t initial_capacity) {
- buffers->buffers = calloc(initial_capacity, sizeof(struct buffer));
- buffers->nbuffers = 0;
- buffers->capacity = initial_capacity;
+ VEC_INIT(&buffers->buffers, initial_capacity);
+ VEC_INIT(&buffers->add_hooks, 32);
}
struct buffer *buffers_add(struct buffers *buffers, struct buffer buffer) {
- if (buffers->nbuffers == buffers->capacity) {
- buffers->capacity *= 2;
- buffers->buffers =
- realloc(buffers->buffers, sizeof(struct buffer) * buffers->capacity);
+ VEC_PUSH(&buffers->buffers, buffer);
+
+ struct buffer *slot = VEC_BACK(&buffers->buffers);
+ VEC_FOR_EACH(&buffers->add_hooks, struct buffers_hook * hook) {
+ hook->callback(slot, hook->userdata);
}
- buffers->buffers[buffers->nbuffers] = buffer;
- ++buffers->nbuffers;
+ return slot;
+}
+
+uint32_t buffers_add_add_hook(struct buffers *buffers, buffers_hook_cb callback,
+ void *userdata) {
+ VEC_PUSH(&buffers->add_hooks, ((struct buffers_hook){
+ .callback = callback,
+ .userdata = userdata,
+ }));
- return &buffers->buffers[buffers->nbuffers - 1];
+ return VEC_SIZE(&buffers->add_hooks) - 1;
}
struct buffer *buffers_find(struct buffers *buffers, const char *name) {
- for (uint32_t bufi = 0; bufi < buffers->nbuffers; ++bufi) {
- if (strcmp(name, buffers->buffers[bufi].name) == 0) {
- return &buffers->buffers[bufi];
+ VEC_FOR_EACH(&buffers->buffers, struct buffer * b) {
+ if (strcmp(name, b->name) == 0) {
+ return b;
}
}
return NULL;
}
-void buffers_destroy(struct buffers *buffers) {
- for (uint32_t bufi = 0; bufi < buffers->nbuffers; ++bufi) {
- buffer_destroy(&buffers->buffers[bufi]);
+struct buffer *buffers_find_by_filename(struct buffers *buffers,
+ const char *path) {
+ VEC_FOR_EACH(&buffers->buffers, struct buffer * b) {
+ if (b->filename != NULL && strcmp(path, b->filename) == 0) {
+ return b;
+ }
}
- buffers->nbuffers = 0;
- free(buffers->buffers);
+ return NULL;
+}
+
+void buffers_destroy(struct buffers *buffers) {
+ VEC_FOR_EACH(&buffers->buffers, struct buffer * b) { buffer_destroy(b); }
+
+ VEC_DESTROY(&buffers->buffers);
}