diff options
| author | Mason Reed <mason@vector35.com> | 2025-05-04 19:47:55 -0400 |
|---|---|---|
| committer | Mason Reed <35282038+emesare@users.noreply.github.com> | 2025-05-12 17:45:24 -0400 |
| commit | 788a8b7091bbdde77817030e0836d7a7a786fd99 (patch) | |
| tree | 40e8f8d3c870788259a5acb5d14995cdc1656979 /rust/src/interaction.rs | |
| parent | a826c589dfc10c542deba7ca3343a462e02d6bde (diff) | |
[Rust] Simplify usage surrounding c strings
`cstring.as_ref().as_ptr() as *const c_char` -> `cstring.as_ptr()`
`cstring.as_ref().as_ptr() as *mut _` -> `cstring.as_ptr()`
`cstring.as_ptr() as *const c_char` -> `cstring.as_ptr()`
With a few fixes for cstrings that might be dropped prematurely.
Diffstat (limited to 'rust/src/interaction.rs')
| -rw-r--r-- | rust/src/interaction.rs | 127 |
1 files changed, 53 insertions, 74 deletions
diff --git a/rust/src/interaction.rs b/rust/src/interaction.rs index 7e007eb9..9994608f 100644 --- a/rust/src/interaction.rs +++ b/rust/src/interaction.rs @@ -23,16 +23,16 @@ use crate::binary_view::BinaryView; use crate::rc::Ref; use crate::string::{AsCStr, BnString}; +pub type MessageBoxButtonSet = BNMessageBoxButtonSet; +pub type MessageBoxIcon = BNMessageBoxIcon; +pub type MessageBoxButtonResult = BNMessageBoxButtonResult; + pub fn get_text_line_input(prompt: &str, title: &str) -> Option<String> { let mut value: *mut c_char = std::ptr::null_mut(); - let result = unsafe { - BNGetTextLineInput( - &mut value, - prompt.to_cstr().as_ptr() as *mut _, - title.to_cstr().as_ptr() as *mut _, - ) - }; + let prompt = prompt.to_cstr(); + let title = title.to_cstr(); + let result = unsafe { BNGetTextLineInput(&mut value, prompt.as_ptr(), title.as_ptr()) }; if !result { return None; } @@ -43,13 +43,9 @@ pub fn get_text_line_input(prompt: &str, title: &str) -> Option<String> { pub fn get_integer_input(prompt: &str, title: &str) -> Option<i64> { let mut value: i64 = 0; - let result = unsafe { - BNGetIntegerInput( - &mut value, - prompt.to_cstr().as_ptr() as *mut _, - title.to_cstr().as_ptr() as *mut _, - ) - }; + let prompt = prompt.to_cstr(); + let title = title.to_cstr(); + let result = unsafe { BNGetIntegerInput(&mut value, prompt.as_ptr(), title.as_ptr()) }; if !result { return None; @@ -61,11 +57,13 @@ pub fn get_integer_input(prompt: &str, title: &str) -> Option<i64> { pub fn get_address_input(prompt: &str, title: &str) -> Option<u64> { let mut value: u64 = 0; + let prompt = prompt.to_cstr(); + let title = title.to_cstr(); let result = unsafe { BNGetAddressInput( &mut value, - prompt.to_cstr().as_ptr() as *mut _, - title.to_cstr().as_ptr() as *mut _, + prompt.as_ptr(), + title.as_ptr(), std::ptr::null_mut(), 0, ) @@ -81,13 +79,9 @@ pub fn get_address_input(prompt: &str, title: &str) -> Option<u64> { pub fn get_open_filename_input(prompt: &str, extension: &str) -> Option<PathBuf> { let mut value: *mut c_char = std::ptr::null_mut(); - let result = unsafe { - BNGetOpenFileNameInput( - &mut value, - prompt.to_cstr().as_ptr() as *mut _, - extension.to_cstr().as_ptr() as *mut _, - ) - }; + let prompt = prompt.to_cstr(); + let extension = extension.to_cstr(); + let result = unsafe { BNGetOpenFileNameInput(&mut value, prompt.as_ptr(), extension.as_ptr()) }; if !result { return None; } @@ -103,12 +97,15 @@ pub fn get_save_filename_input( ) -> Option<PathBuf> { let mut value: *mut c_char = std::ptr::null_mut(); + let prompt = prompt.to_cstr(); + let extension = extension.to_cstr(); + let default_name = default_name.to_cstr(); let result = unsafe { BNGetSaveFileNameInput( &mut value, - prompt.to_cstr().as_ptr() as *mut _, - extension.to_cstr().as_ptr() as *mut _, - default_name.to_cstr().as_ptr() as *mut _, + prompt.as_ptr(), + extension.as_ptr(), + default_name.as_ptr(), ) }; if !result { @@ -122,13 +119,10 @@ pub fn get_save_filename_input( pub fn get_directory_name_input(prompt: &str, default_name: &str) -> Option<PathBuf> { let mut value: *mut c_char = std::ptr::null_mut(); - let result = unsafe { - BNGetDirectoryNameInput( - &mut value, - prompt.to_cstr().as_ptr() as *mut _, - default_name.to_cstr().as_ptr() as *mut _, - ) - }; + let prompt = prompt.to_cstr(); + let default_name = default_name.to_cstr(); + let result = + unsafe { BNGetDirectoryNameInput(&mut value, prompt.as_ptr(), default_name.as_ptr()) }; if !result { return None; } @@ -137,23 +131,15 @@ pub fn get_directory_name_input(prompt: &str, default_name: &str) -> Option<Path Some(PathBuf::from(path)) } -pub type MessageBoxButtonSet = BNMessageBoxButtonSet; -pub type MessageBoxIcon = BNMessageBoxIcon; -pub type MessageBoxButtonResult = BNMessageBoxButtonResult; pub fn show_message_box( title: &str, text: &str, buttons: MessageBoxButtonSet, icon: MessageBoxIcon, ) -> MessageBoxButtonResult { - unsafe { - BNShowMessageBox( - title.to_cstr().as_ptr() as *mut _, - text.to_cstr().as_ptr() as *mut _, - buttons, - icon, - ) - } + let title = title.to_cstr(); + let text = text.to_cstr(); + unsafe { BNShowMessageBox(title.as_ptr(), text.as_ptr(), buttons, icon) } } pub enum FormResponses { @@ -210,7 +196,7 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::LabelFormField; result.hasDefault = false; - result.prompt = text.as_ref().as_ptr() as *const c_char; + result.prompt = text.as_ptr(); self.fields.push(result); self.data.push(FormData::Label { _text: text }); @@ -233,10 +219,10 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::TextLineFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); result.hasDefault = default.is_some(); if let Some(ref default) = default { - result.stringDefault = default.as_ref().as_ptr() as *const c_char; + result.stringDefault = default.as_ptr(); } self.fields.push(result); @@ -254,10 +240,10 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::MultilineTextFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); result.hasDefault = default.is_some(); if let Some(ref default) = default { - result.stringDefault = default.as_ref().as_ptr() as *const c_char; + result.stringDefault = default.as_ptr(); } self.fields.push(result); @@ -274,7 +260,7 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::IntegerFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); result.hasDefault = default.is_some(); if let Some(default) = default { result.intDefault = default; @@ -297,7 +283,7 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::AddressFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); if let Some(view) = view { // the view is being moved into result, there is no need to clone // and drop is intentionally being avoided with `Ref::into_raw` @@ -321,11 +307,8 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::ChoiceFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; - let mut raw_choices: Vec<*const c_char> = choices - .iter() - .map(|c| c.as_ref().as_ptr() as *const c_char) - .collect(); + result.prompt = prompt.as_ptr(); + let mut raw_choices: Vec<*const c_char> = choices.iter().map(|c| c.as_ptr()).collect(); result.choices = raw_choices.as_mut_ptr(); result.count = choices.len(); result.hasDefault = default.is_some(); @@ -359,11 +342,11 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::OpenFileNameFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; - result.ext = ext.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); + result.ext = ext.as_ptr(); result.hasDefault = default.is_some(); if let Some(ref default) = default { - result.stringDefault = default.as_ref().as_ptr() as *const c_char; + result.stringDefault = default.as_ptr(); } self.fields.push(result); @@ -398,12 +381,12 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::SaveFileNameFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; - result.ext = ext.as_ref().as_ptr() as *const c_char; - result.defaultName = default_name.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); + result.ext = ext.as_ptr(); + result.defaultName = default_name.as_ptr(); result.hasDefault = default.is_some(); if let Some(ref default) = default { - result.stringDefault = default.as_ref().as_ptr() as *const c_char; + result.stringDefault = default.as_ptr(); } self.fields.push(result); @@ -433,11 +416,11 @@ impl FormInputBuilder { let mut result = unsafe { std::mem::zeroed::<BNFormInputField>() }; result.type_ = BNFormInputFieldType::DirectoryNameFormField; - result.prompt = prompt.as_ref().as_ptr() as *const c_char; - result.defaultName = default_name.as_ref().as_ptr() as *const c_char; + result.prompt = prompt.as_ptr(); + result.defaultName = default_name.as_ptr(); result.hasDefault = default.is_some(); if let Some(ref default) = default { - result.stringDefault = default.as_ref().as_ptr() as *const c_char; + result.stringDefault = default.as_ptr(); } self.fields.push(result); @@ -491,13 +474,8 @@ impl FormInputBuilder { /// println!("{} {} likes {}", &first_name, &last_name, food); /// ``` pub fn get_form_input(&mut self, title: &str) -> Vec<FormResponses> { - if unsafe { - BNGetFormInput( - self.fields.as_mut_ptr(), - self.fields.len(), - title.to_cstr().as_ptr() as *const _, - ) - } { + let title = title.to_cstr(); + if unsafe { BNGetFormInput(self.fields.as_mut_ptr(), self.fields.len(), title.as_ptr()) } { let result = self .fields .iter() @@ -575,9 +553,10 @@ pub fn run_progress_dialog<F: Fn(Box<dyn Fn(usize, usize) -> Result<(), ()>>)>( }) } + let title = title.to_cstr(); if unsafe { BNRunProgressDialog( - title.to_cstr().as_ptr() as *mut _, + title.as_ptr(), can_cancel, Some(cb_task::<F>), &mut ctxt as *mut _ as *mut c_void, |
