summaryrefslogtreecommitdiff
path: root/src/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/macros.rs')
-rw-r--r--src/macros.rs211
1 files changed, 16 insertions, 195 deletions
diff --git a/src/macros.rs b/src/macros.rs
index 39bc466d..15f7505c 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -1,6 +1,6 @@
-/// The `libc_bitflags!` macro helps with a common use case of defining bitflags with values from
-/// the libc crate. It is used the same way as the `bitflags!` macro, except that only the name of
-/// the flag value has to be given.
+/// The `libc_bitflags!` macro helps with a common use case of defining a public bitflags type
+/// with values from the libc crate. It is used the same way as the `bitflags!` macro, except
+/// that only the name of the flag value has to be given.
///
/// The `libc` crate must be in scope with the name `libc`.
///
@@ -10,6 +10,7 @@
/// pub struct ProtFlags: libc::c_int {
/// PROT_NONE;
/// PROT_READ;
+/// /// PROT_WRITE enables write protect
/// PROT_WRITE;
/// PROT_EXEC;
/// #[cfg(any(target_os = "linux", target_os = "android"))]
@@ -38,205 +39,25 @@
/// }
/// ```
macro_rules! libc_bitflags {
- // (non-pub) Exit rule.
- (@call_bitflags
- {
- name: $BitFlags:ident,
- type: $T:ty,
- attrs: [$($attrs:tt)*],
- flags: [$($flags:tt)*],
- }
- ) => {
- bitflags! {
- $($attrs)*
- struct $BitFlags: $T {
- $($flags)*
- }
- }
- };
-
- // (pub) Exit rule.
- (@call_bitflags
- {
- pub,
- name: $BitFlags:ident,
- type: $T:ty,
- attrs: [$($attrs:tt)*],
- flags: [$($flags:tt)*],
+ (
+ $(#[$outer:meta])*
+ pub struct $BitFlags:ident: $T:ty {
+ $(
+ $(#[$inner:ident $($args:tt)*])*
+ $Flag:ident $(as $cast:ty)*;
+ )+
}
) => {
bitflags! {
- $($attrs)*
+ $(#[$outer])*
pub struct $BitFlags: $T {
- $($flags)*
- }
- }
- };
-
- // (non-pub) Done accumulating.
- (@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,
+ $(
+ $(#[$inner $($args)*])*
+ const $Flag = libc::$Flag $(as $cast)*;
+ )+
}
}
};
-
- // (pub) Done accumulating.
- (@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,
- }
- }
- };
-
- // Munch an attr.
- (@accumulate_flags
- $prefix:tt,
- [$($flags:tt)*];
- #[$attr:meta] $($tail:tt)*
- ) => {
- libc_bitflags! {
- @accumulate_flags
- $prefix,
- [
- $($flags)*
- #[$attr]
- ];
- $($tail)*
- }
- };
-
- // Munch last ident if not followed by a semicolon.
- (@accumulate_flags
- $prefix:tt,
- [$($flags:tt)*];
- $flag:ident
- ) => {
- libc_bitflags! {
- @accumulate_flags
- $prefix,
- [
- $($flags)*
- const $flag = libc::$flag;
- ];
- }
- };
-
- // Munch last ident and cast it to the given type.
- (@accumulate_flags
- $prefix:tt,
- [$($flags:tt)*];
- $flag:ident as $ty:ty
- ) => {
- libc_bitflags! {
- @accumulate_flags
- $prefix,
- [
- $($flags)*
- const $flag = libc::$flag as $ty;
- ];
- }
- };
-
- // Munch an ident; covers terminating semicolon case.
- (@accumulate_flags
- $prefix:tt,
- [$($flags:tt)*];
- $flag:ident; $($tail:tt)*
- ) => {
- libc_bitflags! {
- @accumulate_flags
- $prefix,
- [
- $($flags)*
- const $flag = libc::$flag;
- ];
- $($tail)*
- }
- };
-
- // Munch an ident and cast it to the given type; covers terminating semicolon
- // case.
- (@accumulate_flags
- $prefix:tt,
- [$($flags:tt)*];
- $flag:ident as $ty:ty; $($tail:tt)*
- ) => {
- libc_bitflags! {
- @accumulate_flags
- $prefix,
- [
- $($flags)*
- const $flag = libc::$flag as $ty;
- ];
- $($tail)*
- }
- };
-
- // (non-pub) Entry rule.
- (
- $(#[$attr:meta])*
- struct $BitFlags:ident: $T:ty {
- $($vals:tt)*
- }
- ) => {
- libc_bitflags! {
- @accumulate_flags
- {
- name: $BitFlags,
- type: $T,
- attrs: [$(#[$attr])*],
- },
- [];
- $($vals)*
- }
- };
-
- // (pub) Entry rule.
- (
- $(#[$attr:meta])*
- pub struct $BitFlags:ident: $T:ty {
- $($vals:tt)*
- }
- ) => {
- libc_bitflags! {
- @accumulate_flags
- {
- pub,
- name: $BitFlags,
- type: $T,
- attrs: [$(#[$attr])*],
- },
- [];
- $($vals)*
- }
- };
}
/// The `libc_enum!` macro helps with a common use case of defining an enum exclusively using