NLinker icon

scanf interop

NLinker | PRO | 07/03/18 03:29:02 PM UTC | 0 ⭐ | 881 👁️ | Never ⏰ | []
Rust |

1.96 KB

|

None

|

0 👍

/

0 👎

const STDIN_FILENO: i32 = 0;
const STDOUT_FILENO: i32 = 1;
 
enum FILE {}
 
extern {
    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
    link_name = "fputs$UNIX2003")]
    fn fputs(s: *const u8, stream: *mut FILE)-> i32;
    fn fgets(buf: *mut u8, n: i32, stream: *mut FILE) -> *mut u8;
    fn fdopen(fd: i32, mode: *const u8) -> *mut FILE;
}
 
fn main() {
    let mut chars: [u8; 15] = unsafe { std::mem::zeroed() };
 
    unsafe {
        let input = fdopen(STDIN_FILENO, "r\0".as_ptr());
        if fgets(chars.as_mut_ptr(), chars.len() as i32, input) == std::ptr::null_mut() {
            panic!();
        }
 
        let mut n: u32 = 0;
 
        for &c in chars.iter() {
            if c == b'\n' {
                break;
            }
            n = n * 10 + (c - b'0') as u32;
        }
 
        let mut tuples = std::iter::repeat(String::new())
            .take(101)
            .collect::<Vec<_>>();
 
        for _ in 0..n {
            chars = std::mem::zeroed();
            if fgets(chars.as_mut_ptr(), chars.len() as i32, input) == std::ptr::null_mut() {
                panic!();
            }
 
            let mut j = chars.len() - 1;
 
            while !chars[j].is_ascii_digit() {
                j -= 1;
            }
 
            let chars_count = j + 2; // 123\n
 
            let mut m = 0u8;
            let mut multiplier = 1;
 
            while chars[j] != b' ' {
                let digit = chars[j] - b'0';
                m += digit  * multiplier;
                if j == 0 || multiplier == 100{
                    break;
                }
                j -= 1;
                multiplier *= 10;
            }
 
            tuples[100 - m as usize].push_str(std::str::from_utf8_unchecked(&chars[0..chars_count]));
        }
 
        let output = fdopen(STDOUT_FILENO, "w\0".as_ptr());
        for g in &mut tuples {
            g.push('\0');
            fputs(g.as_ptr(), output);
        }
    };
}

Comments