使用宏来改写一些常用的数据转换

This commit is contained in:
cebgcontract 2022-10-23 08:58:24 +08:00
parent 4b872279df
commit 33956e5489
2 changed files with 67 additions and 55 deletions

View File

@ -7,7 +7,28 @@
use std::ffi::CStr; use std::ffi::CStr;
use std::os::raw::c_char; use std::os::raw::c_char;
//use rustylib::gen::{CWallet}; //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() { fn main() {
unsafe { unsafe {
@ -17,11 +38,11 @@ fn main() {
println!("---- generated a wallet to be used on C-side ----"); println!("---- generated a wallet to be used on C-side ----");
print_wallet(&wallet); print_wallet(&wallet);
let address = get_address(wallet); let address = get_address(wallet);
let address_str = cchar_str(address); let address_str = cchar_to_str!(address);
println!("address: {}", address_str); println!("address: {}", address_str);
let key0 = "b8256097c1ff2bdd483ffb53d35203a8a7ff19547d65d97f2810732a27e80c1f"; let key0 = "3da2dfc54de71230f639f37de61d8f8c4699f75e783dc54353146a4b73250366";
let key1 = "8e25c8b2e2c8504ea3d6d37cc268facec17ae60667048cfeb7a0092cfda8323a"; let key1 = "a1a3ed90e41a37096f07957b9888ffa7a74406f3a3e8c77686d92f2ba7c22d58";
let key2 = "642630ce039174bfff6daba5b17ff1f4daf6b2b850a3407e472f9f2fd3685855"; let key2 = "27216cbe70021d5d1d018da5ab548b8b45dee4fd9ec0b33ab1dd264cf2ff249f";
// println!("---- saving the wallet to wallet.json ----"); // println!("---- saving the wallet to wallet.json ----");
// save_wallet(&wallet); // save_wallet(&wallet);
@ -41,24 +62,16 @@ fn main() {
} }
unsafe fn print_wallet(cwallet: &CWallet) { unsafe fn print_wallet(cwallet: &CWallet) {
let msg = CStr::from_ptr(cwallet.msg_key); let pmsg = cchar_to_str!(cwallet.msg_key);
let pmsg = msg.to_str().unwrap();
println!("msg=> {}", pmsg); println!("msg=> {}", pmsg);
print_cchar!("msg=> ", cwallet.msg_key);
let m = CStr::from_ptr(cwallet.master_key); let pm = cchar_to_str!(cwallet.master_key);
let pm = m.to_str().unwrap();
println!("master key=> {}", pm); println!("master key=> {}", pm);
let s = CStr::from_ptr(cwallet.second_key); let ps = cchar_to_str!(cwallet.second_key);
let ps = s.to_str().unwrap();
println!("second key=> {}", ps); println!("second key=> {}", ps);
let b = CStr::from_ptr(cwallet.backup_key); let pb = cchar_to_str!(cwallet.backup_key);
let pb = b.to_str().unwrap();
println!("backup key=> {}", pb); println!("backup key=> {}", pb);
} }
unsafe fn cchar_str(cstr: *mut c_char) -> &'static str {
let msg = CStr::from_ptr(cstr);
msg.to_str().unwrap()
}

View File

@ -16,6 +16,30 @@ use crate::wallet::*;
// #[cfg(target_os = "android")] // #[cfg(target_os = "android")]
// mod 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)] #[repr(C)]
pub struct CWallet { pub struct CWallet {
@ -28,18 +52,16 @@ pub struct CWallet {
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet { pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet {
println!("generating wallet"); println!("generating wallet");
let c_str = CStr::from_ptr(msg); let str = cchar_to_str!(msg);
let str = c_str.to_str().unwrap();
let rust_wallet = wallet_impl::Wallet::new(str); let rust_wallet = wallet_impl::Wallet::new(str);
println!("rust_wallet: {:?}", &rust_wallet); println!("rust_wallet: {:?}", &rust_wallet);
convert_to_cwallet(rust_wallet) convert_to_cwallet(rust_wallet)
} }
#[no_mangle] #[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"); println!("generating wallet");
let c_str = CStr::from_ptr(msg); let str = cchar_to_str!(msg);
let str = c_str.to_str().unwrap();
let rust_wallet = wallet_impl::Wallet::new(str); let rust_wallet = wallet_impl::Wallet::new(str);
println!("rust_wallet: {:?}", &rust_wallet); println!("rust_wallet: {:?}", &rust_wallet);
convert_to_cwallet(rust_wallet) convert_to_cwallet(rust_wallet)
@ -56,9 +78,10 @@ pub unsafe extern "C" fn free_cwallet(cw: CWallet) {
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn get_address(cw: CWallet) -> *mut c_char{ pub unsafe extern "C" fn get_address(cw: CWallet) -> *mut c_char{
let rwallet = convert_to_rwallet(&cw); let rwallet = convert_to_rwallet(&cw);
println!("rwallet: {:?}", rwallet);
let address = rwallet.get_address(); let address = rwallet.get_address();
println!("raw address: {}", address.to_string()); let address_str = format!("{:?}", address);
let c_address = CString::new(address.to_string()).unwrap(); let c_address = CString::new(address_str).unwrap();
c_address.into_raw() 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 c_msgkey: *mut c_char = msgkey.into_raw();
let masterkey = CString::new(rwallet.master_key).unwrap(); let masterkey = CString::new(rwallet.master_key).unwrap();
let c_masterkey: *mut c_char = masterkey.into_raw(); let c_masterkey: *mut c_char = masterkey.into_raw();
let secondkey = match rwallet.second_key { let c_secondkey = ostr_to_cchar!(rwallet.second_key);
Some(val) => { let c_backupkey = ostr_to_cchar!(rwallet.backup_key);
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 cw = CWallet { let cw = CWallet {
msg_key: c_msgkey, msg_key: c_msgkey,
@ -91,24 +100,14 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
second_key: c_secondkey, second_key: c_secondkey,
backup_key: c_backupkey, backup_key: c_backupkey,
}; };
//println!("crypto_wallet addr: {}", CStr::from_ptr(cw.public_addr).to_str().unwrap());
cw cw
} }
unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet { unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet {
let msg = CStr::from_ptr(cwallet.msg_key); let pmsg = cchar_to_str!(cwallet.msg_key);
let pmsg = msg.to_str().unwrap(); let pm = cchar_to_str!(cwallet.master_key);
let ps = cchar_to_str!(cwallet.second_key);
let m = CStr::from_ptr(cwallet.master_key); let pb = cchar_to_str!(cwallet.backup_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();
Wallet { Wallet {
msg_key: pmsg.to_string(), msg_key: pmsg.to_string(),
master_key: pm.to_string(), master_key: pm.to_string(),