aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-08-27 18:45:13 -0400
committerLaytan <laytanlaats@hotmail.com>2024-08-28 19:53:20 +0200
commitf453054affd7b85f8c751c4f62b21788ae9d8ceb (patch)
tree5e1196be43da94a4e5a329c53d951bf6daad7479
parentef99373c31bf515d9e5ab0b2749fb04771311c71 (diff)
Return `0, nil` in all `io` cases where an empty slice is provided
-rw-r--r--core/bytes/buffer.odin6
-rw-r--r--core/bytes/reader.odin6
-rw-r--r--core/io/util.odin9
-rw-r--r--core/os/os2/file_linux.odin6
-rw-r--r--core/os/os2/file_windows.odin6
-rw-r--r--core/os/stream.odin12
6 files changed, 44 insertions, 1 deletions
diff --git a/core/bytes/buffer.odin b/core/bytes/buffer.odin
index a61f8f00d..f4d883353 100644
--- a/core/bytes/buffer.odin
+++ b/core/bytes/buffer.odin
@@ -144,6 +144,9 @@ buffer_grow :: proc(b: ^Buffer, n: int, loc := #caller_location) {
}
buffer_write_at :: proc(b: ^Buffer, p: []byte, offset: int, loc := #caller_location) -> (n: int, err: io.Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
b.last_read = .Invalid
if offset < 0 {
err = .Invalid_Offset
@@ -246,6 +249,9 @@ buffer_read_ptr :: proc(b: ^Buffer, ptr: rawptr, size: int) -> (n: int, err: io.
}
buffer_read_at :: proc(b: ^Buffer, p: []byte, offset: int) -> (n: int, err: io.Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
b.last_read = .Invalid
if uint(offset) >= len(b.buf) {
diff --git a/core/bytes/reader.odin b/core/bytes/reader.odin
index d85e4fe13..2e1c5ed42 100644
--- a/core/bytes/reader.odin
+++ b/core/bytes/reader.odin
@@ -34,6 +34,9 @@ reader_size :: proc(r: ^Reader) -> i64 {
}
reader_read :: proc(r: ^Reader, p: []byte) -> (n: int, err: io.Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
if r.i >= i64(len(r.s)) {
return 0, .EOF
}
@@ -43,6 +46,9 @@ reader_read :: proc(r: ^Reader, p: []byte) -> (n: int, err: io.Error) {
return
}
reader_read_at :: proc(r: ^Reader, p: []byte, off: i64) -> (n: int, err: io.Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
if off < 0 {
return 0, .Invalid_Offset
}
diff --git a/core/io/util.odin b/core/io/util.odin
index 27c344890..e65a69fb3 100644
--- a/core/io/util.odin
+++ b/core/io/util.odin
@@ -340,6 +340,9 @@ _limited_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte,
l := (^Limited_Reader)(stream_data)
#partial switch mode {
case .Read:
+ if len(p) == 0 {
+ return 0, nil
+ }
if l.n <= 0 {
return 0, .EOF
}
@@ -394,6 +397,9 @@ _section_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte,
s := (^Section_Reader)(stream_data)
#partial switch mode {
case .Read:
+ if len(p) == 0 {
+ return 0, nil
+ }
if s.off >= s.limit {
return 0, .EOF
}
@@ -405,6 +411,9 @@ _section_reader_proc :: proc(stream_data: rawptr, mode: Stream_Mode, p: []byte,
s.off += i64(n)
return
case .Read_At:
+ if len(p) == 0 {
+ return 0, nil
+ }
p, off := p, offset
if off < 0 || off >= s.limit - s.base {
diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin
index 11be64741..ad6ddbf17 100644
--- a/core/os/os2/file_linux.odin
+++ b/core/os/os2/file_linux.odin
@@ -201,6 +201,9 @@ _read :: proc(f: ^File_Impl, p: []byte) -> (i64, Error) {
}
_read_at :: proc(f: ^File_Impl, p: []byte, offset: i64) -> (i64, Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
if offset < 0 {
return 0, .Invalid_Offset
}
@@ -226,6 +229,9 @@ _write :: proc(f: ^File_Impl, p: []byte) -> (i64, Error) {
}
_write_at :: proc(f: ^File_Impl, p: []byte, offset: i64) -> (i64, Error) {
+ if len(p) == 0 {
+ return 0, nil
+ }
if offset < 0 {
return 0, .Invalid_Offset
}
diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin
index 56ac7aaae..47e5f0cf2 100644
--- a/core/os/os2/file_windows.odin
+++ b/core/os/os2/file_windows.odin
@@ -266,6 +266,11 @@ _read :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) {
}
_read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) {
+ length := len(p)
+ if length == 0 {
+ return
+ }
+
read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Error) {
if len(b) == 0 {
return 0, nil
@@ -320,7 +325,6 @@ _read_internal :: proc(f: ^File_Impl, p: []byte) -> (n: i64, err: Error) {
single_read_length: win32.DWORD
total_read: int
- length := len(p)
sync.shared_guard(&f.rw_mutex) // multiple readers
diff --git a/core/os/stream.odin b/core/os/stream.odin
index ad8c2461c..39edc9cd5 100644
--- a/core/os/stream.odin
+++ b/core/os/stream.odin
@@ -21,6 +21,9 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte,
case .Flush:
os_err = flush(fd)
case .Read:
+ if len(p) == 0 {
+ return 0, nil
+ }
n_int, os_err = read(fd, p)
n = i64(n_int)
if n == 0 && os_err == nil {
@@ -28,18 +31,27 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte,
}
case .Read_At:
+ if len(p) == 0 {
+ return 0, nil
+ }
n_int, os_err = read_at(fd, p, offset)
n = i64(n_int)
if n == 0 && os_err == nil {
err = .EOF
}
case .Write:
+ if len(p) == 0 {
+ return 0, nil
+ }
n_int, os_err = write(fd, p)
n = i64(n_int)
if n == 0 && os_err == nil {
err = .EOF
}
case .Write_At:
+ if len(p) == 0 {
+ return 0, nil
+ }
n_int, os_err = write_at(fd, p, offset)
n = i64(n_int)
if n == 0 && os_err == nil {