#[macro_use]
extern crate externcfn_attr;
#[macro_export]
macro_rules! externcfn {
($(#[$meta:meta])* $v:vis fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block) => {
$(#[$meta])*
#[no_mangle]
$v extern "C" fn $name($($args)*) $(-> $ret)? $body
};
($(#[$meta:meta])* $v:vis unsafe fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block) => {
$(#[$meta])*
#[no_mangle]
$v unsafe extern "C" fn $name($($args)*) $(-> $ret)? $body
};
($(#[$meta:meta])* $v:vis const fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block) => {
$(#[$meta])*
#[no_mangle]
$v const extern "C" fn $name($($args)*) $(-> $ret)? $body
};
($(#[$meta:meta])* $v:vis const unsafe fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block) => {
$(#[$meta])*
#[no_mangle]
$v const unsafe extern "C" fn $name($($args)*) $(-> $ret)? $body
};
($($(#[$meta:meta])* $v:vis fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block)*) => {$(
externcfn! { $(#[$meta])* $v fn $name($($args)*) $(-> $ret)? $body }
)*};
($($(#[$meta:meta])* $v:vis unsafe fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block)*) => {$(
externcfn! { $(#[$meta])* $v unsafe fn $name($($args)*) $(-> $ret)? $body }
)*};
($($(#[$meta:meta])* $v:vis const fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block)*) => {$(
externcfn! { $(#[$meta])* $v const fn $name($($args)*) $(-> $ret)? $body }
)*};
($($(#[$meta:meta])* $v:vis const unsafe fn $name:ident($($args:tt)*) $(-> $ret:ty)? $body:block)*) => {$(
externcfn! { $(#[$meta])* $v const unsafe fn $name($($args)*) $(-> $ret)? $body }
)*};
}
pub use externcfn_attr::externcfnattr;