Correct os.read on windows for os.stdin

This commit is contained in:
gingerBill
2022-02-25 12:02:41 +00:00
parent e81ed9a960
commit 47c79a2f25
+6 -5
View File
@@ -108,17 +108,18 @@ read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Errno) {
buf8: [4*BUF_SIZE]u8
for n < len(b) && err == 0 {
max_read := u32(min(BUF_SIZE, len(b)/4))
min_read := max(min(len(b), 4), len(b)/4)
max_read := u32(min(BUF_SIZE, min_read))
single_read_length: u32
ok := win32.ReadConsoleW(handle, &buf16[0], max_read, &single_read_length, nil)
if !ok {
err = Errno(win32.GetLastError())
}
buf8_len := utf16.decode_to_utf8(buf8[:], buf16[:single_read_length])
src := buf8[:buf8_len]
ctrl_z := false
for i := 0; i < len(src) && n+i < len(b); i += 1 {
x := src[i]
@@ -129,7 +130,7 @@ read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Errno) {
b[n] = x
n += 1
}
if ctrl_z || single_read_length < len(buf16) {
if ctrl_z || single_read_length < max_read {
break
}
}