From 24cff0ec31970d5d57f61ba99ba7bfdda725cf94 Mon Sep 17 00:00:00 2001 From: Albert Cervin Date: Sun, 7 May 2023 23:59:22 +0200 Subject: Implement file reloading When for examplue using formatters or doing vc updates, it is useful if the file is reloaded from disk. --- src/dged/buffers.c | 52 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 18 deletions(-) (limited to 'src/dged/buffers.c') 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 + #include 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); } -- cgit v1.2.3