mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Merge pull request #2584 from odin-lang/new-io
New and Improved `io.Stream` interface
This commit is contained in:
+22
-44
@@ -14,51 +14,29 @@ read_writer_init :: proc(rw: ^Read_Writer, r: ^Reader, w: ^Writer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
read_writer_to_stream :: proc(rw: ^Read_Writer) -> (s: io.Stream) {
|
read_writer_to_stream :: proc(rw: ^Read_Writer) -> (s: io.Stream) {
|
||||||
s.stream_data = rw
|
s.procedure = _read_writer_procedure
|
||||||
s.stream_vtable = &_read_writer_vtable
|
s.data = rw
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_read_writer_vtable := io.Stream_VTable{
|
_read_writer_procedure := proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
rw := (^Read_Writer)(stream_data)
|
||||||
b := (^Read_Writer)(s.stream_data).r
|
n_int: int
|
||||||
return reader_read(b, p)
|
#partial switch mode {
|
||||||
},
|
case .Flush:
|
||||||
impl_unread_byte = proc(s: io.Stream) -> io.Error {
|
err = writer_flush(rw.w)
|
||||||
b := (^Read_Writer)(s.stream_data).r
|
return
|
||||||
return reader_unread_byte(b)
|
case .Read:
|
||||||
},
|
n_int, err = reader_read(rw.r, p)
|
||||||
impl_read_rune = proc(s: io.Stream) -> (r: rune, size: int, err: io.Error) {
|
n = i64(n_int)
|
||||||
b := (^Read_Writer)(s.stream_data).r
|
return
|
||||||
return reader_read_rune(b)
|
case .Write:
|
||||||
},
|
n_int, err = writer_write(rw.w, p)
|
||||||
impl_unread_rune = proc(s: io.Stream) -> io.Error {
|
n = i64(n_int)
|
||||||
b := (^Read_Writer)(s.stream_data).r
|
return
|
||||||
return reader_unread_rune(b)
|
case .Query:
|
||||||
},
|
return io.query_utility({.Flush, .Read, .Write, .Query})
|
||||||
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
}
|
||||||
b := (^Read_Writer)(s.stream_data).r
|
return 0, .Empty
|
||||||
return reader_write_to(b, w)
|
}
|
||||||
},
|
|
||||||
impl_flush = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Read_Writer)(s.stream_data).w
|
|
||||||
return writer_flush(b)
|
|
||||||
},
|
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
b := (^Read_Writer)(s.stream_data).w
|
|
||||||
return writer_write(b, p)
|
|
||||||
},
|
|
||||||
impl_write_byte = proc(s: io.Stream, c: byte) -> io.Error {
|
|
||||||
b := (^Read_Writer)(s.stream_data).w
|
|
||||||
return writer_write_byte(b, c)
|
|
||||||
},
|
|
||||||
impl_write_rune = proc(s: io.Stream, r: rune) -> (int, io.Error) {
|
|
||||||
b := (^Read_Writer)(s.stream_data).w
|
|
||||||
return writer_write_rune(b, r)
|
|
||||||
},
|
|
||||||
impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
|
|
||||||
b := (^Read_Writer)(s.stream_data).w
|
|
||||||
return writer_read_from(b, r)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
+13
-45
@@ -311,18 +311,6 @@ reader_write_to :: proc(b: ^Reader, w: io.Writer) -> (n: i64, err: io.Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
m: i64
|
m: i64
|
||||||
if nr, ok := io.to_writer_to(b.rd); ok {
|
|
||||||
m, err = io.write_to(nr, w)
|
|
||||||
n += m
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if nw, ok := io.to_reader_from(w); ok {
|
|
||||||
m, err = io.read_from(nw, b.rd)
|
|
||||||
n += m
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if b.w-b.r < len(b.buf) {
|
if b.w-b.r < len(b.buf) {
|
||||||
if err = _reader_read_new_chunk(b); err != nil {
|
if err = _reader_read_new_chunk(b); err != nil {
|
||||||
return
|
return
|
||||||
@@ -352,48 +340,28 @@ reader_write_to :: proc(b: ^Reader, w: io.Writer) -> (n: i64, err: io.Error) {
|
|||||||
|
|
||||||
// reader_to_stream converts a Reader into an io.Stream
|
// reader_to_stream converts a Reader into an io.Stream
|
||||||
reader_to_stream :: proc(b: ^Reader) -> (s: io.Stream) {
|
reader_to_stream :: proc(b: ^Reader) -> (s: io.Stream) {
|
||||||
s.stream_data = b
|
s.data = b
|
||||||
s.stream_vtable = &_reader_vtable
|
s.procedure = _reader_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_reader_vtable := io.Stream_VTable{
|
_reader_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_destroy = proc(s: io.Stream) -> io.Error {
|
b := (^Reader)(stream_data)
|
||||||
b := (^Reader)(s.stream_data)
|
#partial switch mode {
|
||||||
|
case .Read:
|
||||||
|
return io._i64_err(reader_read(b, p))
|
||||||
|
case .Destroy:
|
||||||
reader_destroy(b)
|
reader_destroy(b)
|
||||||
return nil
|
return
|
||||||
},
|
case .Query:
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
return io.query_utility({.Read, .Destroy, .Query})
|
||||||
b := (^Reader)(s.stream_data)
|
}
|
||||||
return reader_read(b, p)
|
return 0, .Empty
|
||||||
},
|
|
||||||
impl_read_byte = proc(s: io.Stream) -> (c: byte, err: io.Error) {
|
|
||||||
b := (^Reader)(s.stream_data)
|
|
||||||
return reader_read_byte(b)
|
|
||||||
},
|
|
||||||
impl_unread_byte = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Reader)(s.stream_data)
|
|
||||||
return reader_unread_byte(b)
|
|
||||||
},
|
|
||||||
impl_read_rune = proc(s: io.Stream) -> (r: rune, size: int, err: io.Error) {
|
|
||||||
b := (^Reader)(s.stream_data)
|
|
||||||
return reader_read_rune(b)
|
|
||||||
},
|
|
||||||
impl_unread_rune = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Reader)(s.stream_data)
|
|
||||||
return reader_unread_rune(b)
|
|
||||||
},
|
|
||||||
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
|
||||||
b := (^Reader)(s.stream_data)
|
|
||||||
return reader_write_to(b, w)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Utility procedures
|
// Utility procedures
|
||||||
//
|
//
|
||||||
|
|||||||
+20
-39
@@ -173,14 +173,6 @@ writer_read_from :: proc(b: ^Writer, r: io.Reader) -> (n: i64, err: io.Error) {
|
|||||||
if b.err != nil {
|
if b.err != nil {
|
||||||
return 0, b.err
|
return 0, b.err
|
||||||
}
|
}
|
||||||
if writer_buffered(b) == 0 {
|
|
||||||
if w, ok := io.to_reader_from(b.wr); !ok {
|
|
||||||
n, err = io.read_from(w, r)
|
|
||||||
b.err = err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
if writer_available(b) == 0 {
|
if writer_available(b) == 0 {
|
||||||
writer_flush(b) or_return
|
writer_flush(b) or_return
|
||||||
@@ -222,46 +214,35 @@ writer_read_from :: proc(b: ^Writer, r: io.Reader) -> (n: i64, err: io.Error) {
|
|||||||
|
|
||||||
// writer_to_stream converts a Writer into an io.Stream
|
// writer_to_stream converts a Writer into an io.Stream
|
||||||
writer_to_stream :: proc(b: ^Writer) -> (s: io.Stream) {
|
writer_to_stream :: proc(b: ^Writer) -> (s: io.Stream) {
|
||||||
s.stream_data = b
|
s.data = b
|
||||||
s.stream_vtable = &_writer_vtable
|
s.procedure = _writer_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// writer_to_stream converts a Writer into an io.Stream
|
// writer_to_stream converts a Writer into an io.Stream
|
||||||
writer_to_writer :: proc(b: ^Writer) -> (s: io.Writer) {
|
writer_to_writer :: proc(b: ^Writer) -> (s: io.Writer) {
|
||||||
s.stream_data = b
|
return writer_to_stream(b)
|
||||||
s.stream_vtable = &_writer_vtable
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_writer_vtable := io.Stream_VTable{
|
_writer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_destroy = proc(s: io.Stream) -> io.Error {
|
b := (^Writer)(stream_data)
|
||||||
b := (^Writer)(s.stream_data)
|
#partial switch mode {
|
||||||
|
case .Flush:
|
||||||
|
err = writer_flush(b)
|
||||||
|
return
|
||||||
|
case .Write:
|
||||||
|
n_int: int
|
||||||
|
n_int, err = writer_write(b, p)
|
||||||
|
n = i64(n_int)
|
||||||
|
return
|
||||||
|
case .Destroy:
|
||||||
writer_destroy(b)
|
writer_destroy(b)
|
||||||
return nil
|
return
|
||||||
},
|
case .Query:
|
||||||
impl_flush = proc(s: io.Stream) -> io.Error {
|
return io.query_utility({.Flush, .Write, .Destroy, .Query})
|
||||||
b := (^Writer)(s.stream_data)
|
}
|
||||||
return writer_flush(b)
|
return 0, .Empty
|
||||||
},
|
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
b := (^Writer)(s.stream_data)
|
|
||||||
return writer_write(b, p)
|
|
||||||
},
|
|
||||||
impl_write_byte = proc(s: io.Stream, c: byte) -> io.Error {
|
|
||||||
b := (^Writer)(s.stream_data)
|
|
||||||
return writer_write_byte(b, c)
|
|
||||||
},
|
|
||||||
impl_write_rune = proc(s: io.Stream, r: rune) -> (int, io.Error) {
|
|
||||||
b := (^Writer)(s.stream_data)
|
|
||||||
return writer_write_rune(b, r)
|
|
||||||
},
|
|
||||||
impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
|
|
||||||
b := (^Writer)(s.stream_data)
|
|
||||||
return writer_read_from(b, r)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-60
@@ -375,69 +375,31 @@ buffer_read_from :: proc(b: ^Buffer, r: io.Reader) -> (n: i64, err: io.Error) #n
|
|||||||
|
|
||||||
|
|
||||||
buffer_to_stream :: proc(b: ^Buffer) -> (s: io.Stream) {
|
buffer_to_stream :: proc(b: ^Buffer) -> (s: io.Stream) {
|
||||||
s.stream_data = b
|
s.data = b
|
||||||
s.stream_vtable = &_buffer_vtable
|
s.procedure = _buffer_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_buffer_vtable := io.Stream_VTable{
|
_buffer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
b := (^Buffer)(stream_data)
|
||||||
b := (^Buffer)(s.stream_data)
|
#partial switch mode {
|
||||||
return i64(buffer_capacity(b))
|
case .Read:
|
||||||
},
|
return io._i64_err(buffer_read(b, p))
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
case .Read_At:
|
||||||
b := (^Buffer)(s.stream_data)
|
return io._i64_err(buffer_read_at(b, p, int(offset)))
|
||||||
return buffer_read(b, p)
|
case .Write:
|
||||||
},
|
return io._i64_err(buffer_write(b, p))
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
case .Write_At:
|
||||||
b := (^Buffer)(s.stream_data)
|
return io._i64_err(buffer_write_at(b, p, int(offset)))
|
||||||
return buffer_read_at(b, p, int(offset))
|
case .Size:
|
||||||
},
|
n = i64(buffer_capacity(b))
|
||||||
impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
|
return
|
||||||
b := (^Buffer)(s.stream_data)
|
case .Destroy:
|
||||||
return buffer_read_byte(b)
|
|
||||||
},
|
|
||||||
impl_read_rune = proc(s: io.Stream) -> (r: rune, size: int, err: io.Error) {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_read_rune(b)
|
|
||||||
},
|
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_write(b, p)
|
|
||||||
},
|
|
||||||
impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_write_at(b, p, int(offset))
|
|
||||||
},
|
|
||||||
impl_write_byte = proc(s: io.Stream, c: byte) -> io.Error {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_write_byte(b, c)
|
|
||||||
},
|
|
||||||
impl_write_rune = proc(s: io.Stream, r: rune) -> (int, io.Error) {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_write_rune(b, r)
|
|
||||||
},
|
|
||||||
impl_unread_byte = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_unread_byte(b)
|
|
||||||
},
|
|
||||||
impl_unread_rune = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_unread_rune(b)
|
|
||||||
},
|
|
||||||
impl_destroy = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
buffer_destroy(b)
|
buffer_destroy(b)
|
||||||
return nil
|
return
|
||||||
},
|
case .Query:
|
||||||
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Size, .Destroy})
|
||||||
b := (^Buffer)(s.stream_data)
|
}
|
||||||
return buffer_write_to(b, w)
|
return 0, .Empty
|
||||||
},
|
|
||||||
impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
|
|
||||||
b := (^Buffer)(s.stream_data)
|
|
||||||
return buffer_read_from(b, r)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-39
@@ -16,8 +16,8 @@ reader_init :: proc(r: ^Reader, s: []byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
|
reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
|
||||||
s.stream_data = r
|
s.data = r
|
||||||
s.stream_vtable = &_reader_vtable
|
s.procedure = _reader_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,41 +137,22 @@ reader_write_to :: proc(r: ^Reader, w: io.Writer) -> (n: i64, err: io.Error) {
|
|||||||
|
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_reader_vtable := io.Stream_VTable{
|
_reader_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
r := (^Reader)(stream_data)
|
||||||
r := (^Reader)(s.stream_data)
|
#partial switch mode {
|
||||||
return reader_size(r)
|
case .Read:
|
||||||
},
|
return io._i64_err(reader_read(r, p))
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
case .Read_At:
|
||||||
r := (^Reader)(s.stream_data)
|
return io._i64_err(reader_read_at(r, p, offset))
|
||||||
return reader_read(r, p)
|
case .Seek:
|
||||||
},
|
n, err = reader_seek(r, offset, whence)
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, off: i64) -> (n: int, err: io.Error) {
|
return
|
||||||
r := (^Reader)(s.stream_data)
|
case .Size:
|
||||||
return reader_read_at(r, p, off)
|
n = reader_size(r)
|
||||||
},
|
return
|
||||||
impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
|
case .Query:
|
||||||
r := (^Reader)(s.stream_data)
|
return io.query_utility({.Read, .Read_At, .Seek, .Size, .Query})
|
||||||
return reader_read_byte(r)
|
}
|
||||||
},
|
return 0, .Empty
|
||||||
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)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -188,7 +188,8 @@ input_size_from_memory :: proc(z: ^Context_Memory_Input) -> (res: i64, err: Erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
input_size_from_stream :: proc(z: ^Context_Stream_Input) -> (res: i64, err: Error) {
|
input_size_from_stream :: proc(z: ^Context_Stream_Input) -> (res: i64, err: Error) {
|
||||||
return io.size(z.input), nil
|
res, _ = io.size(z.input)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
input_size :: proc{input_size_from_memory, input_size_from_stream}
|
input_size :: proc{input_size_from_memory, input_size_from_stream}
|
||||||
@@ -215,7 +216,7 @@ read_slice_from_stream :: #force_inline proc(z: ^Context_Stream_Input, size: int
|
|||||||
// TODO: REMOVE ALL USE OF context.temp_allocator here
|
// TODO: REMOVE ALL USE OF context.temp_allocator here
|
||||||
// the is literally no need for it
|
// the is literally no need for it
|
||||||
b := make([]u8, size, context.temp_allocator)
|
b := make([]u8, size, context.temp_allocator)
|
||||||
_, e := z.input->impl_read(b[:])
|
_, e := io.read(z.input, b[:])
|
||||||
if e == .None {
|
if e == .None {
|
||||||
return b, .None
|
return b, .None
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -307,7 +307,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_blake2.update(&ctx, buf[:read])
|
_blake2.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_blake2.update(&ctx, buf[:read])
|
_blake2.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -307,7 +307,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ hash_stream_128_3 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -164,7 +164,7 @@ hash_stream_128_4 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -249,7 +249,7 @@ hash_stream_128_5 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -334,7 +334,7 @@ hash_stream_160_3 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -419,7 +419,7 @@ hash_stream_160_4 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -504,7 +504,7 @@ hash_stream_160_5 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -589,7 +589,7 @@ hash_stream_192_3 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -674,7 +674,7 @@ hash_stream_192_4 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -759,7 +759,7 @@ hash_stream_192_5 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -844,7 +844,7 @@ hash_stream_224_3 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -929,7 +929,7 @@ hash_stream_224_4 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -1014,7 +1014,7 @@ hash_stream_224_5 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -1099,7 +1099,7 @@ hash_stream_256_3 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -1184,7 +1184,7 @@ hash_stream_256_4 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
@@ -1270,7 +1270,7 @@ hash_stream_256_5 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
ctx.str_len = u32(len(buf[:read]))
|
ctx.str_len = u32(len(buf[:read]))
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -228,7 +228,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -307,7 +307,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -159,7 +159,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -241,7 +241,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -323,7 +323,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ hash_stream_160 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -221,7 +221,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ hash_stream_320 :: proc(s: io.Stream) -> ([DIGEST_SIZE_320]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -232,7 +232,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -311,7 +311,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -152,7 +152,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -231,7 +231,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -310,7 +310,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_sha3.update(&ctx, buf[:read])
|
_sha3.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -146,7 +146,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ hash_stream_160 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -229,7 +229,7 @@ hash_stream_192 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ hash_stream_160 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
@@ -229,7 +229,7 @@ hash_stream_192 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
_tiger.update(&ctx, buf[:read])
|
_tiger.update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
read := 1
|
read := 1
|
||||||
for read > 0 {
|
for read > 0 {
|
||||||
read, _ = s->impl_read(buf)
|
read, _ = io.read(s, buf)
|
||||||
if read > 0 {
|
if read > 0 {
|
||||||
update(&ctx, buf[:read])
|
update(&ctx, buf[:read])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ fprint :: proc(fd: os.Handle, args: ..any, sep := " ") -> int {
|
|||||||
b: bufio.Writer
|
b: bufio.Writer
|
||||||
defer bufio.writer_flush(&b)
|
defer bufio.writer_flush(&b)
|
||||||
|
|
||||||
bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:])
|
bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:])
|
||||||
w := bufio.writer_to_writer(&b)
|
w := bufio.writer_to_writer(&b)
|
||||||
return wprint(w, ..args, sep=sep)
|
return wprint(w, ..args, sep=sep)
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ fprintln :: proc(fd: os.Handle, args: ..any, sep := " ") -> int {
|
|||||||
b: bufio.Writer
|
b: bufio.Writer
|
||||||
defer bufio.writer_flush(&b)
|
defer bufio.writer_flush(&b)
|
||||||
|
|
||||||
bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:])
|
bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:])
|
||||||
|
|
||||||
w := bufio.writer_to_writer(&b)
|
w := bufio.writer_to_writer(&b)
|
||||||
return wprintln(w, ..args, sep=sep)
|
return wprintln(w, ..args, sep=sep)
|
||||||
@@ -34,7 +34,7 @@ fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int {
|
|||||||
b: bufio.Writer
|
b: bufio.Writer
|
||||||
defer bufio.writer_flush(&b)
|
defer bufio.writer_flush(&b)
|
||||||
|
|
||||||
bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:])
|
bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:])
|
||||||
|
|
||||||
w := bufio.writer_to_writer(&b)
|
w := bufio.writer_to_writer(&b)
|
||||||
return wprintf(w, fmt, ..args)
|
return wprintf(w, fmt, ..args)
|
||||||
@@ -44,7 +44,7 @@ fprint_type :: proc(fd: os.Handle, info: ^runtime.Type_Info) -> (n: int, err: io
|
|||||||
b: bufio.Writer
|
b: bufio.Writer
|
||||||
defer bufio.writer_flush(&b)
|
defer bufio.writer_flush(&b)
|
||||||
|
|
||||||
bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:])
|
bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:])
|
||||||
|
|
||||||
w := bufio.writer_to_writer(&b)
|
w := bufio.writer_to_writer(&b)
|
||||||
return wprint_type(w, info)
|
return wprint_type(w, info)
|
||||||
@@ -54,7 +54,7 @@ fprint_typeid :: proc(fd: os.Handle, id: typeid) -> (n: int, err: io.Error) {
|
|||||||
b: bufio.Writer
|
b: bufio.Writer
|
||||||
defer bufio.writer_flush(&b)
|
defer bufio.writer_flush(&b)
|
||||||
|
|
||||||
bufio.writer_init_with_buf(&b, {os.stream_from_handle(fd)}, buf[:])
|
bufio.writer_init_with_buf(&b, os.stream_from_handle(fd), buf[:])
|
||||||
|
|
||||||
w := bufio.writer_to_writer(&b)
|
w := bufio.writer_to_writer(&b)
|
||||||
return wprint_typeid(w, id)
|
return wprint_typeid(w, id)
|
||||||
|
|||||||
+30
-74
@@ -1,124 +1,80 @@
|
|||||||
package io
|
package io
|
||||||
|
|
||||||
to_reader :: proc(s: Stream) -> (r: Reader, ok: bool = true) #optional_ok {
|
to_reader :: proc(s: Stream) -> (r: Reader, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read == nil {
|
ok = .Read in query(s)
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_writer :: proc(s: Stream) -> (w: Writer, ok: bool = true) #optional_ok {
|
to_writer :: proc(s: Stream) -> (w: Writer, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write == nil {
|
ok = .Write in query(s)
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
to_closer :: proc(s: Stream) -> (c: Closer, ok: bool = true) #optional_ok {
|
to_closer :: proc(s: Stream) -> (c: Closer, ok: bool = true) #optional_ok {
|
||||||
c.stream = s
|
c = s
|
||||||
if s.stream_vtable == nil || s.impl_close == nil {
|
ok = .Close in query(s)
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_flusher :: proc(s: Stream) -> (f: Flusher, ok: bool = true) #optional_ok {
|
to_flusher :: proc(s: Stream) -> (f: Flusher, ok: bool = true) #optional_ok {
|
||||||
f.stream = s
|
f = s
|
||||||
if s.stream_vtable == nil || s.impl_flush == nil {
|
ok = .Flush in query(s)
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_seeker :: proc(s: Stream) -> (seeker: Seeker, ok: bool = true) #optional_ok {
|
to_seeker :: proc(s: Stream) -> (seeker: Seeker, ok: bool = true) #optional_ok {
|
||||||
seeker.stream = s
|
seeker = s
|
||||||
if s.stream_vtable == nil || s.impl_seek == nil {
|
ok = .Seek in query(s)
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
to_read_writer :: proc(s: Stream) -> (r: Read_Writer, ok: bool = true) #optional_ok {
|
to_read_writer :: proc(s: Stream) -> (r: Read_Writer, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read == nil || s.impl_write == nil {
|
ok = query(s) >= {.Read, .Write}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_read_closer :: proc(s: Stream) -> (r: Read_Closer, ok: bool = true) #optional_ok {
|
to_read_closer :: proc(s: Stream) -> (r: Read_Closer, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read == nil || s.impl_close == nil {
|
ok = query(s) >= {.Read, .Close}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_read_write_closer :: proc(s: Stream) -> (r: Read_Write_Closer, ok: bool = true) #optional_ok {
|
to_read_write_closer :: proc(s: Stream) -> (r: Read_Write_Closer, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read == nil || s.impl_write == nil || s.impl_close == nil {
|
ok = query(s) >= {.Read, .Write, .Close}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_read_write_seeker :: proc(s: Stream) -> (r: Read_Write_Seeker, ok: bool = true) #optional_ok {
|
to_read_write_seeker :: proc(s: Stream) -> (r: Read_Write_Seeker, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read == nil || s.impl_write == nil || s.impl_seek == nil {
|
ok = query(s) >= {.Read, .Write, .Seek}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_write_flusher :: proc(s: Stream) -> (w: Write_Flusher, ok: bool = true) #optional_ok {
|
to_write_flusher :: proc(s: Stream) -> (w: Write_Flusher, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write == nil || s.impl_flush == nil {
|
ok = query(s) >= {.Write, .Flush}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_write_flush_closer :: proc(s: Stream) -> (w: Write_Flush_Closer, ok: bool = true) #optional_ok {
|
to_write_flush_closer :: proc(s: Stream) -> (w: Write_Flush_Closer, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write == nil || s.impl_flush == nil || s.impl_close == nil {
|
ok = query(s) >= {.Write, .Flush, .Close}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
to_reader_at :: proc(s: Stream) -> (r: Reader_At, ok: bool = true) #optional_ok {
|
to_reader_at :: proc(s: Stream) -> (r: Reader_At, ok: bool = true) #optional_ok {
|
||||||
r.stream = s
|
r = s
|
||||||
if s.stream_vtable == nil || s.impl_read_at == nil {
|
ok = query(s) >= {.Read_At}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_writer_at :: proc(s: Stream) -> (w: Writer_At, ok: bool = true) #optional_ok {
|
to_writer_at :: proc(s: Stream) -> (w: Writer_At, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write_at == nil {
|
ok = query(s) >= {.Write_At}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
to_reader_from :: proc(s: Stream) -> (r: Reader_From, ok: bool = true) #optional_ok {
|
|
||||||
r.stream = s
|
|
||||||
if s.stream_vtable == nil || s.impl_read_from == nil {
|
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
to_writer_to :: proc(s: Stream) -> (w: Writer_To, ok: bool = true) #optional_ok {
|
|
||||||
w.stream = s
|
|
||||||
if s.stream_vtable == nil || s.impl_write_to == nil {
|
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_write_closer :: proc(s: Stream) -> (w: Write_Closer, ok: bool = true) #optional_ok {
|
to_write_closer :: proc(s: Stream) -> (w: Write_Closer, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write == nil || s.impl_close == nil {
|
ok = query(s) >= {.Write, .Close}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
to_write_seeker :: proc(s: Stream) -> (w: Write_Seeker, ok: bool = true) #optional_ok {
|
to_write_seeker :: proc(s: Stream) -> (w: Write_Seeker, ok: bool = true) #optional_ok {
|
||||||
w.stream = s
|
w = s
|
||||||
if s.stream_vtable == nil || s.impl_write == nil || s.impl_seek == nil {
|
ok = query(s) >= {.Write, .Seek}
|
||||||
ok = false
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+146
-298
@@ -53,137 +53,106 @@ Error :: enum i32 {
|
|||||||
Empty = -1,
|
Empty = -1,
|
||||||
}
|
}
|
||||||
|
|
||||||
Close_Proc :: proc(using s: Stream) -> Error
|
Stream_Mode :: enum {
|
||||||
Flush_Proc :: proc(using s: Stream) -> Error
|
Close,
|
||||||
Seek_Proc :: proc(using s: Stream, offset: i64, whence: Seek_From) -> (n: i64, err: Error)
|
Flush,
|
||||||
Size_Proc :: proc(using s: Stream) -> i64
|
Read,
|
||||||
Read_Proc :: proc(using s: Stream, p: []byte) -> (n: int, err: Error)
|
Read_At,
|
||||||
Read_At_Proc :: proc(using s: Stream, p: []byte, off: i64) -> (n: int, err: Error)
|
Write,
|
||||||
Read_From_Proc :: proc(using s: Stream, r: Reader) -> (n: i64, err: Error)
|
Write_At,
|
||||||
Read_Byte_Proc :: proc(using s: Stream) -> (byte, Error)
|
Seek,
|
||||||
Read_Rune_Proc :: proc(using s: Stream) -> (ch: rune, size: int, err: Error)
|
Size,
|
||||||
Unread_Byte_Proc :: proc(using s: Stream) -> Error
|
Destroy,
|
||||||
Unread_Rune_Proc :: proc(using s: Stream) -> Error
|
Query, // query what modes are available
|
||||||
Write_Proc :: proc(using s: Stream, p: []byte) -> (n: int, err: Error)
|
}
|
||||||
Write_At_Proc :: proc(using s: Stream, p: []byte, off: i64) -> (n: int, err: Error)
|
|
||||||
Write_To_Proc :: proc(using s: Stream, w: Writer) -> (n: i64, err: Error)
|
|
||||||
Write_Byte_Proc :: proc(using s: Stream, c: byte) -> Error
|
|
||||||
Write_Rune_Proc :: proc(using s: Stream, r: rune) -> (size: int, err: Error)
|
|
||||||
Destroy_Proc :: proc(using s: Stream) -> Error
|
|
||||||
|
|
||||||
|
Stream_Mode_Set :: distinct bit_set[Stream_Mode; i64]
|
||||||
|
|
||||||
|
Stream_Proc :: #type proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error)
|
||||||
|
|
||||||
Stream :: struct {
|
Stream :: struct {
|
||||||
using stream_vtable: ^Stream_VTable,
|
procedure: Stream_Proc,
|
||||||
stream_data: rawptr,
|
data: rawptr,
|
||||||
}
|
|
||||||
Stream_VTable :: struct {
|
|
||||||
impl_close: Close_Proc,
|
|
||||||
impl_flush: Flush_Proc,
|
|
||||||
|
|
||||||
impl_seek: Seek_Proc,
|
|
||||||
impl_size: Size_Proc,
|
|
||||||
|
|
||||||
impl_read: Read_Proc,
|
|
||||||
impl_read_at: Read_At_Proc,
|
|
||||||
impl_read_byte: Read_Byte_Proc,
|
|
||||||
impl_read_rune: Read_Rune_Proc,
|
|
||||||
impl_write_to: Write_To_Proc,
|
|
||||||
|
|
||||||
impl_write: Write_Proc,
|
|
||||||
impl_write_at: Write_At_Proc,
|
|
||||||
impl_write_byte: Write_Byte_Proc,
|
|
||||||
impl_write_rune: Write_Rune_Proc,
|
|
||||||
impl_read_from: Read_From_Proc,
|
|
||||||
|
|
||||||
impl_unread_byte: Unread_Byte_Proc,
|
|
||||||
impl_unread_rune: Unread_Rune_Proc,
|
|
||||||
|
|
||||||
impl_destroy: Destroy_Proc,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reader :: Stream
|
||||||
|
Writer :: Stream
|
||||||
|
Closer :: Stream
|
||||||
|
Flusher :: Stream
|
||||||
|
Seeker :: Stream
|
||||||
|
|
||||||
Reader :: struct {using stream: Stream}
|
Read_Writer :: Stream
|
||||||
Writer :: struct {using stream: Stream}
|
Read_Closer :: Stream
|
||||||
Closer :: struct {using stream: Stream}
|
Read_Write_Closer :: Stream
|
||||||
Flusher :: struct {using stream: Stream}
|
Read_Write_Seeker :: Stream
|
||||||
Seeker :: struct {using stream: Stream}
|
|
||||||
|
|
||||||
Read_Writer :: struct {using stream: Stream}
|
Write_Closer :: Stream
|
||||||
Read_Closer :: struct {using stream: Stream}
|
Write_Seeker :: Stream
|
||||||
Read_Write_Closer :: struct {using stream: Stream}
|
Write_Flusher :: Stream
|
||||||
Read_Write_Seeker :: struct {using stream: Stream}
|
Write_Flush_Closer :: Stream
|
||||||
|
|
||||||
Write_Closer :: struct {using stream: Stream}
|
Reader_At :: Stream
|
||||||
Write_Seeker :: struct {using stream: Stream}
|
Writer_At :: Stream
|
||||||
Write_Flusher :: struct {using stream: Stream}
|
|
||||||
Write_Flush_Closer :: struct {using stream: Stream}
|
|
||||||
|
|
||||||
Reader_At :: struct {using stream: Stream}
|
|
||||||
Writer_At :: struct {using stream: Stream}
|
|
||||||
Reader_From :: struct {using stream: Stream}
|
|
||||||
Writer_To :: struct {using stream: Stream}
|
|
||||||
|
|
||||||
|
|
||||||
destroy :: proc(s: Stream) -> Error {
|
destroy :: proc(s: Stream) -> (err: Error) {
|
||||||
close_err := close({s})
|
_ = flush(s)
|
||||||
if s.stream_vtable != nil && s.impl_destroy != nil {
|
_ = close(s)
|
||||||
return s->impl_destroy()
|
if s.procedure != nil {
|
||||||
|
_, err = s.procedure(s.data, .Destroy, nil, 0, nil)
|
||||||
|
} else {
|
||||||
|
err = .Empty
|
||||||
}
|
}
|
||||||
if close_err != .None {
|
return
|
||||||
return close_err
|
|
||||||
}
|
|
||||||
return .Empty
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query :: proc(s: Stream) -> (set: Stream_Mode_Set) {
|
||||||
|
if s.procedure != nil {
|
||||||
|
n, _ := s.procedure(s.data, .Query, nil, 0, nil)
|
||||||
|
set = transmute(Stream_Mode_Set)n
|
||||||
|
if set != nil {
|
||||||
|
set += {.Query}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
query_utility :: #force_inline proc "contextless" (set: Stream_Mode_Set) -> (n: i64, err: Error) {
|
||||||
|
return transmute(i64)set, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_i64_err :: #force_inline proc "contextless" (n: int, err: Error) -> (i64, Error) {
|
||||||
|
return i64(n), err
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// read reads up to len(p) bytes into s. It returns the number of bytes read and any error if occurred.
|
// read reads up to len(p) bytes into s. It returns the number of bytes read and any error if occurred.
|
||||||
//
|
//
|
||||||
// When read encounters an .EOF or error after successfully reading n > 0 bytes, it returns the number of
|
// When read encounters an .EOF or error after successfully reading n > 0 bytes, it returns the number of
|
||||||
// bytes read along with the error.
|
// bytes read along with the error.
|
||||||
read :: proc(s: Reader, p: []byte, n_read: ^int = nil) -> (n: int, err: Error) {
|
read :: proc(s: Reader, p: []byte, n_read: ^int = nil) -> (n: int, err: Error) {
|
||||||
if s.stream_vtable != nil {
|
if s.procedure != nil {
|
||||||
if s.impl_read != nil {
|
n64: i64
|
||||||
n, err = s->impl_read(p)
|
n64, err = s.procedure(s.data, .Read, p, 0, nil)
|
||||||
if n_read != nil {
|
n = int(n64)
|
||||||
n_read^ += n
|
if n_read != nil { n_read^ += n }
|
||||||
}
|
} else {
|
||||||
return
|
err = .Empty
|
||||||
} else if s.impl_read_byte != nil {
|
|
||||||
bytes_read := 0
|
|
||||||
defer if n_read != nil {
|
|
||||||
n_read^ += bytes_read
|
|
||||||
}
|
|
||||||
for _, i in p {
|
|
||||||
p[i] = s->impl_read_byte() or_return
|
|
||||||
bytes_read += 1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0, .Empty
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// write writes up to len(p) bytes into s. It returns the number of bytes written and any error if occurred.
|
// write writes up to len(p) bytes into s. It returns the number of bytes written and any error if occurred.
|
||||||
write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Error) {
|
write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Error) {
|
||||||
if s.stream_vtable != nil {
|
if s.procedure != nil {
|
||||||
if s.impl_write != nil {
|
n64: i64
|
||||||
n, err = s->impl_write(p)
|
n64, err = s.procedure(s.data, .Write, p, 0, nil)
|
||||||
if n_written != nil {
|
n = int(n64)
|
||||||
n_written^ += n
|
if n_written != nil { n_written^ += n }
|
||||||
}
|
} else {
|
||||||
return
|
err = .Empty
|
||||||
} else if s.impl_write_byte != nil {
|
|
||||||
bytes_written := 0
|
|
||||||
defer if n_written != nil {
|
|
||||||
n_written^ += bytes_written
|
|
||||||
}
|
|
||||||
for c in p {
|
|
||||||
s->impl_write_byte(c) or_return
|
|
||||||
bytes_written += 1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0, .Empty
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// seek sets the offset of the next read or write to offset.
|
// seek sets the offset of the next read or write to offset.
|
||||||
@@ -194,57 +163,45 @@ write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Erro
|
|||||||
//
|
//
|
||||||
// seek returns the new offset to the start of the file/stream, and any error if occurred.
|
// seek returns the new offset to the start of the file/stream, and any error if occurred.
|
||||||
seek :: proc(s: Seeker, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
seek :: proc(s: Seeker, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
if s.stream_vtable != nil && s.impl_seek != nil {
|
if s.procedure != nil {
|
||||||
return s->impl_seek(offset, whence)
|
n, err = s.procedure(s.data, .Seek, nil, offset, whence)
|
||||||
|
} else {
|
||||||
|
err = .Empty
|
||||||
}
|
}
|
||||||
return 0, .Empty
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// The behaviour of close after the first call is stream implementation defined.
|
// The behaviour of close after the first call is stream implementation defined.
|
||||||
// Different streams may document their own behaviour.
|
// Different streams may document their own behaviour.
|
||||||
close :: proc(s: Closer) -> Error {
|
close :: proc(s: Closer) -> (err: Error) {
|
||||||
if s.stream_vtable != nil && s.impl_close != nil {
|
if s.procedure != nil {
|
||||||
return s->impl_close()
|
_, err = s.procedure(s.data, .Close, nil, 0, nil)
|
||||||
}
|
}
|
||||||
// Instead of .Empty, .None is fine in this case
|
return
|
||||||
return .None
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flush :: proc(s: Flusher) -> Error {
|
flush :: proc(s: Flusher) -> (err: Error) {
|
||||||
if s.stream_vtable != nil && s.impl_flush != nil {
|
if s.procedure != nil {
|
||||||
return s->impl_flush()
|
_, err = s.procedure(s.data, .Flush, nil, 0, nil)
|
||||||
}
|
}
|
||||||
// Instead of .Empty, .None is fine in this case
|
return
|
||||||
return .None
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// size returns the size of the stream. If the stream does not support querying its size, 0 will be returned.
|
// size returns the size of the stream. If the stream does not support querying its size, 0 will be returned.
|
||||||
size :: proc(s: Stream) -> i64 {
|
size :: proc(s: Stream) -> (n: i64, err: Error) {
|
||||||
if s.stream_vtable == nil {
|
if s.procedure != nil {
|
||||||
return 0
|
n, err = s.procedure(s.data, .Size, nil, 0, nil)
|
||||||
|
if err == .Empty {
|
||||||
|
n = 0
|
||||||
|
curr := seek(s, 0, .Current) or_return
|
||||||
|
end := seek(s, 0, .End) or_return
|
||||||
|
seek(s, curr, .Start) or_return
|
||||||
|
n = end
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = .Empty
|
||||||
}
|
}
|
||||||
if s.impl_size != nil {
|
return
|
||||||
return s->impl_size()
|
|
||||||
}
|
|
||||||
if s.impl_seek == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
curr, end: i64
|
|
||||||
err: Error
|
|
||||||
if curr, err = s->impl_seek(0, .Current); err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if end, err = s->impl_seek(0, .End); err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = s->impl_seek(curr, .Start); err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return end
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -256,29 +213,24 @@ size :: proc(s: Stream) -> i64 {
|
|||||||
//
|
//
|
||||||
// If n == len(p), err may be either nil or .EOF
|
// If n == len(p), err may be either nil or .EOF
|
||||||
read_at :: proc(r: Reader_At, p: []byte, offset: i64, n_read: ^int = nil) -> (n: int, err: Error) {
|
read_at :: proc(r: Reader_At, p: []byte, offset: i64, n_read: ^int = nil) -> (n: int, err: Error) {
|
||||||
defer if n_read != nil {
|
if r.procedure != nil {
|
||||||
n_read^ += n
|
n64: i64
|
||||||
}
|
n64, err = r.procedure(r.data, .Read_At, p, offset, nil)
|
||||||
|
if err != .Empty {
|
||||||
if r.stream_vtable == nil {
|
n = int(n64)
|
||||||
return 0, .Empty
|
} else {
|
||||||
}
|
curr := seek(r, offset, .Current) or_return
|
||||||
if r.impl_read_at != nil {
|
n, err = read(r, p)
|
||||||
return r->impl_read_at(p, offset)
|
_, err1 := seek(r, curr, .Start)
|
||||||
}
|
if err1 != nil && err == nil {
|
||||||
if r.impl_seek == nil || r.impl_read == nil {
|
err = err1
|
||||||
return 0, .Empty
|
}
|
||||||
}
|
}
|
||||||
|
if n_read != nil { n_read^ += n }
|
||||||
curr_offset := r->impl_seek(offset, .Current) or_return
|
} else {
|
||||||
|
err = .Empty
|
||||||
n, err = r->impl_read(p)
|
|
||||||
_, err1 := r->impl_seek(curr_offset, .Start)
|
|
||||||
if err1 != nil && err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// write_at writes len(p) bytes into p starting with the provided offset in the underlying Writer_At stream w.
|
// write_at writes len(p) bytes into p starting with the provided offset in the underlying Writer_At stream w.
|
||||||
@@ -287,97 +239,39 @@ read_at :: proc(r: Reader_At, p: []byte, offset: i64, n_read: ^int = nil) -> (n:
|
|||||||
// If write_at is writing to a Writer_At which has a seek offset, then write_at should not affect the underlying
|
// If write_at is writing to a Writer_At which has a seek offset, then write_at should not affect the underlying
|
||||||
// seek offset.
|
// seek offset.
|
||||||
write_at :: proc(w: Writer_At, p: []byte, offset: i64, n_written: ^int = nil) -> (n: int, err: Error) {
|
write_at :: proc(w: Writer_At, p: []byte, offset: i64, n_written: ^int = nil) -> (n: int, err: Error) {
|
||||||
defer if n_written != nil {
|
if w.procedure != nil {
|
||||||
n_written^ += n
|
n64: i64
|
||||||
}
|
n64, err = w.procedure(w.data, .Write_At, p, offset, nil)
|
||||||
|
if err != .Empty {
|
||||||
if w.stream_vtable == nil {
|
n = int(n64)
|
||||||
return 0, .Empty
|
} else {
|
||||||
}
|
curr := seek(w, offset, .Current) or_return
|
||||||
if w.impl_write_at != nil {
|
n, err = write(w, p)
|
||||||
return w->impl_write_at(p, offset)
|
_, err1 := seek(w, curr, .Start)
|
||||||
}
|
if err1 != nil && err == nil {
|
||||||
if w.impl_seek == nil || w.impl_write == nil {
|
err = err1
|
||||||
return 0, .Empty
|
}
|
||||||
}
|
}
|
||||||
|
if n_written != nil { n_written^ += n }
|
||||||
curr_offset: i64
|
} else {
|
||||||
curr_offset, err = w->impl_seek(offset, .Current)
|
err = .Empty
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
n, err = w->impl_write(p)
|
|
||||||
_, err1 := w->impl_seek(curr_offset, .Start)
|
|
||||||
if err1 != nil && err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
write_to :: proc(r: Writer_To, w: Writer) -> (n: i64, err: Error) {
|
|
||||||
if r.stream_vtable == nil || w.stream_vtable == nil {
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
if r.impl_write_to != nil {
|
|
||||||
return r->impl_write_to(w)
|
|
||||||
}
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
read_from :: proc(w: Reader_From, r: Reader) -> (n: i64, err: Error) {
|
|
||||||
if r.stream_vtable == nil || w.stream_vtable == nil {
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
if r.impl_read_from != nil {
|
|
||||||
return w->impl_read_from(r)
|
|
||||||
}
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// read_byte reads and returns the next byte from r.
|
// read_byte reads and returns the next byte from r.
|
||||||
read_byte :: proc(r: Reader, n_read: ^int = nil) -> (b: byte, err: Error) {
|
read_byte :: proc(r: Reader, n_read: ^int = nil) -> (b: byte, err: Error) {
|
||||||
defer if err == nil && n_read != nil {
|
|
||||||
n_read^ += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.stream_vtable == nil {
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
if r.impl_read_byte != nil {
|
|
||||||
return r->impl_read_byte()
|
|
||||||
}
|
|
||||||
if r.impl_read == nil {
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
buf: [1]byte
|
buf: [1]byte
|
||||||
_, err = r->impl_read(buf[:])
|
_, err = read(r, buf[:], n_read)
|
||||||
return buf[0], err
|
b = buf[0]
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
write_byte :: proc(w: Writer, c: byte, n_written: ^int = nil) -> Error {
|
write_byte :: proc(w: Writer, c: byte, n_written: ^int = nil) -> Error {
|
||||||
return _write_byte(auto_cast w, c, n_written)
|
buf: [1]byte
|
||||||
}
|
buf[0] = c
|
||||||
|
write(w, buf[:], n_written) or_return
|
||||||
@(private)
|
return nil
|
||||||
_write_byte :: proc(w: Writer, c: byte, n_written: ^int = nil) -> (err: Error) {
|
|
||||||
defer if err == nil && n_written != nil {
|
|
||||||
n_written^ += 1
|
|
||||||
}
|
|
||||||
if w.stream_vtable == nil {
|
|
||||||
return .Empty
|
|
||||||
}
|
|
||||||
if w.impl_write_byte != nil {
|
|
||||||
return w->impl_write_byte(c)
|
|
||||||
}
|
|
||||||
if w.impl_write == nil {
|
|
||||||
return .Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
b := [1]byte{c}
|
|
||||||
_, err = w->impl_write(b[:])
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// read_rune reads a single UTF-8 encoded Unicode codepoint and returns the rune and its size in bytes.
|
// read_rune reads a single UTF-8 encoded Unicode codepoint and returns the rune and its size in bytes.
|
||||||
@@ -385,19 +279,9 @@ read_rune :: proc(br: Reader, n_read: ^int = nil) -> (ch: rune, size: int, err:
|
|||||||
defer if err == nil && n_read != nil {
|
defer if err == nil && n_read != nil {
|
||||||
n_read^ += size
|
n_read^ += size
|
||||||
}
|
}
|
||||||
if br.stream_vtable == nil {
|
|
||||||
return 0, 0, .Empty
|
|
||||||
}
|
|
||||||
if br.impl_read_rune != nil {
|
|
||||||
return br->impl_read_rune()
|
|
||||||
}
|
|
||||||
if br.impl_read == nil {
|
|
||||||
return 0, 0, .Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
b: [utf8.UTF_MAX]byte
|
b: [utf8.UTF_MAX]byte
|
||||||
_, err = br->impl_read(b[:1])
|
_, err = read(br, b[:1])
|
||||||
|
|
||||||
|
|
||||||
s0 := b[0]
|
s0 := b[0]
|
||||||
ch = rune(s0)
|
ch = rune(s0)
|
||||||
@@ -415,7 +299,7 @@ read_rune :: proc(br: Reader, n_read: ^int = nil) -> (ch: rune, size: int, err:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
sz := int(x&7)
|
sz := int(x&7)
|
||||||
size, err = br->impl_read(b[1:sz])
|
size, err = read(br, b[1:sz])
|
||||||
if err != nil || size+1 < sz {
|
if err != nil || size+1 < sz {
|
||||||
ch = utf8.RUNE_ERROR
|
ch = utf8.RUNE_ERROR
|
||||||
return
|
return
|
||||||
@@ -425,28 +309,6 @@ read_rune :: proc(br: Reader, n_read: ^int = nil) -> (ch: rune, size: int, err:
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
unread_byte :: proc(s: Stream) -> Error {
|
|
||||||
if s.stream_vtable == nil {
|
|
||||||
return .Empty
|
|
||||||
}
|
|
||||||
if s.impl_unread_byte != nil {
|
|
||||||
return s->impl_unread_byte()
|
|
||||||
}
|
|
||||||
if s.impl_seek != nil {
|
|
||||||
_, err := s->impl_seek(-1, .Current)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return .Empty
|
|
||||||
}
|
|
||||||
unread_rune :: proc(s: Writer) -> Error {
|
|
||||||
if s.stream_vtable != nil && s.impl_unread_rune != nil {
|
|
||||||
return s->impl_unread_rune()
|
|
||||||
}
|
|
||||||
return .Empty
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// write_string writes the contents of the string s to w.
|
// write_string writes the contents of the string s to w.
|
||||||
write_string :: proc(s: Writer, str: string, n_written: ^int = nil) -> (n: int, err: Error) {
|
write_string :: proc(s: Writer, str: string, n_written: ^int = nil) -> (n: int, err: Error) {
|
||||||
return write(s, transmute([]byte)str, n_written)
|
return write(s, transmute([]byte)str, n_written)
|
||||||
@@ -457,14 +319,6 @@ write_rune :: proc(s: Writer, r: rune, n_written: ^int = nil) -> (size: int, err
|
|||||||
defer if err == nil && n_written != nil {
|
defer if err == nil && n_written != nil {
|
||||||
n_written^ += size
|
n_written^ += size
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.stream_vtable == nil {
|
|
||||||
return 0, .Empty
|
|
||||||
}
|
|
||||||
if s.impl_write_rune != nil {
|
|
||||||
return s->impl_write_rune(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
if r < utf8.RUNE_SELF {
|
if r < utf8.RUNE_SELF {
|
||||||
err = write_byte(s, byte(r))
|
err = write_byte(s, byte(r))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -542,21 +396,15 @@ copy_n :: proc(dst: Writer, src: Reader, n: i64) -> (written: i64, err: Error) {
|
|||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_copy_buffer :: proc(dst: Writer, src: Reader, buf: []byte) -> (written: i64, err: Error) {
|
_copy_buffer :: proc(dst: Writer, src: Reader, buf: []byte) -> (written: i64, err: Error) {
|
||||||
if dst.stream_vtable == nil || src.stream_vtable == nil {
|
if dst.procedure == nil || src.procedure == nil {
|
||||||
return 0, .Empty
|
return 0, .Empty
|
||||||
}
|
}
|
||||||
if src.impl_write_to != nil {
|
|
||||||
return src->impl_write_to(dst)
|
|
||||||
}
|
|
||||||
if src.impl_read_from != nil {
|
|
||||||
return dst->impl_read_from(src)
|
|
||||||
}
|
|
||||||
buf := buf
|
buf := buf
|
||||||
if buf == nil {
|
if buf == nil {
|
||||||
DEFAULT_SIZE :: 4 * 1024
|
DEFAULT_SIZE :: 4 * 1024
|
||||||
size := DEFAULT_SIZE
|
size := DEFAULT_SIZE
|
||||||
if src.stream_vtable == _limited_reader_vtable {
|
if src.procedure == _limited_reader_proc {
|
||||||
l := (^Limited_Reader)(src.stream_data)
|
l := (^Limited_Reader)(src.data)
|
||||||
if i64(size) > l.n {
|
if i64(size) > l.n {
|
||||||
if l.n < 1 {
|
if l.n < 1 {
|
||||||
size = 1
|
size = 1
|
||||||
|
|||||||
+48
-40
@@ -5,33 +5,37 @@ Multi_Reader :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_multi_reader_vtable := &Stream_VTable{
|
_multi_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
impl_read = proc(s: Stream, p: []byte) -> (n: int, err: Error) {
|
if mode == .Query {
|
||||||
mr := (^Multi_Reader)(s.stream_data)
|
return query_utility({.Read, .Query})
|
||||||
for len(mr.readers) > 0 {
|
} else if mode != .Read {
|
||||||
r := mr.readers[0]
|
return 0, .Empty
|
||||||
n, err = read(r, p)
|
}
|
||||||
if err == .EOF {
|
mr := (^Multi_Reader)(stream_data)
|
||||||
ordered_remove(&mr.readers, 0)
|
for len(mr.readers) > 0 {
|
||||||
}
|
r := mr.readers[0]
|
||||||
if n > 0 || err != .EOF {
|
n, err = _i64_err(read(r, p))
|
||||||
if err == .EOF && len(mr.readers) > 0 {
|
if err == .EOF {
|
||||||
// Don't return EOF yet, more readers remain
|
ordered_remove(&mr.readers, 0)
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0, .EOF
|
if n > 0 || err != .EOF {
|
||||||
},
|
if err == .EOF && len(mr.readers) > 0 {
|
||||||
|
// Don't return EOF yet, more readers remain
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, .EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
multi_reader_init :: proc(mr: ^Multi_Reader, readers: ..Reader, allocator := context.allocator) -> (r: Reader) {
|
multi_reader_init :: proc(mr: ^Multi_Reader, readers: ..Reader, allocator := context.allocator) -> (r: Reader) {
|
||||||
all_readers := make([dynamic]Reader, 0, len(readers), allocator)
|
all_readers := make([dynamic]Reader, 0, len(readers), allocator)
|
||||||
|
|
||||||
for w in readers {
|
for w in readers {
|
||||||
if w.stream_vtable == _multi_reader_vtable {
|
if w.procedure == _multi_reader_proc {
|
||||||
other := (^Multi_Reader)(w.stream_data)
|
other := (^Multi_Reader)(w.data)
|
||||||
append(&all_readers, ..other.readers[:])
|
append(&all_readers, ..other.readers[:])
|
||||||
} else {
|
} else {
|
||||||
append(&all_readers, w)
|
append(&all_readers, w)
|
||||||
@@ -40,8 +44,8 @@ multi_reader_init :: proc(mr: ^Multi_Reader, readers: ..Reader, allocator := con
|
|||||||
|
|
||||||
mr.readers = all_readers
|
mr.readers = all_readers
|
||||||
|
|
||||||
r.stream_vtable = _multi_reader_vtable
|
r.procedure = _multi_reader_proc
|
||||||
r.stream_data = mr
|
r.data = mr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,38 +59,42 @@ Multi_Writer :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_multi_writer_vtable := &Stream_VTable{
|
_multi_writer_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
impl_write = proc(s: Stream, p: []byte) -> (n: int, err: Error) {
|
if mode == .Query {
|
||||||
mw := (^Multi_Writer)(s.stream_data)
|
return query_utility({.Write, .Query})
|
||||||
for w in mw.writers {
|
} else if mode != .Write {
|
||||||
n, err = write(w, p)
|
return 0, .Empty
|
||||||
if err != nil {
|
}
|
||||||
return
|
mw := (^Multi_Writer)(stream_data)
|
||||||
}
|
for w in mw.writers {
|
||||||
if n != len(p) {
|
n, err = _i64_err(write(w, p))
|
||||||
err = .Short_Write
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if n != i64(len(p)) {
|
||||||
|
err = .Short_Write
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return len(p), nil
|
return i64(len(p)), nil
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
multi_writer_init :: proc(mw: ^Multi_Writer, writers: ..Writer, allocator := context.allocator) -> (out: Writer) {
|
multi_writer_init :: proc(mw: ^Multi_Writer, writers: ..Writer, allocator := context.allocator) -> (out: Writer) {
|
||||||
mw.writers = make([dynamic]Writer, 0, len(writers), allocator)
|
mw.writers = make([dynamic]Writer, 0, len(writers), allocator)
|
||||||
|
|
||||||
for w in writers {
|
for w in writers {
|
||||||
if w.stream_vtable == _multi_writer_vtable {
|
if w.procedure == _multi_writer_proc {
|
||||||
other := (^Multi_Writer)(w.stream_data)
|
other := (^Multi_Writer)(w.data)
|
||||||
append(&mw.writers, ..other.writers[:])
|
append(&mw.writers, ..other.writers[:])
|
||||||
} else {
|
} else {
|
||||||
append(&mw.writers, w)
|
append(&mw.writers, w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out.stream_vtable = _multi_writer_vtable
|
out.procedure = _multi_writer_proc
|
||||||
out.stream_data = mw
|
out.data = mw
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+43
-36
@@ -292,17 +292,21 @@ Tee_Reader :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_tee_reader_vtable := &Stream_VTable{
|
_tee_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
impl_read = proc(s: Stream, p: []byte) -> (n: int, err: Error) {
|
t := (^Tee_Reader)(stream_data)
|
||||||
t := (^Tee_Reader)(s.stream_data)
|
#partial switch mode {
|
||||||
n, err = read(t.r, p)
|
case .Read:
|
||||||
|
n, err = _i64_err(read(t.r, p))
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
if wn, werr := write(t.w, p[:n]); werr != nil {
|
if wn, werr := write(t.w, p[:n]); werr != nil {
|
||||||
return wn, werr
|
return i64(wn), werr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
},
|
case .Query:
|
||||||
|
return query_utility({.Read, .Query})
|
||||||
|
}
|
||||||
|
return 0, .Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
// tee_reader_init returns a Reader that writes to 'w' what it reads from 'r'
|
// tee_reader_init returns a Reader that writes to 'w' what it reads from 'r'
|
||||||
@@ -317,8 +321,8 @@ tee_reader_init :: proc(t: ^Tee_Reader, r: Reader, w: Writer, allocator := conte
|
|||||||
}
|
}
|
||||||
|
|
||||||
tee_reader_to_reader :: proc(t: ^Tee_Reader) -> (r: Reader) {
|
tee_reader_to_reader :: proc(t: ^Tee_Reader) -> (r: Reader) {
|
||||||
r.stream_data = t
|
r.data = t
|
||||||
r.stream_vtable = _tee_reader_vtable
|
r.procedure = _tee_reader_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,9 +336,10 @@ Limited_Reader :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_limited_reader_vtable := &Stream_VTable{
|
_limited_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
impl_read = proc(s: Stream, p: []byte) -> (n: int, err: Error) {
|
l := (^Limited_Reader)(stream_data)
|
||||||
l := (^Limited_Reader)(s.stream_data)
|
#partial switch mode {
|
||||||
|
case .Read:
|
||||||
if l.n <= 0 {
|
if l.n <= 0 {
|
||||||
return 0, .EOF
|
return 0, .EOF
|
||||||
}
|
}
|
||||||
@@ -342,10 +347,13 @@ _limited_reader_vtable := &Stream_VTable{
|
|||||||
if i64(len(p)) > l.n {
|
if i64(len(p)) > l.n {
|
||||||
p = p[0:l.n]
|
p = p[0:l.n]
|
||||||
}
|
}
|
||||||
n, err = read(l.r, p)
|
n, err = _i64_err(read(l.r, p))
|
||||||
l.n -= i64(n)
|
l.n -= i64(n)
|
||||||
return
|
return
|
||||||
},
|
case .Query:
|
||||||
|
return query_utility({.Read, .Query})
|
||||||
|
}
|
||||||
|
return 0, .Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
limited_reader_init :: proc(l: ^Limited_Reader, r: Reader, n: i64) -> Reader {
|
limited_reader_init :: proc(l: ^Limited_Reader, r: Reader, n: i64) -> Reader {
|
||||||
@@ -355,8 +363,8 @@ limited_reader_init :: proc(l: ^Limited_Reader, r: Reader, n: i64) -> Reader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
limited_reader_to_reader :: proc(l: ^Limited_Reader) -> (r: Reader) {
|
limited_reader_to_reader :: proc(l: ^Limited_Reader) -> (r: Reader) {
|
||||||
r.stream_vtable = _limited_reader_vtable
|
r.procedure = _limited_reader_proc
|
||||||
r.stream_data = l
|
r.data = l
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,15 +383,16 @@ section_reader_init :: proc(s: ^Section_Reader, r: Reader_At, off: i64, n: i64)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
section_reader_to_stream :: proc(s: ^Section_Reader) -> (out: Stream) {
|
section_reader_to_stream :: proc(s: ^Section_Reader) -> (out: Stream) {
|
||||||
out.stream_data = s
|
out.data = s
|
||||||
out.stream_vtable = _section_reader_vtable
|
out.procedure = _section_reader_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_section_reader_vtable := &Stream_VTable{
|
_section_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
||||||
impl_read = proc(stream: Stream, p: []byte) -> (n: int, err: Error) {
|
s := (^Section_Reader)(stream_data)
|
||||||
s := (^Section_Reader)(stream.stream_data)
|
#partial switch mode {
|
||||||
|
case .Read:
|
||||||
if s.off >= s.limit {
|
if s.off >= s.limit {
|
||||||
return 0, .EOF
|
return 0, .EOF
|
||||||
}
|
}
|
||||||
@@ -391,13 +400,11 @@ _section_reader_vtable := &Stream_VTable{
|
|||||||
if max := s.limit - s.off; i64(len(p)) > max {
|
if max := s.limit - s.off; i64(len(p)) > max {
|
||||||
p = p[0:max]
|
p = p[0:max]
|
||||||
}
|
}
|
||||||
n, err = read_at(s.r, p, s.off)
|
n, err = _i64_err(read_at(s.r, p, s.off))
|
||||||
s.off += i64(n)
|
s.off += i64(n)
|
||||||
return
|
return
|
||||||
},
|
case .Read_At:
|
||||||
impl_read_at = proc(stream: Stream, p: []byte, off: i64) -> (n: int, err: Error) {
|
p, off := p, offset
|
||||||
s := (^Section_Reader)(stream.stream_data)
|
|
||||||
p, off := p, off
|
|
||||||
|
|
||||||
if off < 0 || off >= s.limit - s.base {
|
if off < 0 || off >= s.limit - s.base {
|
||||||
return 0, .EOF
|
return 0, .EOF
|
||||||
@@ -405,17 +412,15 @@ _section_reader_vtable := &Stream_VTable{
|
|||||||
off += s.base
|
off += s.base
|
||||||
if max := s.limit - off; i64(len(p)) > max {
|
if max := s.limit - off; i64(len(p)) > max {
|
||||||
p = p[0:max]
|
p = p[0:max]
|
||||||
n, err = read_at(s.r, p, off)
|
n, err = _i64_err(read_at(s.r, p, off))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = .EOF
|
err = .EOF
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return read_at(s.r, p, off)
|
return _i64_err(read_at(s.r, p, off))
|
||||||
},
|
|
||||||
impl_seek = proc(stream: Stream, offset: i64, whence: Seek_From) -> (n: i64, err: Error) {
|
|
||||||
s := (^Section_Reader)(stream.stream_data)
|
|
||||||
|
|
||||||
|
case .Seek:
|
||||||
offset := offset
|
offset := offset
|
||||||
switch whence {
|
switch whence {
|
||||||
case:
|
case:
|
||||||
@@ -433,10 +438,12 @@ _section_reader_vtable := &Stream_VTable{
|
|||||||
s.off = offset
|
s.off = offset
|
||||||
n = offset - s.base
|
n = offset - s.base
|
||||||
return
|
return
|
||||||
},
|
case .Size:
|
||||||
impl_size = proc(stream: Stream) -> i64 {
|
n = s.limit - s.base
|
||||||
s := (^Section_Reader)(stream.stream_data)
|
return
|
||||||
return s.limit - s.base
|
case .Query:
|
||||||
},
|
return query_utility({.Read, .Read_At, .Seek, .Size, .Query})
|
||||||
}
|
}
|
||||||
|
return 0, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,14 +37,18 @@ _get_platform_error :: proc() -> Error {
|
|||||||
case win32.ERROR_NOT_SUPPORTED:
|
case win32.ERROR_NOT_SUPPORTED:
|
||||||
return .Unsupported
|
return .Unsupported
|
||||||
|
|
||||||
|
case win32.ERROR_HANDLE_EOF:
|
||||||
|
return .EOF
|
||||||
|
|
||||||
|
case win32.ERROR_INVALID_HANDLE:
|
||||||
|
return .Invalid_File
|
||||||
|
|
||||||
case
|
case
|
||||||
win32.ERROR_BAD_ARGUMENTS,
|
win32.ERROR_BAD_ARGUMENTS,
|
||||||
win32.ERROR_INVALID_PARAMETER,
|
win32.ERROR_INVALID_PARAMETER,
|
||||||
win32.ERROR_NOT_ENOUGH_MEMORY,
|
win32.ERROR_NOT_ENOUGH_MEMORY,
|
||||||
win32.ERROR_INVALID_HANDLE,
|
|
||||||
win32.ERROR_NO_MORE_FILES,
|
win32.ERROR_NO_MORE_FILES,
|
||||||
win32.ERROR_LOCK_VIOLATION,
|
win32.ERROR_LOCK_VIOLATION,
|
||||||
win32.ERROR_HANDLE_EOF,
|
|
||||||
win32.ERROR_BROKEN_PIPE,
|
win32.ERROR_BROKEN_PIPE,
|
||||||
win32.ERROR_CALL_NOT_IMPLEMENTED,
|
win32.ERROR_CALL_NOT_IMPLEMENTED,
|
||||||
win32.ERROR_INSUFFICIENT_BUFFER,
|
win32.ERROR_INSUFFICIENT_BUFFER,
|
||||||
|
|||||||
+40
-32
@@ -8,12 +8,6 @@ File :: struct {
|
|||||||
impl: _File,
|
impl: _File,
|
||||||
}
|
}
|
||||||
|
|
||||||
Seek_From :: enum {
|
|
||||||
Start = 0, // seek relative to the origin of the file
|
|
||||||
Current = 1, // seek relative to the current offset
|
|
||||||
End = 2, // seek relative to the end
|
|
||||||
}
|
|
||||||
|
|
||||||
File_Mode :: distinct u32
|
File_Mode :: distinct u32
|
||||||
File_Mode_Dir :: File_Mode(1<<16)
|
File_Mode_Dir :: File_Mode(1<<16)
|
||||||
File_Mode_Named_Pipe :: File_Mode(1<<17)
|
File_Mode_Named_Pipe :: File_Mode(1<<17)
|
||||||
@@ -72,54 +66,68 @@ fd :: proc(f: ^File) -> uintptr {
|
|||||||
return _fd(f)
|
return _fd(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
close :: proc(f: ^File) -> Error {
|
|
||||||
return _close(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
name :: proc(f: ^File) -> string {
|
name :: proc(f: ^File) -> string {
|
||||||
return _name(f)
|
return _name(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
seek :: proc(f: ^File, offset: i64, whence: Seek_From) -> (ret: i64, err: Error) {
|
close :: proc(f: ^File) -> Error {
|
||||||
return _seek(f, offset, whence)
|
if f != nil {
|
||||||
|
return io.close(f.impl.stream)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Error) {
|
||||||
|
if f != nil {
|
||||||
|
return io.seek(f.impl.stream, offset, whence)
|
||||||
|
}
|
||||||
|
return 0, .Invalid_File
|
||||||
}
|
}
|
||||||
|
|
||||||
read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
||||||
return _read(f, p)
|
if f != nil {
|
||||||
|
return io.read(f.impl.stream, p)
|
||||||
|
}
|
||||||
|
return 0, .Invalid_File
|
||||||
}
|
}
|
||||||
|
|
||||||
read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
||||||
return _read_at(f, p, offset)
|
if f != nil {
|
||||||
}
|
return io.read_at(f.impl.stream, p, offset)
|
||||||
|
}
|
||||||
read_from :: proc(f: ^File, r: io.Reader) -> (n: i64, err: Error) {
|
return 0, .Invalid_File
|
||||||
return _read_from(f, r)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
||||||
return _write(f, p)
|
if f != nil {
|
||||||
|
return io.write(f.impl.stream, p)
|
||||||
|
}
|
||||||
|
return 0, .Invalid_File
|
||||||
}
|
}
|
||||||
|
|
||||||
write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
||||||
return _write_at(f, p, offset)
|
if f != nil {
|
||||||
}
|
return io.write_at(f.impl.stream, p, offset)
|
||||||
|
}
|
||||||
write_to :: proc(f: ^File, w: io.Writer) -> (n: i64, err: Error) {
|
return 0, .Invalid_File
|
||||||
return _write_to(f, w)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
||||||
return _file_size(f)
|
if f != nil {
|
||||||
}
|
return io.size(f.impl.stream)
|
||||||
|
}
|
||||||
|
return 0, .Invalid_File
|
||||||
sync :: proc(f: ^File) -> Error {
|
|
||||||
return _sync(f)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
flush :: proc(f: ^File) -> Error {
|
flush :: proc(f: ^File) -> Error {
|
||||||
return _flush(f)
|
if f != nil {
|
||||||
|
return io.flush(f.impl.stream)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sync :: proc(f: ^File) -> Error {
|
||||||
|
return _sync(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
truncate :: proc(f: ^File, size: i64) -> Error {
|
truncate :: proc(f: ^File, size: i64) -> Error {
|
||||||
|
|||||||
+63
-21
@@ -33,6 +33,8 @@ _File :: struct {
|
|||||||
name: string,
|
name: string,
|
||||||
fd: int,
|
fd: int,
|
||||||
allocator: runtime.Allocator,
|
allocator: runtime.Allocator,
|
||||||
|
|
||||||
|
stream: io.Stream,
|
||||||
}
|
}
|
||||||
|
|
||||||
_file_allocator :: proc() -> runtime.Allocator {
|
_file_allocator :: proc() -> runtime.Allocator {
|
||||||
@@ -73,6 +75,10 @@ _new_file :: proc(fd: uintptr, _: string) -> ^File {
|
|||||||
file.impl.fd = int(fd)
|
file.impl.fd = int(fd)
|
||||||
file.impl.allocator = _file_allocator()
|
file.impl.allocator = _file_allocator()
|
||||||
file.impl.name = _get_full_path(file.impl.fd, file.impl.allocator)
|
file.impl.name = _get_full_path(file.impl.fd, file.impl.allocator)
|
||||||
|
file.impl.stream = {
|
||||||
|
data = file,
|
||||||
|
procedure = _file_stream_proc,
|
||||||
|
}
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +108,7 @@ _name :: proc(f: ^File) -> string {
|
|||||||
return f.impl.name if f != nil else ""
|
return f.impl.name if f != nil else ""
|
||||||
}
|
}
|
||||||
|
|
||||||
_seek :: proc(f: ^File, offset: i64, whence: Seek_From) -> (ret: i64, err: Error) {
|
_seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Error) {
|
||||||
res := unix.sys_lseek(f.impl.fd, offset, int(whence))
|
res := unix.sys_lseek(f.impl.fd, offset, int(whence))
|
||||||
if res < 0 {
|
if res < 0 {
|
||||||
return -1, _get_platform_error(int(res))
|
return -1, _get_platform_error(int(res))
|
||||||
@@ -110,18 +116,18 @@ _seek :: proc(f: ^File, offset: i64, whence: Seek_From) -> (ret: i64, err: Error
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
_read :: proc(f: ^File, p: []byte) -> (i64, Error) {
|
||||||
if len(p) == 0 {
|
if len(p) == 0 {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
n = unix.sys_read(f.impl.fd, &p[0], len(p))
|
n := unix.sys_read(f.impl.fd, &p[0], len(p))
|
||||||
if n < 0 {
|
if n < 0 {
|
||||||
return -1, _get_platform_error(n)
|
return -1, _get_platform_error(n)
|
||||||
}
|
}
|
||||||
return n, nil
|
return i64(n), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
_read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
if offset < 0 {
|
if offset < 0 {
|
||||||
return 0, .Invalid_Offset
|
return 0, .Invalid_Offset
|
||||||
}
|
}
|
||||||
@@ -132,30 +138,25 @@ _read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
if m < 0 {
|
if m < 0 {
|
||||||
return -1, _get_platform_error(m)
|
return -1, _get_platform_error(m)
|
||||||
}
|
}
|
||||||
n += m
|
n += i64(m)
|
||||||
b = b[m:]
|
b = b[m:]
|
||||||
offset += i64(m)
|
offset += i64(m)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_read_from :: proc(f: ^File, r: io.Reader) -> (n: i64, err: Error) {
|
_write :: proc(f: ^File, p: []byte) -> (i64, Error) {
|
||||||
//TODO
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
|
||||||
if len(p) == 0 {
|
if len(p) == 0 {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
n = unix.sys_write(f.impl.fd, &p[0], uint(len(p)))
|
n := unix.sys_write(f.impl.fd, &p[0], uint(len(p)))
|
||||||
if n < 0 {
|
if n < 0 {
|
||||||
return -1, _get_platform_error(n)
|
return -1, _get_platform_error(n)
|
||||||
}
|
}
|
||||||
return int(n), nil
|
return i64(n), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
_write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
if offset < 0 {
|
if offset < 0 {
|
||||||
return 0, .Invalid_Offset
|
return 0, .Invalid_Offset
|
||||||
}
|
}
|
||||||
@@ -166,18 +167,13 @@ _write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
if m < 0 {
|
if m < 0 {
|
||||||
return -1, _get_platform_error(m)
|
return -1, _get_platform_error(m)
|
||||||
}
|
}
|
||||||
n += m
|
n += i64(m)
|
||||||
b = b[m:]
|
b = b[m:]
|
||||||
offset += i64(m)
|
offset += i64(m)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_write_to :: proc(f: ^File, w: io.Writer) -> (n: i64, err: Error) {
|
|
||||||
//TODO
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
_file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
||||||
s: _Stat = ---
|
s: _Stat = ---
|
||||||
res := unix.sys_fstat(f.impl.fd, &s)
|
res := unix.sys_fstat(f.impl.fd, &s)
|
||||||
@@ -366,3 +362,49 @@ _is_dir_fd :: proc(fd: int) -> bool {
|
|||||||
_temp_name_to_cstring :: proc(name: string) -> (cname: cstring) {
|
_temp_name_to_cstring :: proc(name: string) -> (cname: cstring) {
|
||||||
return strings.clone_to_cstring(name, context.temp_allocator)
|
return strings.clone_to_cstring(name, context.temp_allocator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@(private="package")
|
||||||
|
_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
|
f := (^File)(stream_data)
|
||||||
|
ferr: Error
|
||||||
|
i: int
|
||||||
|
switch mode {
|
||||||
|
case .Read:
|
||||||
|
n, ferr = _read(f, p)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Read_At:
|
||||||
|
n, ferr = _read_at(f, p, offset)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Write:
|
||||||
|
n, ferr = _write(f, p)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Write_At:
|
||||||
|
n, ferr = _write_at(f, p, offset)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Seek:
|
||||||
|
n, ferr = _seek(f, offset, whence)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Size:
|
||||||
|
n, ferr = _file_size(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Flush:
|
||||||
|
ferr = _flush(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Close, .Destroy:
|
||||||
|
ferr = _close(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Query:
|
||||||
|
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Destroy, .Query})
|
||||||
|
}
|
||||||
|
return 0, .Empty
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,17 +3,15 @@ package os2
|
|||||||
import "core:io"
|
import "core:io"
|
||||||
|
|
||||||
to_stream :: proc(f: ^File) -> (s: io.Stream) {
|
to_stream :: proc(f: ^File) -> (s: io.Stream) {
|
||||||
s.stream_data = f
|
if f != nil {
|
||||||
s.stream_vtable = &_file_stream_vtable
|
assert(f.impl.stream.procedure != nil)
|
||||||
|
s = f.impl.stream
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
to_writer :: proc(f: ^File) -> (s: io.Writer) {
|
to_writer :: to_stream
|
||||||
return {to_stream(f)}
|
to_reader :: to_stream
|
||||||
}
|
|
||||||
to_reader :: proc(f: ^File) -> (s: io.Reader) {
|
|
||||||
return {to_stream(f)}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
@@ -23,71 +21,3 @@ error_to_io_error :: proc(ferr: Error) -> io.Error {
|
|||||||
}
|
}
|
||||||
return ferr.(io.Error) or_else .Unknown
|
return ferr.(io.Error) or_else .Unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@(private)
|
|
||||||
_file_stream_vtable := io.Stream_VTable{
|
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = read(f, p)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = read_at(f, p, offset)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_write_to = proc(s: io.Stream, w: io.Writer) -> (n: i64, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = write_to(f, w)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = write(f, p)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = write_at(f, p, offset)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_read_from = proc(s: io.Stream, r: io.Reader) -> (n: i64, err: io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr: Error
|
|
||||||
n, ferr = read_from(f, r)
|
|
||||||
err = error_to_io_error(ferr)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
n, ferr := seek(f, offset, Seek_From(whence))
|
|
||||||
err := error_to_io_error(ferr)
|
|
||||||
return n, err
|
|
||||||
},
|
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
sz, _ := file_size(f)
|
|
||||||
return sz
|
|
||||||
},
|
|
||||||
impl_flush = proc(s: io.Stream) -> io.Error {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr := flush(f)
|
|
||||||
return error_to_io_error(ferr)
|
|
||||||
},
|
|
||||||
impl_close = proc(s: io.Stream) -> io.Error {
|
|
||||||
f := (^File)(s.stream_data)
|
|
||||||
ferr := close(f)
|
|
||||||
return error_to_io_error(ferr)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ _File :: struct {
|
|||||||
wname: win32.wstring,
|
wname: win32.wstring,
|
||||||
kind: _File_Kind,
|
kind: _File_Kind,
|
||||||
|
|
||||||
|
stream: io.Stream,
|
||||||
|
|
||||||
allocator: runtime.Allocator,
|
allocator: runtime.Allocator,
|
||||||
|
|
||||||
rw_mutex: sync.RW_Mutex, // read write calls
|
rw_mutex: sync.RW_Mutex, // read write calls
|
||||||
@@ -144,6 +146,11 @@ _new_file :: proc(handle: uintptr, name: string) -> ^File {
|
|||||||
}
|
}
|
||||||
f.impl.kind = kind
|
f.impl.kind = kind
|
||||||
|
|
||||||
|
f.impl.stream = {
|
||||||
|
data = f,
|
||||||
|
procedure = _file_stream_proc,
|
||||||
|
}
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +188,7 @@ _name :: proc(f: ^File) -> string {
|
|||||||
return f.impl.name if f != nil else ""
|
return f.impl.name if f != nil else ""
|
||||||
}
|
}
|
||||||
|
|
||||||
_seek :: proc(f: ^File, offset: i64, whence: Seek_From) -> (ret: i64, err: Error) {
|
_seek :: proc(f: ^File, offset: i64, whence: io.Seek_From) -> (ret: i64, err: Error) {
|
||||||
handle := _handle(f)
|
handle := _handle(f)
|
||||||
if handle == win32.INVALID_HANDLE {
|
if handle == win32.INVALID_HANDLE {
|
||||||
return 0, .Invalid_File
|
return 0, .Invalid_File
|
||||||
@@ -208,7 +215,7 @@ _seek :: proc(f: ^File, offset: i64, whence: Seek_From) -> (ret: i64, err: Error
|
|||||||
return i64(hi)<<32 + i64(dw_ptr), nil
|
return i64(hi)<<32 + i64(dw_ptr), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
_read :: proc(f: ^File, p: []byte) -> (n: i64, err: Error) {
|
||||||
read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Error) {
|
read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Error) {
|
||||||
if len(b) == 0 {
|
if len(b) == 0 {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
@@ -274,7 +281,7 @@ _read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
|||||||
n, err := read_console(handle, p[total_read:][:to_read])
|
n, err := read_console(handle, p[total_read:][:to_read])
|
||||||
total_read += n
|
total_read += n
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return int(total_read), err
|
return i64(total_read), err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ok = win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil)
|
ok = win32.ReadFile(handle, &p[total_read], to_read, &single_read_length, nil)
|
||||||
@@ -287,11 +294,11 @@ _read :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return int(total_read), err
|
return i64(total_read), err
|
||||||
}
|
}
|
||||||
|
|
||||||
_read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
_read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
pread :: proc(f: ^File, data: []byte, offset: i64) -> (n: int, err: Error) {
|
pread :: proc(f: ^File, data: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
buf := data
|
buf := data
|
||||||
if len(buf) > MAX_RW {
|
if len(buf) > MAX_RW {
|
||||||
buf = buf[:MAX_RW]
|
buf = buf[:MAX_RW]
|
||||||
@@ -313,7 +320,7 @@ _read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
err = _get_platform_error()
|
err = _get_platform_error()
|
||||||
done = 0
|
done = 0
|
||||||
}
|
}
|
||||||
n = int(done)
|
n = i64(done)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,12 +336,7 @@ _read_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_read_from :: proc(f: ^File, r: io.Reader) -> (n: i64, err: Error) {
|
_write :: proc(f: ^File, p: []byte) -> (n: i64, err: Error) {
|
||||||
// TODO(bill)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
|
||||||
if len(p) == 0 {
|
if len(p) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -352,17 +354,17 @@ _write :: proc(f: ^File, p: []byte) -> (n: int, err: Error) {
|
|||||||
|
|
||||||
e := win32.WriteFile(handle, &p[total_write], to_write, &single_write_length, nil)
|
e := win32.WriteFile(handle, &p[total_write], to_write, &single_write_length, nil)
|
||||||
if single_write_length <= 0 || !e {
|
if single_write_length <= 0 || !e {
|
||||||
n = int(total_write)
|
n = i64(total_write)
|
||||||
err = _get_platform_error()
|
err = _get_platform_error()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
total_write += i64(single_write_length)
|
total_write += i64(single_write_length)
|
||||||
}
|
}
|
||||||
return int(total_write), nil
|
return i64(total_write), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
_write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
_write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
pwrite :: proc(f: ^File, data: []byte, offset: i64) -> (n: int, err: Error) {
|
pwrite :: proc(f: ^File, data: []byte, offset: i64) -> (n: i64, err: Error) {
|
||||||
buf := data
|
buf := data
|
||||||
if len(buf) > MAX_RW {
|
if len(buf) > MAX_RW {
|
||||||
buf = buf[:MAX_RW]
|
buf = buf[:MAX_RW]
|
||||||
@@ -382,7 +384,7 @@ _write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
err = _get_platform_error()
|
err = _get_platform_error()
|
||||||
done = 0
|
done = 0
|
||||||
}
|
}
|
||||||
n = int(done)
|
n = i64(done)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,11 +399,6 @@ _write_at :: proc(f: ^File, p: []byte, offset: i64) -> (n: int, err: Error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_write_to :: proc(f: ^File, w: io.Writer) -> (n: i64, err: Error) {
|
|
||||||
// TODO(bill)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
_file_size :: proc(f: ^File) -> (n: i64, err: Error) {
|
||||||
length: win32.LARGE_INTEGER
|
length: win32.LARGE_INTEGER
|
||||||
handle := _handle(f)
|
handle := _handle(f)
|
||||||
@@ -727,3 +724,51 @@ _is_dir :: proc(path: string) -> bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@(private="package")
|
||||||
|
_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
|
f := (^File)(stream_data)
|
||||||
|
ferr: Error
|
||||||
|
i: int
|
||||||
|
switch mode {
|
||||||
|
case .Read:
|
||||||
|
n, ferr = _read(f, p)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Read_At:
|
||||||
|
n, ferr = _read_at(f, p, offset)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Write:
|
||||||
|
n, ferr = _write(f, p)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Write_At:
|
||||||
|
n, ferr = _write_at(f, p, offset)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Seek:
|
||||||
|
n, ferr = _seek(f, offset, whence)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Size:
|
||||||
|
n, ferr = _file_size(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Flush:
|
||||||
|
ferr = _flush(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Close:
|
||||||
|
ferr = _close(f)
|
||||||
|
err = error_to_io_error(ferr)
|
||||||
|
return
|
||||||
|
case .Query:
|
||||||
|
return io.query_utility({.Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Flush, .Close, .Query})
|
||||||
|
case .Destroy:
|
||||||
|
return 0, .Empty
|
||||||
|
}
|
||||||
|
return 0, .Empty
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+46
-52
@@ -4,66 +4,60 @@ import "core:io"
|
|||||||
|
|
||||||
stream_from_handle :: proc(fd: Handle) -> io.Stream {
|
stream_from_handle :: proc(fd: Handle) -> io.Stream {
|
||||||
s: io.Stream
|
s: io.Stream
|
||||||
s.stream_data = rawptr(uintptr(fd))
|
s.data = rawptr(uintptr(fd))
|
||||||
s.stream_vtable = &_file_stream_vtable
|
s.procedure = _file_stream_proc
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@(private)
|
@(private)
|
||||||
_file_stream_vtable := io.Stream_VTable{
|
_file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
fd := Handle(uintptr(stream_data))
|
||||||
fd := Handle(uintptr(s.stream_data))
|
n_int: int
|
||||||
os_err: Errno
|
os_err: Errno
|
||||||
n, os_err = read(fd, p)
|
switch mode {
|
||||||
return
|
case .Close:
|
||||||
},
|
close(fd)
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
case .Flush:
|
||||||
when ODIN_OS == .Windows || ODIN_OS == .WASI {
|
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
os_err: Errno
|
|
||||||
n, os_err = read_at(fd, p, offset)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
os_err: Errno
|
|
||||||
n, os_err = write(fd, p)
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_write_at = proc(s: io.Stream, p: []byte, offset: i64) -> (n: int, err: io.Error) {
|
|
||||||
when ODIN_OS == .Windows || ODIN_OS == .WASI {
|
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
os_err: Errno
|
|
||||||
n, os_err = write_at(fd, p, offset)
|
|
||||||
_ = os_err
|
|
||||||
}
|
|
||||||
return
|
|
||||||
},
|
|
||||||
impl_seek = proc(s: io.Stream, offset: i64, whence: io.Seek_From) -> (i64, io.Error) {
|
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
n, os_err := seek(fd, offset, int(whence))
|
|
||||||
_ = os_err
|
|
||||||
return n, nil
|
|
||||||
},
|
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
sz, _ := file_size(fd)
|
|
||||||
return sz
|
|
||||||
},
|
|
||||||
impl_flush = proc(s: io.Stream) -> io.Error {
|
|
||||||
when ODIN_OS == .Windows {
|
when ODIN_OS == .Windows {
|
||||||
fd := Handle(uintptr(s.stream_data))
|
|
||||||
flush(fd)
|
flush(fd)
|
||||||
} else {
|
} else {
|
||||||
// TOOD(bill): other operating systems
|
// TOOD(bill): other operating systems
|
||||||
}
|
}
|
||||||
return nil
|
case .Read:
|
||||||
},
|
n_int, os_err = read(fd, p)
|
||||||
impl_close = proc(s: io.Stream) -> io.Error {
|
n = i64(n_int)
|
||||||
fd := Handle(uintptr(s.stream_data))
|
if os_err != 0 {
|
||||||
close(fd)
|
err = .Unknown
|
||||||
return nil
|
}
|
||||||
},
|
case .Read_At:
|
||||||
|
when !(ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD) {
|
||||||
|
n_int, os_err = read_at(fd, p, offset)
|
||||||
|
n = i64(n_int)
|
||||||
|
}
|
||||||
|
case .Write:
|
||||||
|
n_int, os_err = write(fd, p)
|
||||||
|
n = i64(n_int)
|
||||||
|
case .Write_At:
|
||||||
|
when !(ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD) {
|
||||||
|
n_int, os_err = write_at(fd, p, offset)
|
||||||
|
n = i64(n_int)
|
||||||
|
}
|
||||||
|
case .Seek:
|
||||||
|
n, os_err = seek(fd, offset, int(whence))
|
||||||
|
case .Size:
|
||||||
|
n, os_err = file_size(fd)
|
||||||
|
case .Destroy:
|
||||||
|
err = .Empty
|
||||||
|
case .Query:
|
||||||
|
when ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD {
|
||||||
|
return io.query_utility({.Close, .Flush, .Read, .Write, .Seek, .Size, .Query})
|
||||||
|
} else {
|
||||||
|
return io.query_utility({.Close, .Flush, .Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Query})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err == nil && os_err != 0 {
|
||||||
|
err = .Unknown
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-25
@@ -164,36 +164,27 @@ builder_init :: proc{
|
|||||||
builder_init_len_cap,
|
builder_init_len_cap,
|
||||||
}
|
}
|
||||||
@(private)
|
@(private)
|
||||||
_builder_stream_vtable_obj := io.Stream_VTable{
|
_builder_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_write = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
b := (^Builder)(stream_data)
|
||||||
b := (^Builder)(s.stream_data)
|
#partial switch mode {
|
||||||
n = write_bytes(b, p)
|
case .Write:
|
||||||
if n < len(p) {
|
n = i64(write_bytes(b, p))
|
||||||
|
if n < i64(len(p)) {
|
||||||
err = .EOF
|
err = .EOF
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
},
|
case .Size:
|
||||||
impl_write_byte = proc(s: io.Stream, c: byte) -> (err: io.Error) {
|
n = i64(len(b.buf))
|
||||||
b := (^Builder)(s.stream_data)
|
|
||||||
n := write_byte(b, c)
|
|
||||||
if n == 0 {
|
|
||||||
err = .EOF
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
},
|
case .Destroy:
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
|
||||||
b := (^Builder)(s.stream_data)
|
|
||||||
return i64(len(b.buf))
|
|
||||||
},
|
|
||||||
impl_destroy = proc(s: io.Stream) -> io.Error {
|
|
||||||
b := (^Builder)(s.stream_data)
|
|
||||||
builder_destroy(b)
|
builder_destroy(b)
|
||||||
return .None
|
return
|
||||||
},
|
case .Query:
|
||||||
|
return io.query_utility({.Write, .Size, .Destroy, .Query})
|
||||||
|
}
|
||||||
|
return 0, .Empty
|
||||||
}
|
}
|
||||||
// NOTE(dweiler): Work around a miscompilation bug on Linux still.
|
|
||||||
@(private)
|
|
||||||
_builder_stream_vtable := &_builder_stream_vtable_obj
|
|
||||||
/*
|
/*
|
||||||
Returns an io.Stream from a Builder
|
Returns an io.Stream from a Builder
|
||||||
|
|
||||||
@@ -204,7 +195,7 @@ Returns:
|
|||||||
- res: the io.Stream
|
- res: the io.Stream
|
||||||
*/
|
*/
|
||||||
to_stream :: proc(b: ^Builder) -> (res: io.Stream) {
|
to_stream :: proc(b: ^Builder) -> (res: io.Stream) {
|
||||||
return io.Stream{stream_vtable=_builder_stream_vtable, stream_data=b}
|
return io.Stream{procedure=_builder_stream_proc, data=b}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Returns an io.Writer from a Builder
|
Returns an io.Writer from a Builder
|
||||||
|
|||||||
+19
-39
@@ -35,8 +35,8 @@ Returns:
|
|||||||
- s: An io.Stream for the given Reader
|
- s: An io.Stream for the given Reader
|
||||||
*/
|
*/
|
||||||
reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
|
reader_to_stream :: proc(r: ^Reader) -> (s: io.Stream) {
|
||||||
s.stream_data = r
|
s.data = r
|
||||||
s.stream_vtable = &_reader_vtable
|
s.procedure = _reader_proc
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -294,41 +294,21 @@ This VTable is used by the Reader struct to provide its functionality
|
|||||||
as an `io.Stream`.
|
as an `io.Stream`.
|
||||||
*/
|
*/
|
||||||
@(private)
|
@(private)
|
||||||
_reader_vtable := io.Stream_VTable{
|
_reader_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||||
impl_size = proc(s: io.Stream) -> i64 {
|
r := (^Reader)(stream_data)
|
||||||
r := (^Reader)(s.stream_data)
|
#partial switch mode {
|
||||||
return reader_size(r)
|
case .Size:
|
||||||
},
|
n = reader_size(r)
|
||||||
impl_read = proc(s: io.Stream, p: []byte) -> (n: int, err: io.Error) {
|
return
|
||||||
r := (^Reader)(s.stream_data)
|
case .Read:
|
||||||
return reader_read(r, p)
|
return io._i64_err(reader_read(r, p))
|
||||||
},
|
case .Read_At:
|
||||||
impl_read_at = proc(s: io.Stream, p: []byte, off: i64) -> (n: int, err: io.Error) {
|
return io._i64_err(reader_read_at(r, p, offset))
|
||||||
r := (^Reader)(s.stream_data)
|
case .Seek:
|
||||||
return reader_read_at(r, p, off)
|
n, err = reader_seek(r, offset, whence)
|
||||||
},
|
return
|
||||||
impl_read_byte = proc(s: io.Stream) -> (byte, io.Error) {
|
case .Query:
|
||||||
r := (^Reader)(s.stream_data)
|
return io.query_utility({.Size, .Read, .Read_At, .Seek, .Query})
|
||||||
return reader_read_byte(r)
|
}
|
||||||
},
|
return 0, .Empty
|
||||||
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)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream_160 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
-4
@@ -72,7 +72,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -230,7 +230,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -309,7 +309,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
-4
@@ -72,7 +72,7 @@ hash_stream_224 :: proc(s: io.Stream) -> ([DIGEST_SIZE_224]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -230,7 +230,7 @@ hash_stream_384 :: proc(s: io.Stream) -> ([DIGEST_SIZE_384]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -309,7 +309,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -70,7 +70,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+3
-3
@@ -72,7 +72,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -151,7 +151,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -230,7 +230,7 @@ hash_stream_slice :: proc(s: io.Stream, bit_size: int, allocator := context.allo
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+2
-2
@@ -70,7 +70,7 @@ hash_stream_256 :: proc(s: io.Stream) -> ([DIGEST_SIZE_256]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ hash_stream_512 :: proc(s: io.Stream) -> ([DIGEST_SIZE_512]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+3
-3
@@ -71,7 +71,7 @@ hash_stream_128 :: proc(s: io.Stream) -> ([DIGEST_SIZE_128]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ hash_stream_160 :: proc(s: io.Stream) -> ([DIGEST_SIZE_160]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
@@ -229,7 +229,7 @@ hash_stream_192 :: proc(s: io.Stream) -> ([DIGEST_SIZE_192]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -69,7 +69,7 @@ hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
|
|||||||
defer delete(buf)
|
defer delete(buf)
|
||||||
i := 1
|
i := 1
|
||||||
for i > 0 {
|
for i > 0 {
|
||||||
i, _ = s->impl_read(buf)
|
i, _ = io.read(s, buf)
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
botan.hash_update(ctx, len(buf) == 0 ? nil : &buf[0], uint(i))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user