summaryrefslogtreecommitdiff
path: root/rust/src/interaction.rs
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-05-04 19:47:55 -0400
committerMason Reed <35282038+emesare@users.noreply.github.com>2025-05-12 17:45:24 -0400
commit788a8b7091bbdde77817030e0836d7a7a786fd99 (patch)
tree40e8f8d3c870788259a5acb5d14995cdc1656979 /rust/src/interaction.rs
parenta826c589dfc10c542deba7ca3343a462e02d6bde (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.rs127
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,