46 lines
No EOL
1.2 KiB
Rust
46 lines
No EOL
1.2 KiB
Rust
use super::File;
|
|
use crate::mm::{UserBuffer, UserBufferIterator};
|
|
use crate::sbi::console_getchar;
|
|
use crate::task::suspend_current_and_run_next;
|
|
use core::any::Any;
|
|
|
|
pub struct Stdin;
|
|
|
|
pub struct Stdout;
|
|
|
|
impl File for Stdin {
|
|
fn read(&self, mut user_buf: UserBuffer) -> usize {
|
|
assert_eq!(user_buf.len(), 1);
|
|
// busy loop
|
|
let mut c: usize;
|
|
loop {
|
|
c = console_getchar();
|
|
if c == 0 {
|
|
suspend_current_and_run_next();
|
|
continue;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
let ch = c as u8;
|
|
unsafe { user_buf.buffers[0].as_mut_ptr().write_volatile(ch); }
|
|
1
|
|
}
|
|
fn write(&self, _user_buf: UserBuffer) -> usize {
|
|
panic!("Cannot write to stdin!");
|
|
}
|
|
fn as_any_ref(&self) -> &dyn Any { self }
|
|
}
|
|
|
|
impl File for Stdout {
|
|
fn read(&self, _user_buf: UserBuffer) -> usize{
|
|
panic!("Cannot read from stdout!");
|
|
}
|
|
fn write(&self, user_buf: UserBuffer) -> usize {
|
|
for buffer in user_buf.buffers.iter() {
|
|
print!("{}", core::str::from_utf8(*buffer).unwrap());
|
|
}
|
|
user_buf.len()
|
|
}
|
|
fn as_any_ref(&self) -> &dyn Any { self }
|
|
} |