summaryrefslogtreecommitdiff
path: root/kernel/src/misc/stdbuff.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-09-01 23:45:47 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-09-01 23:45:47 +0200
commit11ced165e0df11cc3c889eb0cc402467361c421b (patch)
treeba6456fdae72e0deff0130612f226cd5d94aea17 /kernel/src/misc/stdbuff.c
parent9a54c41ad07ec00316bb8fcdeba51c215446d454 (diff)
timer & stdbuff
Diffstat (limited to 'kernel/src/misc/stdbuff.c')
-rw-r--r--kernel/src/misc/stdbuff.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/kernel/src/misc/stdbuff.c b/kernel/src/misc/stdbuff.c
new file mode 100644
index 0000000..cca58d6
--- /dev/null
+++ b/kernel/src/misc/stdbuff.c
@@ -0,0 +1,30 @@
+#include <libk/string.h>
+#include <heap.h>
+#include <stdbuff.h>
+
+stdbuff* init_buff(uint32_t buff_size)
+{
+ stdbuff* buffer = kalloc(sizeof(stdbuff));
+ buffer->head = 0;
+ buffer->tail = 0;
+ buffer->size = buff_size;
+ buffer->data = kalloc(buffer->size);
+ return buffer;
+}
+
+void read_buff(stdbuff* buffer, char* dest_ptr, size_t read_size)
+{
+ for (size_t i = 0; i < read_size; i++) {
+ memcpy(dest_ptr + i, buffer->data + ((buffer->tail + i) % buffer->size), 1);
+ }
+ dest_ptr[read_size] = '\0';
+ buffer->tail = (buffer->tail + read_size) % buffer->size;
+}
+
+void write_buff(stdbuff* buffer, const char* src_ptr, size_t write_size)
+{
+ for (size_t i = 0; i < write_size; i++) {
+ memcpy(buffer->data + ((buffer->head + i) % buffer->size), src_ptr + i, 1);
+ }
+ buffer->head = (buffer->head + write_size) % buffer->size;
+}