Browse Source

Correct `os.read` on windows for `os.stdin`

gingerBill 3 years ago
parent
commit
47c79a2f25
1 changed files with 6 additions and 5 deletions
  1. 6 5
      core/os/file_windows.odin

+ 6 - 5
core/os/file_windows.odin

@@ -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
 		}
 	}