aboutsummaryrefslogtreecommitdiff
path: root/src/std/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/std/buffer.c')
-rw-r--r--src/std/buffer.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/std/buffer.c b/src/std/buffer.c
new file mode 100644
index 0000000..3fc5184
--- /dev/null
+++ b/src/std/buffer.c
@@ -0,0 +1,42 @@
+#include "../../include/std/buffer.h"
+#include <stdlib.h>
+#include <string.h>
+
+void tsl_buffer_init(TslBuffer *self) {
+ self->data = NULL;
+ self->size = 0;
+ self->capacity = 0;
+}
+
+void tsl_buffer_deinit(TslBuffer *self) {
+ free(self->data);
+}
+
+static int tsl_buffer_ensure_capacity(TslBuffer *self, size_t new_size) {
+ void *new_ptr;
+ if(new_size <= self->capacity)
+ return 1;
+
+ if(self->capacity != 0) {
+ size_t new_capacity = self->capacity;
+ while(new_capacity < new_size) {
+ new_capacity *= 2;
+ }
+ new_size = new_capacity;
+ }
+ new_ptr = realloc(self->data, new_size);
+ if(!new_ptr)
+ return 0;
+
+ self->data = new_ptr;
+ self->capacity = new_size;
+ return 1;
+}
+
+int tsl_buffer_append(TslBuffer *self, void *data, size_t size) {
+ if(!tsl_buffer_ensure_capacity(self, self->size + size))
+ return 1;
+ memcpy((char*)self->data + self->size, data, size);
+ self->size += size;
+ return 0;
+}