First commit

This commit is contained in:
Steve Myers 2021-06-03 17:51:07 -07:00
commit 26d11cdba9
4 changed files with 80 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/target
*.h
/main
/Cargo.lock

16
Cargo.toml Normal file
View 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
View 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
View 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()
}