Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ license = "GPL-3.0-or-later"
keywords = ["hex-editor", "reverse-engineering", "binary", "pe", "elf"]
categories = ["command-line-utilities", "security"]


[dependencies]
arboard = { version = "3", default-features = false }
clap = { version = "4.5.49", features = ["derive"] }
Expand All @@ -19,13 +18,14 @@ directories-next = "2.0.0"
encoding_rs = "0.8.35"
evalexpr = "13.1.*"
hex = "0.4.3"
memchr = "2.8.0"
mmap-io = "0.9.4"
ratatui = "0.30.0"
regex = "1.11.2"
serde = { version = "1.0.228", features = ["derive"] }
shell-words = "1.1.0"
tui-input = "0.15.0"
mmap-io = { version = "0.9.4" }
toml = "1.0.1"
tui-input = "0.15.0"

# The profile that 'dist' will build with
[profile.dist]
Expand Down
79 changes: 15 additions & 64 deletions src/hex/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,40 +51,27 @@ pub fn hex_string_to_u8(hex_string: &str) -> Option<Vec<u8>> {

pub fn search<T: AsRef<[u8]>>(app: &mut App, needle: T) -> Option<usize> {
let text = needle.as_ref();
let siz = text.len();
let filesize = app.file_info.size;
let buffer = app.file_info.get_buffer();

if filesize == 0 {
if filesize == 0 || text.is_empty() {
return None;
}

let search_forward = || {
for (i, win) in buffer[app.hex_view.offset + 1..].windows(siz).enumerate() {
if win == text {
return Some(app.hex_view.offset + i + 1);
}
}
None
};

let search_backward = || {
for (i, win) in buffer[0..app.hex_view.offset]
.windows(siz)
.rev()
.enumerate()
{
if win == text {
return Some(app.hex_view.offset - i - text.len());
}
}
None
};

let ofs = if app.hex_view.search.direction == SearchDirection::Forward {
search_forward()
let start = app.hex_view.offset.checked_add(1)?;
if start < filesize {
memchr::memmem::find(buffer.get(start..)?, text).map(|pos| start + pos)
} else {
None
}
} else {
search_backward()
let end = app.hex_view.offset;
if end > 0 {
memchr::memmem::rfind(buffer.get(..end)?, text)
} else {
None
}
};

if ofs.is_some() {
Expand All @@ -93,28 +80,10 @@ pub fn search<T: AsRef<[u8]>>(app: &mut App, needle: T) -> Option<usize> {

// ofs is None, check wrap setting
if app.config.search_wrap {
let search_wrap_forward = || {
for (i, win) in buffer.windows(siz).enumerate() {
if win == text {
return Some(i);
}
}
None
};

let search_wrap_backward = || {
for (i, win) in buffer.windows(siz).rev().enumerate() {
if win == text {
return Some(filesize - i - text.len());
}
}
None
};

let ofs = if app.hex_view.search.direction == SearchDirection::Forward {
search_wrap_forward()
memchr::memmem::find(buffer, text)
} else {
search_wrap_backward()
memchr::memmem::rfind(buffer, text)
};

if ofs.is_some() {
Expand All @@ -126,24 +95,6 @@ pub fn search<T: AsRef<[u8]>>(app: &mut App, needle: T) -> Option<usize> {
None
}

// pub fn search_back<T: AsRef<[u8]>>(app: &mut App, needle: T) -> Option<usize> {
// let text = needle.as_ref();
// let siz = text.len();
// let buffer = app.file_info.get_buffer();
// for (i, win) in buffer[0..app.hex_view.offset]
// .windows(siz)
// .rev()
// .enumerate()
// {
// if win == text {
// return Some(app.hex_view.offset - i - 1);
// }
// }
//
// crate::beep!();
// None
// }

// string
// hex
pub fn dialog_search_draw(app: &mut App, frame: &mut Frame) {
Expand Down