First commit
This commit is contained in:
commit
26d11cdba9
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/target
|
||||||
|
*.h
|
||||||
|
/main
|
||||||
|
/Cargo.lock
|
16
Cargo.toml
Normal file
16
Cargo.toml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[package]
|
||||||
|
name = "bdk_ffi"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Steve Myers <steve@notmandatory.org>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
[lib]
|
||||||
|
crate-type = ["staticlib"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bdk = { version = "^0.7", feature = ["all-keys"] }
|
||||||
|
safer-ffi = { version = "*", features = ["proc_macros"]}
|
||||||
|
|
||||||
|
[features]
|
||||||
|
c-headers = ["safer-ffi/headers"]
|
13
main.c
Normal file
13
main.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "bdk_ffi.h"
|
||||||
|
|
||||||
|
int main (int argc, char const * const argv[])
|
||||||
|
{
|
||||||
|
Point_t * a = new_point(84,45);
|
||||||
|
Point_t * b = new_point(0.0,39.0);
|
||||||
|
Point_t * m = mid_point(a, b);
|
||||||
|
print_point(m);
|
||||||
|
print_point(NULL);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
47
src/lib.rs
Normal file
47
src/lib.rs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
use ::safer_ffi::prelude::*;
|
||||||
|
|
||||||
|
/// A `struct` usable from both Rust and C
|
||||||
|
#[derive_ReprC]
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub struct Point {
|
||||||
|
x: f64,
|
||||||
|
y: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Export a Rust function to the C world. */
|
||||||
|
/// Returns the middle point of `[a, b]`.
|
||||||
|
#[ffi_export]
|
||||||
|
fn mid_point(a: Option<repr_c::Box<Point>>, b: Option<repr_c::Box<Point>>) -> repr_c::Box<Point> {
|
||||||
|
let a = a.unwrap();
|
||||||
|
let b = b.unwrap();
|
||||||
|
repr_c::Box::new(Point {
|
||||||
|
x: (a.x + b.x) / 2.,
|
||||||
|
y: (a.y + b.y) / 2.,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Pretty-prints a point using Rust's formatting logic.
|
||||||
|
#[ffi_export]
|
||||||
|
fn print_point(point: Option<repr_c::Box<Point>>) {
|
||||||
|
println!("{:?}", point);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[ffi_export]
|
||||||
|
fn new_point(x: f64, y: f64) -> repr_c::Box<Point> {
|
||||||
|
repr_c::Box::new(Point { x, y })
|
||||||
|
}
|
||||||
|
|
||||||
|
#[ffi_export]
|
||||||
|
fn free_point(point: Option<repr_c::Box<Point>>) {
|
||||||
|
drop(point)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The following test function is necessary for the header generation.
|
||||||
|
#[::safer_ffi::cfg_headers]
|
||||||
|
#[test]
|
||||||
|
fn generate_headers() -> ::std::io::Result<()> {
|
||||||
|
::safer_ffi::headers::builder()
|
||||||
|
.to_file("bdk_ffi.h")?
|
||||||
|
.generate()
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user