mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Add Seek behavior to bytes.Buffer
This commit is contained in:
+24
-1
@@ -310,6 +310,26 @@ buffer_unread_rune :: proc(b: ^Buffer) -> io.Error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer_seek :: proc(b: ^Buffer, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
||||||
|
abs: i64
|
||||||
|
switch whence {
|
||||||
|
case .Start:
|
||||||
|
abs = offset
|
||||||
|
case .Current:
|
||||||
|
abs = i64(b.off) + offset
|
||||||
|
case .End:
|
||||||
|
abs = i64(len(b.buf)) + offset
|
||||||
|
case:
|
||||||
|
return 0, .Invalid_Whence
|
||||||
|
}
|
||||||
|
|
||||||
|
if abs < 0 {
|
||||||
|
return 0, .Invalid_Offset
|
||||||
|
}
|
||||||
|
b.last_read = .Invalid
|
||||||
|
b.off = int(abs)
|
||||||
|
return abs, nil
|
||||||
|
}
|
||||||
|
|
||||||
buffer_read_bytes :: proc(b: ^Buffer, delim: byte) -> (line: []byte, err: io.Error) {
|
buffer_read_bytes :: proc(b: ^Buffer, delim: byte) -> (line: []byte, err: io.Error) {
|
||||||
i := index_byte(b.buf[b.off:], delim)
|
i := index_byte(b.buf[b.off:], delim)
|
||||||
@@ -395,6 +415,9 @@ _buffer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offse
|
|||||||
return io._i64_err(buffer_write(b, p))
|
return io._i64_err(buffer_write(b, p))
|
||||||
case .Write_At:
|
case .Write_At:
|
||||||
return io._i64_err(buffer_write_at(b, p, int(offset)))
|
return io._i64_err(buffer_write_at(b, p, int(offset)))
|
||||||
|
case .Seek:
|
||||||
|
n, err = buffer_seek(b, offset, whence)
|
||||||
|
return
|
||||||
case .Size:
|
case .Size:
|
||||||
n = i64(buffer_capacity(b))
|
n = i64(buffer_capacity(b))
|
||||||
return
|
return
|
||||||
@@ -402,7 +425,7 @@ _buffer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offse
|
|||||||
buffer_destroy(b)
|
buffer_destroy(b)
|
||||||
return
|
return
|
||||||
case .Query:
|
case .Query:
|
||||||
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Size, .Destroy, .Query})
|
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Destroy, .Query})
|
||||||
}
|
}
|
||||||
return 0, .Empty
|
return 0, .Empty
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user