diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2020-11-07 15:44:30 +0100 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2020-11-07 15:44:30 +0100 |
| commit | 6ec424ed8d34cf8a5f51e277a20429741b33ee96 (patch) | |
| tree | 6d0eed732e01d19effbae5cc525a9c2f6e28534f /src/server/reader.odin | |
| parent | 3f1027bd4003cdb9fdc80665548181df2fb60810 (diff) | |
complete refractor of the project into packages
Diffstat (limited to 'src/server/reader.odin')
| -rw-r--r-- | src/server/reader.odin | 64 |
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; +} + + + |