added some functionality to reading streams
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 18 Feb 2021 20:24:00 +0000 (14:24 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 18 Feb 2021 20:24:00 +0000 (14:24 -0600)
core/io/reader.onyx
core/io/stream.onyx

index 8652ea8f728a7a50a1d2935ea67ac947543ead43..347511aa915e07aab18b8b6912c2d9a327b44295 100644 (file)
@@ -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
+}
index 480f7a0d4b7d9f0a0c899ef5352c75ae9b1d324d..f3b036b8b3d57b29e5ab1ea8954685b6b276fbc5 100644 (file)
@@ -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;
+}
+
 
 
 //