mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Update bytes.Reader
This commit is contained in:
+70
-36
@@ -4,34 +4,35 @@ import "core:io"
|
|||||||
import "core:unicode/utf8"
|
import "core:unicode/utf8"
|
||||||
|
|
||||||
Reader :: struct {
|
Reader :: struct {
|
||||||
using stream: io.Stream,
|
|
||||||
s: []byte,
|
s: []byte,
|
||||||
i: i64, // current reading index
|
i: i64, // current reading index
|
||||||
prev_rune: int, // previous reading index of rune or < 0
|
prev_rune: int, // previous reading index of rune or < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
reader_reset :: proc(r: ^Reader, s: []byte) {
|
reader_init :: proc(r: ^Reader, s: []byte) {
|
||||||
r.stream_data = r;
|
|
||||||
r.stream_vtable = _reader_vtable;
|
|
||||||
r.s = s;
|
r.s = s;
|
||||||
r.i = 0;
|
r.i = 0;
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_reader :: proc(s: []byte, allocator := context.allocator) -> ^Reader {
|
reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
|
||||||
r := new(Reader, allocator);
|
s.stream_data = r;
|
||||||
reader_reset(r, s);
|
s.stream_vtable = _reader_vtable;
|
||||||
return r;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
reader_length :: proc(r: ^Reader) -> int {
|
||||||
_reader_vtable := &io.Stream_VTable{
|
if r.i >= i64(len(r.s)) {
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
return 0;
|
||||||
r := (^Reader)(s.stream_data);
|
}
|
||||||
|
return int(i64(len(r.s)) - r.i);
|
||||||
|
}
|
||||||
|
|
||||||
|
reader_size :: proc(r: ^Reader) -> i64 {
|
||||||
return i64(len(r.s));
|
return i64(len(r.s));
|
||||||
},
|
}
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
r := (^Reader)(s.stream_data);
|
reader_read :: proc(r: ^Reader, p: []byte) -> (n: int, err: io.Error) {
|
||||||
if r.i >= i64(len(r.s)) {
|
if r.i >= i64(len(r.s)) {
|
||||||
return 0, .EOF;
|
return 0, .EOF;
|
||||||
}
|
}
|
||||||
@@ -39,9 +40,8 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
n = copy(p, r.s[r.i:]);
|
n = copy(p, r.s[r.i:]);
|
||||||
r.i += i64(n);
|
r.i += i64(n);
|
||||||
return;
|
return;
|
||||||
},
|
}
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, off: i64) -> (n: int, err: io.Error) {
|
reader_read_at :: proc(r: ^Reader, p: []byte, off: i64) -> (n: int, err: io.Error) {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
if off < 0 {
|
if off < 0 {
|
||||||
return 0, .Invalid_Offset;
|
return 0, .Invalid_Offset;
|
||||||
}
|
}
|
||||||
@@ -53,9 +53,8 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
err = .EOF;
|
err = .EOF;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
},
|
}
|
||||||
impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
|
reader_read_byte :: proc(r: ^Reader) -> (byte, io.Error) {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
if r.i >= i64(len(r.s)) {
|
if r.i >= i64(len(r.s)) {
|
||||||
return 0, .EOF;
|
return 0, .EOF;
|
||||||
@@ -63,18 +62,16 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
b := r.s[r.i];
|
b := r.s[r.i];
|
||||||
r.i += 1;
|
r.i += 1;
|
||||||
return b, nil;
|
return b, nil;
|
||||||
},
|
}
|
||||||
impl_unread_byte = proc(s: io.Stream) -> io.Error {
|
reader_unread_byte :: proc(r: ^Reader) -> io.Error {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
if r.i <= 0 {
|
if r.i <= 0 {
|
||||||
return .Invalid_Unread;
|
return .Invalid_Unread;
|
||||||
}
|
}
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
r.i -= 1;
|
r.i -= 1;
|
||||||
return nil;
|
return nil;
|
||||||
},
|
}
|
||||||
impl_read_rune = proc(s: io.Stream) -> (ch: rune, size: int, err: io.Error) {
|
reader_read_rune :: proc(r: ^Reader) -> (ch: rune, size: int, err: io.Error) {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
if r.i >= i64(len(r.s)) {
|
if r.i >= i64(len(r.s)) {
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
return 0, 0, .EOF;
|
return 0, 0, .EOF;
|
||||||
@@ -87,9 +84,8 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
ch, size = utf8.decode_rune(r.s[r.i:]);
|
ch, size = utf8.decode_rune(r.s[r.i:]);
|
||||||
r.i += i64(size);
|
r.i += i64(size);
|
||||||
return;
|
return;
|
||||||
},
|
}
|
||||||
impl_unread_rune = proc(s: io.Stream) -> io.Error {
|
reader_unread_rune :: proc(r: ^Reader) -> io.Error {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
if r.i <= 0 {
|
if r.i <= 0 {
|
||||||
return .Invalid_Unread;
|
return .Invalid_Unread;
|
||||||
}
|
}
|
||||||
@@ -99,9 +95,8 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
r.i = i64(r.prev_rune);
|
r.i = i64(r.prev_rune);
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
return nil;
|
return nil;
|
||||||
},
|
}
|
||||||
impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
reader_seek :: proc(r: ^Reader, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
abs: i64;
|
abs: i64;
|
||||||
switch whence {
|
switch whence {
|
||||||
@@ -120,9 +115,8 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
}
|
}
|
||||||
r.i = abs;
|
r.i = abs;
|
||||||
return abs, nil;
|
return abs, nil;
|
||||||
},
|
}
|
||||||
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
reader_write_to :: proc(r: ^Reader, w: io.Writer) -> (n: i64, err: io.Error) {
|
||||||
r := (^Reader)(s.stream_data);
|
|
||||||
r.prev_rune = -1;
|
r.prev_rune = -1;
|
||||||
if r.i >= i64(len(r.s)) {
|
if r.i >= i64(len(r.s)) {
|
||||||
return 0, nil;
|
return 0, nil;
|
||||||
@@ -139,5 +133,45 @@ _reader_vtable := &io.Stream_VTable{
|
|||||||
err = .Short_Write;
|
err = .Short_Write;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@(private)
|
||||||
|
_reader_vtable := &io.Stream_VTable{
|
||||||
|
impl_size = proc(s: io.Stream) -> i64 {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_size(r);
|
||||||
|
},
|
||||||
|
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_read(r, p);
|
||||||
|
},
|
||||||
|
impl_read_at = proc(s: io.Stream, p: []byte, off: i64) -> (n: int, err: io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_read_at(r, p, off);
|
||||||
|
},
|
||||||
|
impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_read_byte(r);
|
||||||
|
},
|
||||||
|
impl_unread_byte = proc(s: io.Stream) -> io.Error {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_unread_byte(r);
|
||||||
|
},
|
||||||
|
impl_read_rune = proc(s: io.Stream) -> (ch: rune, size: int, err: io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_read_rune(r);
|
||||||
|
},
|
||||||
|
impl_unread_rune = proc(s: io.Stream) -> io.Error {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_unread_rune(r);
|
||||||
|
},
|
||||||
|
impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_seek(r, offset, whence);
|
||||||
|
},
|
||||||
|
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
||||||
|
r := (^Reader)(s.stream_data);
|
||||||
|
return reader_write_to(r, w);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user