1use std::io;
2
3pub fn fgetc(f: &mut dyn io::Read) -> io::Result<i32> {
9 let mut buffer = [0; 1];
10 match f.read(&mut buffer) {
11 Ok(0) => Ok(-1),
12 Ok(_) => Ok(buffer[0] as i32),
13 Err(e) => Err(e),
14 }
15}
16
17#[test]
18fn test_fgetc() {
19 use std::io::Cursor;
20
21 let data = "AB".as_bytes();
22 let mut cursor = Cursor::new(data);
23 assert_eq!(fgetc(&mut cursor).unwrap(), 'A' as i32);
24 assert_eq!(fgetc(&mut cursor).unwrap(), 'B' as i32);
25 assert_eq!(fgetc(&mut cursor).unwrap(), -1);
26}
27
28pub fn feof(f: &mut dyn io::BufRead) -> io::Result<i32> {
39 f.fill_buf().map(|b| if b.is_empty() { 1 } else { 0 })
40}
41
42#[test]
43fn test_feof() {
44 use std::io::Cursor;
45
46 let data = "AB".as_bytes();
47 let mut cursor = Cursor::new(data);
48 assert_eq!(feof(&mut cursor).unwrap(), 0);
49 let _ = fgetc(&mut cursor).unwrap();
50 assert_eq!(feof(&mut cursor).unwrap(), 0);
51 let _ = fgetc(&mut cursor).unwrap();
52 assert_ne!(feof(&mut cursor).unwrap(), 0);
53 let eof = fgetc(&mut cursor).unwrap();
54 assert_eq!(eof, -1);
55}