rcore-tutorial/os/src/fs/stdio.rs
2020-12-13 15:07:19 +08:00

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