From ea29cdfec6cec6d6d3ebbf06cba89cfc85494215 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 18 Feb 2021 14:24:00 -0600 Subject: [PATCH] added some functionality to reading streams --- core/io/reader.onyx | 46 +++++++++++++++++++++++++++++++++++++++++++-- core/io/stream.onyx | 5 +++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/core/io/reader.onyx b/core/io/reader.onyx index 8652ea8f..347511aa 100644 --- a/core/io/reader.onyx +++ b/core/io/reader.onyx @@ -10,6 +10,11 @@ reader_make :: (s: ^Stream) -> Reader { return Reader.{ s }; } +read_byte :: (use reader: ^Reader) -> u8 { + err, byte := stream_read_byte(stream); + return byte; +} + read_u32 :: (use reader: ^Reader) -> u32 { n: u32 = 0; @@ -71,7 +76,7 @@ read_line :: (use reader: ^Reader, allocator := context.allocator) -> str { return out; } -read_word :: (use reader: ^Reader, allocator := context.allocator) -> str { +read_word :: (use reader: ^Reader, numeric_allowed := false, allocator := context.allocator) -> str { skip_whitespace(reader); _, curr_pos := stream_tell(stream); @@ -84,6 +89,8 @@ read_word :: (use reader: ^Reader, allocator := context.allocator) -> str { || (curr >= #char "A" && curr <= #char "Z") || curr == #char "_" { count += 1; + } elseif numeric_allowed && (curr >= #char "0" && curr <= #char "9") { + count += 1; } else { break; } @@ -103,6 +110,41 @@ read_word :: (use reader: ^Reader, allocator := context.allocator) -> str { return out; } +read_until :: (use reader: ^Reader, until: u8, allocator := context.allocator, consume_end := false) -> str { + _, curr_pos := stream_tell(stream); + + count := 0; + err, curr := stream_read_byte(stream); + + while true { + if curr != until { + count += 1; + } else { + break; + } + + err, curr = stream_read_byte(stream); + if err != Error.None do break; + } + + if consume_end do count += 1; + + stream_seek(stream, curr_pos, SeekFrom.Start); + + out := str.{ + data = raw_alloc(allocator, count * sizeof(u8)), + count = count, + }; + + stream_read(stream, out); + return out; +} + +peek_byte :: (use reader: ^Reader) -> u8 { + err, byte := stream_peek_byte(stream); + return byte; +} + advance_line :: (use reader: ^Reader) { err, curr := stream_read_byte(stream); if err != Error.None do return; @@ -128,4 +170,4 @@ skip_whitespace :: (use reader: ^Reader) { case #default do return; } } -} \ No newline at end of file +} diff --git a/core/io/stream.onyx b/core/io/stream.onyx index 480f7a0d..f3b036b8 100644 --- a/core/io/stream.onyx +++ b/core/io/stream.onyx @@ -126,6 +126,11 @@ stream_peek_byte :: (use s: ^Stream) -> (Error, u8) { return Error.None, out; } +stream_end_of_file :: (use s: ^Stream) -> bool { + err, _ := stream_peek_byte(s); + return err == Error.EOF; +} + // -- 2.25.1