diff --git a/examples/test.rs b/examples/test.rs index e67b32c..a453890 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -7,7 +7,28 @@ use std::ffi::CStr; use std::os::raw::c_char; //use rustylib::gen::{CWallet}; -use rustwallet::{new_wallet, get_address, free_cwallet, CWallet}; +use rustwallet::{new_wallet, get_address, restore_wallet, free_cwallet, CWallet}; + +macro_rules! print_cchar{ + ($p1:expr, $p2:expr) => ( + let s = CStr::from_ptr($p2); + let ps = s.to_str().unwrap(); + println!(">>>>>>>>>>>>>>macro_rules print_cchar"); + println!("{:?} {:?}", + $p1, + ps) + ) +} + +macro_rules! cchar_to_str{ + ($p1:expr) => { + { + let s = CStr::from_ptr($p1); + let ps = s.to_str().unwrap(); + ps + } + } +} fn main() { unsafe { @@ -17,11 +38,11 @@ fn main() { println!("---- generated a wallet to be used on C-side ----"); print_wallet(&wallet); let address = get_address(wallet); - let address_str = cchar_str(address); + let address_str = cchar_to_str!(address); println!("address: {}", address_str); - let key0 = "b8256097c1ff2bdd483ffb53d35203a8a7ff19547d65d97f2810732a27e80c1f"; - let key1 = "8e25c8b2e2c8504ea3d6d37cc268facec17ae60667048cfeb7a0092cfda8323a"; - let key2 = "642630ce039174bfff6daba5b17ff1f4daf6b2b850a3407e472f9f2fd3685855"; + let key0 = "3da2dfc54de71230f639f37de61d8f8c4699f75e783dc54353146a4b73250366"; + let key1 = "a1a3ed90e41a37096f07957b9888ffa7a74406f3a3e8c77686d92f2ba7c22d58"; + let key2 = "27216cbe70021d5d1d018da5ab548b8b45dee4fd9ec0b33ab1dd264cf2ff249f"; // println!("---- saving the wallet to wallet.json ----"); // save_wallet(&wallet); @@ -41,24 +62,16 @@ fn main() { } unsafe fn print_wallet(cwallet: &CWallet) { - let msg = CStr::from_ptr(cwallet.msg_key); - let pmsg = msg.to_str().unwrap(); + let pmsg = cchar_to_str!(cwallet.msg_key); println!("msg=> {}", pmsg); + print_cchar!("msg=> ", cwallet.msg_key); - let m = CStr::from_ptr(cwallet.master_key); - let pm = m.to_str().unwrap(); + let pm = cchar_to_str!(cwallet.master_key); println!("master key=> {}", pm); - let s = CStr::from_ptr(cwallet.second_key); - let ps = s.to_str().unwrap(); + let ps = cchar_to_str!(cwallet.second_key); println!("second key=> {}", ps); - let b = CStr::from_ptr(cwallet.backup_key); - let pb = b.to_str().unwrap(); + let pb = cchar_to_str!(cwallet.backup_key); println!("backup key=> {}", pb); } - -unsafe fn cchar_str(cstr: *mut c_char) -> &'static str { - let msg = CStr::from_ptr(cstr); - msg.to_str().unwrap() -} diff --git a/src/lib.rs b/src/lib.rs index d8bff02..ff80429 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,30 @@ use crate::wallet::*; // #[cfg(target_os = "android")] // mod android; +macro_rules! cchar_to_str{ + ($p1:expr) => { + { + let s = CStr::from_ptr($p1); + let ps = s.to_str().unwrap(); + ps + } + } +} + +macro_rules! ostr_to_cchar{ + ($p1:expr) => { + { + let key = match $p1 { + Some(val) => { + CString::new(val).unwrap() + }, + None => CString::new("").unwrap() + }; + let c_key: *mut c_char = key.into_raw(); + c_key + } + } +} #[repr(C)] pub struct CWallet { @@ -28,18 +52,16 @@ pub struct CWallet { #[no_mangle] pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet { println!("generating wallet"); - let c_str = CStr::from_ptr(msg); - let str = c_str.to_str().unwrap(); + let str = cchar_to_str!(msg); let rust_wallet = wallet_impl::Wallet::new(str); println!("rust_wallet: {:?}", &rust_wallet); convert_to_cwallet(rust_wallet) } #[no_mangle] -pub unsafe extern "C" fn restore_cwallet(msg: *const c_char) -> CWallet { +pub unsafe extern "C" fn restore_wallet(msg: *const c_char) -> CWallet { println!("generating wallet"); - let c_str = CStr::from_ptr(msg); - let str = c_str.to_str().unwrap(); + let str = cchar_to_str!(msg); let rust_wallet = wallet_impl::Wallet::new(str); println!("rust_wallet: {:?}", &rust_wallet); convert_to_cwallet(rust_wallet) @@ -56,9 +78,10 @@ pub unsafe extern "C" fn free_cwallet(cw: CWallet) { #[no_mangle] pub unsafe extern "C" fn get_address(cw: CWallet) -> *mut c_char{ let rwallet = convert_to_rwallet(&cw); + println!("rwallet: {:?}", rwallet); let address = rwallet.get_address(); - println!("raw address: {}", address.to_string()); - let c_address = CString::new(address.to_string()).unwrap(); + let address_str = format!("{:?}", address); + let c_address = CString::new(address_str).unwrap(); c_address.into_raw() } @@ -68,22 +91,8 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { let c_msgkey: *mut c_char = msgkey.into_raw(); let masterkey = CString::new(rwallet.master_key).unwrap(); let c_masterkey: *mut c_char = masterkey.into_raw(); - let secondkey = match rwallet.second_key { - Some(val) => { - CString::new(val).unwrap() - }, - None => CString::new("").unwrap() - }; - let c_secondkey: *mut c_char = secondkey.into_raw(); - let backupkey = match rwallet.backup_key { - Some(val) => { - CString::new(val).unwrap() - }, - None => CString::new("").unwrap() - }; - let c_backupkey: *mut c_char = backupkey.into_raw(); - - //println!("crypto wallet address: {}", CStr::from_ptr(c_pubaddr).to_str().unwrap()); + let c_secondkey = ostr_to_cchar!(rwallet.second_key); + let c_backupkey = ostr_to_cchar!(rwallet.backup_key); let cw = CWallet { msg_key: c_msgkey, @@ -91,24 +100,14 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { second_key: c_secondkey, backup_key: c_backupkey, }; - - //println!("crypto_wallet addr: {}", CStr::from_ptr(cw.public_addr).to_str().unwrap()); - cw } unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet { - let msg = CStr::from_ptr(cwallet.msg_key); - let pmsg = msg.to_str().unwrap(); - - let m = CStr::from_ptr(cwallet.master_key); - let pm = m.to_str().unwrap(); - - let s = CStr::from_ptr(cwallet.second_key); - let ps = s.to_str().unwrap(); - - let b = CStr::from_ptr(cwallet.backup_key); - let pb = b.to_str().unwrap(); + let pmsg = cchar_to_str!(cwallet.msg_key); + let pm = cchar_to_str!(cwallet.master_key); + let ps = cchar_to_str!(cwallet.second_key); + let pb = cchar_to_str!(cwallet.backup_key); Wallet { msg_key: pmsg.to_string(), master_key: pm.to_string(),