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 lazy_static::lazy_static;
use libc::{c_char, c_int, FILE};

extern "C" {

    #[allow(dead_code)]
    pub fn printf(__restrict__fmt: *const c_char, ...) -> c_int;

    #[allow(dead_code)]
    pub fn setlocale(__category: c_int, __locale: *const c_char) -> c_char;

    #[allow(dead_code)]
    pub fn fflush(__stream: *mut FILE) -> c_int;

    #[allow(dead_code)]
    pub static stdout: *mut libc::FILE;
}

const LC_ALL: c_int = 6;

#[macro_export]
macro_rules! cstr {
    ($arg:expr) => {{
        let st = concat!($arg, "\0");
        let (ptr, _): (*const libc::c_char, usize) = core::mem::transmute(st);
        ptr
    }};
}

lazy_static! {
    pub static ref enable_utf8: () = {
        unsafe {
            setlocale(LC_ALL, cstr!("en_US.utf8"));
        }
    };
}

#[macro_export]
macro_rules! printf {
	($st:expr, $($args:expr),*) => (unsafe {
        let _ = *enable_utf8;
		printf(cstr!($st), $($args),*);
        fflush(stdout);
	})
}