rust_libretro/
macros.rs

1#[macro_export]
2macro_rules! c_char_ptr {
3    ( $($arg:tt)* ) => {
4        concat!($($arg)*, '\0').as_ptr() as *const libc::c_char
5    };
6}
7
8#[macro_export]
9macro_rules! c_str {
10    ( $($arg:tt)* ) => {
11        unsafe { std::ffi::CStr::from_ptr(c_char_ptr!($($arg)*)) }
12    };
13}
14
15#[macro_export]
16macro_rules! input_descriptor {
17    ( $port:expr, $device:expr, $index:expr, $id:expr, $description:literal $(,)? ) => {
18        retro_input_descriptor {
19            port: $port,
20            device: $device,
21            index: $index,
22            id: $id,
23            description: $crate::c_char_ptr!($description),
24        }
25    };
26}
27
28#[macro_export]
29macro_rules! input_descriptors {
30    ( $({ $port:expr, $device:expr, $index:expr, $id:expr, $description:literal $(,)? }),* $(,)? ) => { [
31        $(
32            $crate::input_descriptor!($port, $device, $index, $id, $description),
33        )*
34        // End of list
35        $crate::input_descriptor!(0, 0, 0, 0, "")
36    ] }
37}
38
39#[macro_export]
40macro_rules! env_version {
41    ( $variable:literal ) => {{
42        let parts: [&str; 3] = $crate::const_str::split!(env!($variable), ".");
43        let major = $crate::const_str::parse!(parts[0], u16);
44        let minor = $crate::const_str::parse!(parts[1], u16);
45        let patch = $crate::const_str::parse!(parts[2], u16);
46        $crate::util::Version::new(major, minor, patch)
47    }};
48}