     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

    use super::File;
    use crate::drivers::chardev::{CharDevice, UART};
    use crate::mm::UserBuffer;

    pub struct Stdin;
    pub struct Stdout;

    impl File for Stdin {
        fn readable(&self) -> bool {
            true
        }
        fn writable(&self) -> bool {
            false
        }
        fn read(&self, mut user_buf: UserBuffer) -> usize {
            assert_eq!(user_buf.len(), 1);
            //println!("before UART.read() in Stdin::read()");
            let ch = UART.read();
            unsafe {
                user_buf.buffers[0].as_mut_ptr().write_volatile(ch);
            }
            1
        }
        fn write(&self, _user_buf: UserBuffer) -> usize {
            panic!("Cannot write to stdin!");
        }
    }

    impl File for Stdout {
        fn readable(&self) -> bool {
            false
        }
        fn writable(&self) -> bool {
            true
        }
        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()
        }
    }