#[macro_export]
macro_rules! windows_raw {
(unsafe $raw_args:expr) => {
#[cfg(windows)]
const _:() = {
enum ns {}
impl ns {
const raw_args: &'static [u8] = $raw_args.as_bytes();
const args: [u8; ns::raw_args.len()+1] = {
let mut bytes = [0; ns::raw_args.len() + 1];
let mut index = 0;
while index < ns::raw_args.len() {
bytes[index] = ns::raw_args[index];
index += 1;
}
bytes[index] = b' ';
bytes
};
}
$crate::impl_msvc_bytes!(
ns::args.len(),
ns::args
);
};
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! impl_msvc_bytes {
($size:expr, $bytes:expr) => {
const _: () = {
#[cfg(all(windows, target_env = "msvc"))]
#[link_section = ".drectve"]
#[used]
static DIRECTIVE: [u8; $size] = $bytes;
};
};
}
#[macro_export]
macro_rules! windows_msvc_stack_size {
($reserve:expr) => {
const _: () = {
$crate::impl_msvc_bytes!(
$crate::windows::msvc::ArgSize::STACK_SIZE,
$crate::windows::msvc::LinkArgs::new().stack_size($reserve).into_array()
);
};
};
($reserve:expr, $commit:expr) => {
const _: () = {
$crate::impl_msvc_bytes!(
$crate::windows::msvc::ArgSize::STACK_SIZE_WITH_COMMIT,
$crate::windows::msvc::LinkArgs::new().stack_size_with_commit($reserve, $commit).into_array()
);
};
};
}
#[macro_export]
macro_rules! windows_msvc_default_lib {
($($lib:expr),+) => {
$crate::impl_msvc_bytes!(
$crate::impl_msvc_arg_size!(default_lib($($lib),+)),
$crate::impl_msvc_args!($crate::windows::msvc::LinkArgs::new(), default_lib($($lib),+)).into_array()
);
};
}
#[macro_export]
macro_rules! windows {
(unsafe {
$($tt:tt(
$($expr:expr),*
$(,)?
));+;
}) => {
#[cfg(target_env="msvc")]
const _: () = {
use $crate::{impl_msvc_arg_size, impl_msvc_args, impl_msvc_bytes, windows::msvc::LinkArgs};
enum ns {}
impl ns {
const SIZE: usize = 0$(+ impl_msvc_arg_size!($tt($($expr),*)))+;
#[allow(unused_unsafe)]
const BUFFER: LinkArgs::<{ns::SIZE}> = unsafe {
let mut buf = LinkArgs::new();
$(
buf = impl_msvc_args!(buf, $tt($($expr),*));
)+
buf
};
}
impl_msvc_bytes!(ns::SIZE, ns::BUFFER.into_array());
};
};
($($tt:tt(
$($expr:expr),*
$(,)?
));+;) => {
#[cfg(target_env="msvc")]
const _: () = {
use $crate::{impl_msvc_arg_size, impl_msvc_args, impl_msvc_bytes, windows::msvc::LinkArgs};
enum ns {}
impl ns {
const SIZE: usize = 0$(+ impl_msvc_arg_size!($tt($($expr),*)))+;
const BUFFER: LinkArgs::<{ns::SIZE}> = {
let mut buf = LinkArgs::new();
$(
buf = impl_msvc_args!(buf, $tt($($expr),*));
)+
buf
};
}
impl_msvc_bytes!(ns::SIZE, ns::BUFFER.into_array());
};
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! impl_msvc_args {
($args:expr, stack_size($reserve:expr)) => {
$args.stack_size($reserve)
};
($args:expr, stack_size($reserve:expr, $commit:expr)) => {
$args.stack_size_with_commit($reserve, $commit)
};
($args:expr, default_lib($($lib:expr),+)) => {
$args
$(
.default_lib($lib)
)+
};
($args:expr, no_default_lib($($lib:expr),+)) => {
$args
$(
.no_default_lib($lib)
)+
};
($args:expr, disable_all_default_libs()) => {
$args.disable_all_default_libs()
};
($args:expr, raw($raw:expr)) => {
$args.raw($raw)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! impl_msvc_arg_size {
(stack_size($reserve:expr)) => {
$crate::windows::msvc::ArgSize::STACK_SIZE
};
(stack_size($reserve:expr, $commit:expr)) => {
$crate::windows::msvc::ArgSize::STACK_SIZE_WITH_COMMIT
};
(default_lib($($lib:expr),+)) => {
0$(
+$crate::windows::msvc::ArgSize::default_lib($lib)
)+
};
(no_default_lib($($lib:expr),+)) => {
0$(
+$crate::windows::msvc::ArgSize::no_default_lib($lib)
)+
};
(disable_all_default_libs()) => {
$crate::windows::msvc::ArgSize::DISABLE_ALL_DEFAULT_LIBS
};
(raw($lib:expr)) => {
$lib.len() + 1
};
}