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