| # libffi-rs: Rust bindings for [libffi](https://sourceware.org/libffi/) |
| |
| [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/tov/libffi-rs/Build%20&%20Test)](https://github.com/tov/libffi-rs/actions) |
| [![Documentation](https://img.shields.io/docsrs/libffi/latest)](https://docs.rs/libffi/latest/libffi/) |
| [![Crates.io](https://img.shields.io/crates/v/libffi.svg?maxAge=2592000)](https://crates.io/crates/libffi) |
| [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE-MIT) |
| [![License: Apache 2.0](https://img.shields.io/badge/license-Apache_2.0-blue.svg)](LICENSE-APACHE) |
| |
| The C libffi library provides two main facilities: assembling calls |
| to functions dynamically, and creating closures that can be called |
| as ordinary C functions. In Rust, the latter means that we can turn |
| a Rust lambda (or any object implementing `Fn`/`FnMut`) into an |
| ordinary C function pointer that we can pass as a callback to C. |
| |
| ## Usage |
| |
| Building `libffi` will build `lifbffi-sys`, which will in turn build the |
| libffi C library [from github](https://github.com/libffi/libffi), which |
| requires that you have a working make, C compiler, automake, and |
| autoconf first. It’s [on crates.io](https://crates.io/crates/libffi), so |
| you can add |
| |
| ```toml |
| [dependencies] |
| libffi = "3.2.0" |
| ``` |
| |
| to your `Cargo.toml`. |
| |
| This crate depends on [the `libffi-sys` crate], which by default |
| attempts to build its own version of the C libffi library. In order to |
| use your system’s C libffi instead, enable this crate’s `system` |
| feature in your `Cargo.toml`: |
| |
| ```toml |
| [features] |
| libffi = { version = "3.2.0", features = ["system"] } |
| ``` |
| |
| See [the `libffi-sys` documentation] for more information about how it |
| finds C libffi. |
| |
| This crate supports Rust version 1.48 and later. |
| |
| ### Examples |
| |
| In this example, we convert a Rust lambda containing a free variable |
| into an ordinary C code pointer. The type of `fun` below is |
| `extern "C" fn(u64, u64) -> u64`. |
| |
| ```rust |
| use libffi::high::Closure2; |
| |
| let x = 5u64; |
| let f = |y: u64, z: u64| x + y + z; |
| |
| let closure = Closure2::new(&f); |
| let fun = closure.code_ptr(); |
| |
| assert_eq!(18, fun(6, 7)); |
| ``` |
| |
| [the `libffi-sys` crate]: https://crates.io/crates/libffi-sys/ |
| [the `libffi-sys` documentation]: https://docs.rs/libffi-sys/#usage |