summaryrefslogtreecommitdiff
path: root/src/source.cc
diff options
context:
space:
mode:
authorFabrice <fabrice@schaub-dev.xyz>2026-03-02 21:56:42 +0100
committerFabrice <fabrice@schaub-dev.xyz>2026-03-02 21:56:42 +0100
commit176b2b462371cd860ac9c6b5d2c1db92ae707e88 (patch)
tree983d1ddbae380eca94dfebfaf15fdf3245ba284c /src/source.cc
parentcb95ef0b3690e7817db34e3a7c0d7c021a7a8ccf (diff)
dont need array
Diffstat (limited to 'src/source.cc')
-rw-r--r--src/source.cc55
1 files changed, 41 insertions, 14 deletions
diff --git a/src/source.cc b/src/source.cc
index 69f1941..02dd42e 100644
--- a/src/source.cc
+++ b/src/source.cc
@@ -21,20 +21,27 @@ struct Buffer {
const Allocator* allocator;
};
-bool buffer_init(Buffer* buffer, const Allocator* allocator,
- const String* content_in, const String* file_in) {
- assert_neq(buffer, nullptr);
+bool buffer_init(const Allocator* allocator,
+ const String* content_in, const String* file_in, Buffer** out) {
assert_neq(allocator, nullptr);
assert_neq(content_in, nullptr);
assert_neq(file_in, nullptr);
+ assert_neq(out, nullptr);
+
+ Buffer* buffer = allocate<Buffer>(allocator, 1);
+ if(buffer == nullptr) return false;
String content, file;
bool ret = slice_copy(allocator, content_in, &content);
- if (unlikely(!ret)) return false;
+ if (unlikely(!ret)) {
+ deallocate(allocator, (u8*)buffer);
+ return false;
+ }
ret = slice_copy(allocator, file_in, &file);
if (unlikely(!ret)) {
slice_deallocate(allocator, &content);
+ deallocate(allocator, (u8*)buffer);
return false;
}
@@ -42,40 +49,60 @@ bool buffer_init(Buffer* buffer, const Allocator* allocator,
buffer->content = content;
buffer->allocator = allocator;
buffer->link = {};
+
+ *out = buffer;
return true;
}
void buffer_deinit(Buffer* buffer) {
assert_neq(buffer, nullptr);
+ const Allocator* allocator = buffer->allocator;
+ if(allocator == nullptr) return;
+
slice_deallocate(buffer->allocator, &buffer->file);
slice_deallocate(buffer->allocator, &buffer->content);
-
memset(buffer, 0, sizeof(*buffer));
+
+ deallocate(buffer->allocator, (u8*)buffer);
}
struct Buffer_Manager {
Link* stack;
- Array<Buffer> buffers;
+ Array<Buffer*> buffers;
};
#define buffer_manager_init(allocator) \
- Buffer_Manager { nullptr, array_init(Buffer, allocator) }
+ Buffer_Manager { nullptr, array_init(Buffer*, allocator) }
bool buffer_manager_push(Buffer_Manager* manager, Buffer* b) {
assert_neq(manager, nullptr);
assert_neq(b, nullptr);
bool ret = array_push(&manager->buffers, b);
- if(!ret) return false;
+ if (!ret) return false;
- b = array_last(&manager->buffers);
- if(manager->stack == nullptr) {
- manager->stack = &b->link;
- return true;
- }
+ b = *array_last(&manager->buffers);
+ if (manager->stack != nullptr) link_after(manager->stack, &b->link);
+
+ manager->stack = &b->link;
+ return true;
+}
+
+bool buffer_manager_pop(Buffer_Manager* manager, Buffer** b) {
+ assert_neq(manager, nullptr);
+ assert_neq(b, nullptr);
+
+ Link* link = manager->stack;
+ if (link == nullptr) return false;
+
+ Link* next = link->prev;
+ link_remove(link);
+
+ manager->stack = next;
- link_after(manager->stack, &b->link);
+ Buffer* buffer = containerof(Buffer, link, link);
+ *b = buffer;
return true;
}