macro_rules! libc_bitflags {
(@call_bitflags
{
name: $BitFlags:ident,
type: $T:ty,
attrs: [$($attrs:tt)*],
flags: [$($flags:tt)*],
}
) => {
bitflags! {
$($attrs)*
flags $BitFlags: $T {
$($flags)*
}
}
};
(@call_bitflags
{
pub,
name: $BitFlags:ident,
type: $T:ty,
attrs: [$($attrs:tt)*],
flags: [$($flags:tt)*],
}
) => {
bitflags! {
$($attrs)*
pub flags $BitFlags: $T {
$($flags)*
}
}
};
(@accumulate_flags
{
name: $BitFlags:ident,
type: $T:ty,
attrs: $attrs:tt,
},
$flags:tt;
) => {
libc_bitflags! {
@call_bitflags
{
name: $BitFlags,
type: $T,
attrs: $attrs,
flags: $flags,
}
}
};
(@accumulate_flags
{
pub,
name: $BitFlags:ident,
type: $T:ty,
attrs: $attrs:tt,
},
$flags:tt;
) => {
libc_bitflags! {
@call_bitflags
{
pub,
name: $BitFlags,
type: $T,
attrs: $attrs,
flags: $flags,
}
}
};
(@accumulate_flags
$prefix:tt,
[$($flags:tt)*];
#[$attr:meta] $($tail:tt)*
) => {
libc_bitflags! {
@accumulate_flags
$prefix,
[
$($flags)*
#[$attr]
];
$($tail)*
}
};
(@accumulate_flags
$prefix:tt,
[$($flags:tt)*];
$flag:ident
) => {
libc_bitflags! {
@accumulate_flags
$prefix,
[
$($flags)*
const $flag = libc::$flag,
];
}
};
(@accumulate_flags
$prefix:tt,
[$($flags:tt)*];
$flag:ident, $($tail:tt)*
) => {
libc_bitflags! {
@accumulate_flags
$prefix,
[
$($flags)*
const $flag = libc::$flag,
];
$($tail)*
}
};
(
$(#[$attr:meta])*
flags $BitFlags:ident: $T:ty {
$($vals:tt)*
}
) => {
libc_bitflags! {
@accumulate_flags
{
name: $BitFlags,
type: $T,
attrs: [$(#[$attr])*],
},
[];
$($vals)*
}
};
(
$(#[$attr:meta])*
pub flags $BitFlags:ident: $T:ty {
$($vals:tt)*
}
) => {
libc_bitflags! {
@accumulate_flags
{
pub,
name: $BitFlags,
type: $T,
attrs: [$(#[$attr])*],
},
[];
$($vals)*
}
};
}