diff options
| author | Albert Cervin <albert@acervin.com> | 2023-05-07 23:59:22 +0200 |
|---|---|---|
| committer | Albert Cervin <albert@acervin.com> | 2023-05-08 00:00:36 +0200 |
| commit | 24cff0ec31970d5d57f61ba99ba7bfdda725cf94 (patch) | |
| tree | 8304f69e38ec33d663db21ee26dbee14bf8d7a2f /src/dged/buffers.c | |
| parent | 8d73eace6806bd67852189b1a16de5895c565688 (diff) | |
| download | dged-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.c | 52 |
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); } |
