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 $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}