3 unstable releases
0.2.0 | Apr 6, 2021 |
---|---|
0.1.2 | Apr 6, 2021 |
0.1.1 | Mar 11, 2021 |
#267 in FFI
9KB
99 lines
Variyak
This crate provides a macro call_variadic
which can be used to construct boilerplate code
to call variadic functions using data from a container such as a Vec.
Example:
#![feature(c_variadic)]
use variyak::call_variadic;
fn main() {
let data = vec![1, 2];
let arg = 0;
mod test {
#[no_mangle]
pub unsafe extern "C" fn my_func(_fixed: u32, mut _args: ...) -> bool {
true
}
}
unsafe {
assert!(call_variadic!(
test::my_func(arg, ...) // function to call, `...` is the variadic arguments
data, // container identifier
n, // index identifier
data[n], // argument expression: get `argument` at index `n`
2, // maximum number of arguments to expand
));
}
unsafe {
use test::my_func;
assert!(call_variadic!(my_func(arg, ...), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, ...), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, arg, ..., arg), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, ..., arg), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, 42 + 27, ..., arg, 10usize), data, n, data[n], 2));
};
}