aboutsummaryrefslogtreecommitdiff
path: root/src/server/reader.odin
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2020-11-07 15:44:30 +0100
committerDanielGavin <danielgavin5@hotmail.com>2020-11-07 15:44:30 +0100
commit6ec424ed8d34cf8a5f51e277a20429741b33ee96 (patch)
tree6d0eed732e01d19effbae5cc525a9c2f6e28534f /src/server/reader.odin
parent3f1027bd4003cdb9fdc80665548181df2fb60810 (diff)
complete refractor of the project into packages
Diffstat (limited to 'src/server/reader.odin')
-rw-r--r--src/server/reader.odin64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/server/reader.odin b/src/server/reader.odin
new file mode 100644
index 0000000..f421d67
--- /dev/null
+++ b/src/server/reader.odin
@@ -0,0 +1,64 @@
+package server
+
+import "core:os"
+import "core:mem"
+import "core:strings"
+
+ReaderFn :: proc(rawptr, [] byte) -> (int, int);
+
+Reader :: struct {
+ reader_fn: ReaderFn,
+ reader_context: rawptr,
+};
+
+make_reader :: proc(reader_fn: ReaderFn, reader_context: rawptr) -> Reader {
+ return Reader { reader_context = reader_context, reader_fn = reader_fn };
+}
+
+
+read_u8 :: proc(reader: ^Reader) -> (u8, bool) {
+
+ value : [1] byte;
+
+ read, err := reader.reader_fn(reader.reader_context, value[:]);
+
+ if(err != 0 || read != 1) {
+ return 0, false;
+ }
+
+ return value[0], true;
+}
+
+read_until_delimiter :: proc(reader: ^Reader, delimiter: u8, builder: ^strings.Builder) -> bool {
+
+ for true {
+
+ value, success := read_u8(reader);
+
+ if(!success) {
+ return false;
+ }
+
+ strings.write_byte(builder, value);
+
+ if(value == delimiter) {
+ break;
+ }
+ }
+
+ return true;
+}
+
+read_sized :: proc(reader: ^Reader, data: []u8) -> bool {
+
+ read, err := reader.reader_fn(reader.reader_context, data);
+
+ if(err != 0 || read != len(data)) {
+ return false;
+ }
+
+ return true;
+}
+
+
+