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

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::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()
}

View File

@ -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(),