__read_from_input :: (buffer: [] u8) -> i32 {
err, read := io.stream_read(^__stdin, buffer);
+ if err == .ReadPending do return 0;
if err != .None do return -1;
return read;
}
#local stdin_vtable := io.Stream_Vtable.{
read = (_: ^io.Stream, buffer: [] u8) -> (io.Error, u32) {
bytes_read := runtime.__read_from_input(buffer);
- if bytes_read <= 0 do return .EOF, 0;
+ if bytes_read == 0 do return .ReadPending, 0;
+ if bytes_read < 0 do return .EOF, 0;
return .None, bytes_read;
},
else return 0;
#elif defined(_BH_LINUX)
+ if (file->fd == 0) {
+ isize res = read(file->fd, buffer, buff_size);
+ if (res < 0) return 0;
+ if (bytes_read) *bytes_read = res;
+ return 1;
+ }
+
isize res = pread(file->fd, buffer, buff_size, offset);
if (res < 0) return 0;
if (bytes_read) *bytes_read = res;
}
CheckStatus check_for(AstFor* fornode) {
+ b32 old_inside_for_iterator;
if (fornode->flags & Ast_Flag_Has_Been_Checked) goto fornode_expr_checked;
CHECK(expression, &fornode->iter);