use crate::ffi::Slice;
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_lanes() -> usize {
crate::helpers::scan::LANES
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_low() -> u64 {
crate::helpers::scan::LOW
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_high() -> u64 {
crate::helpers::scan::HIGH
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_holds_zero(word: u64) -> u64 {
crate::helpers::scan::holds_zero(word)
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_holds_less(word: u64, bound: u64) -> u64 {
crate::helpers::scan::holds_less(word, bound)
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_marks_zero(word: u64) -> u64 {
crate::helpers::scan::marks_zero(word)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_word_at(data: *const u8, data_len: usize, offset: usize) -> u64 {
let data = unsafe { Slice::borrow(data, data_len) }.unwrap_or_default();
let Some(end) = offset.checked_add(crate::helpers::scan::LANES) else {
return 0;
};
if end > data.len() {
return 0;
}
crate::helpers::scan::word_at(data, offset)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_find(data: *const u8, data_len: usize, needle: u8) -> isize {
let data = unsafe { Slice::borrow(data, data_len) }.unwrap_or_default();
match crate::helpers::scan::find(data, needle) {
Some(offset) => offset as isize,
None => -1,
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_copy(destination: *mut u8, destination_len: usize, source: *const u8, source_len: usize) -> bool {
if destination.is_null() || source.is_null() || destination_len != source_len {
return false;
}
let destination = unsafe { std::slice::from_raw_parts_mut(destination, destination_len) };
let source = unsafe { std::slice::from_raw_parts(source, source_len) };
crate::helpers::scan::copy(destination, source);
true
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_same(left: *const u8, left_len: usize, right: *const u8, right_len: usize) -> bool {
let left = unsafe { Slice::borrow(left, left_len) }.unwrap_or_default();
let right = unsafe { Slice::borrow(right, right_len) }.unwrap_or_default();
crate::helpers::scan::same(left, right)
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_value_control() -> u8 {
crate::helpers::scan::VALUE_CONTROL
}
#[unsafe(no_mangle)]
pub extern "C" fn soyokaze_scan_value_obs_text() -> u8 {
crate::helpers::scan::VALUE_OBS_TEXT
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_classify_field_value(data: *const u8, data_len: usize) -> u8 {
crate::helpers::scan::classify_field_value(unsafe { Slice::borrow(data, data_len) }.unwrap_or_default())
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_is_field_value(data: *const u8, data_len: usize) -> bool {
crate::helpers::scan::is_field_value(unsafe { Slice::borrow(data, data_len) }.unwrap_or_default())
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn soyokaze_scan_all_in_class(data: *const u8, data_len: usize, table: *const u8, mask: u8) -> bool {
if table.is_null() {
return false;
}
let data = unsafe { Slice::borrow(data, data_len) }.unwrap_or_default();
let table = unsafe { &*(table as *const [u8; 256]) };
crate::helpers::scan::all_in_class(data, table, mask)
}