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