aboutsummaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-07-13 15:59:30 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-13 15:59:30 +0200
commitae0520e57267dbd866fc8cd25f66f4e6af2ac118 (patch)
tree22788688f1b588c3ad00c1ce3fe13da68b3a9382 /src/buffer.c
parenta1ca82847eb356c6b85ada2ac11f38d98f6e085e (diff)
Move c files into src directory
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c
new file mode 100644
index 0000000..5768b3a
--- /dev/null
+++ b/src/buffer.c
@@ -0,0 +1,58 @@
+#include "buffer.h"
+#include "alloc.h"
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+void buffer_init(Buffer *self) {
+ self->data = NULL;
+ self->size = 0;
+ self->capacity = 0;
+}
+
+void buffer_deinit(Buffer *self) {
+ free(self->data);
+ self->size = 0;
+ self->capacity = 0;
+}
+
+static void buffer_ensure_capacity(Buffer *self, size_t new_size) {
+ size_t new_capacity = self->capacity;
+ if(new_size <= self->capacity)
+ return;
+
+ if(new_capacity == 0)
+ new_capacity = 8;
+
+ while(new_capacity < new_size) {
+ /* new_capacity *= 1.5 */
+ new_capacity += (new_capacity >> 1);
+ }
+
+ self->data = realloc_or_crash(self->data, new_capacity);
+ self->capacity = new_capacity;
+}
+
+void buffer_append(Buffer *self, const void *data, size_t size) {
+ buffer_ensure_capacity(self, self->size + size);
+ memcpy((char*)self->data + self->size, data, size);
+ self->size += size;
+}
+
+void* buffer_pop(Buffer *self, size_t size) {
+ assert(self->size >= size);
+ self->size -= size;
+ return (char*)self->data + self->size;
+}
+
+void* buffer_begin(Buffer *self) {
+ return self->data;
+}
+
+void* buffer_end(Buffer *self) {
+ return (char*)self->data + self->size;
+}
+
+size_t buffer_get_size(Buffer *self, size_t type_size) {
+ return self->size / type_size;
+}