use keyhog_core::SensitiveString;
pub(crate) fn extract_printable_strings(bytes: &[u8], min_len: usize) -> Vec<SensitiveString> {
let mut strings = Vec::new();
let mut current_string = String::with_capacity(64);
for &b in bytes {
if b.is_ascii_graphic() || b == b' ' || b == b'\t' {
current_string.push(b as char);
} else {
if current_string.len() >= min_len {
strings.push(SensitiveString::from(current_string.as_str()));
}
current_string.clear();
}
}
if current_string.len() >= min_len {
strings.push(SensitiveString::from(current_string.as_str()));
}
extract_utf16le_into(bytes, min_len, &mut strings);
strings
}
fn extract_utf16le_into(bytes: &[u8], min_len: usize, out: &mut Vec<SensitiveString>) {
let mut current = String::with_capacity(64);
let mut i = 0;
while i + 1 < bytes.len() {
let (lo, hi) = (bytes[i], bytes[i + 1]);
if hi == 0 && (lo.is_ascii_graphic() || lo == b' ' || lo == b'\t') {
current.push(lo as char);
i += 2;
} else {
if current.len() >= min_len {
out.push(SensitiveString::from(current.as_str()));
}
current.clear();
i += 1;
}
}
if current.len() >= min_len {
out.push(SensitiveString::from(current.as_str()));
}
}