use std::ffi::c_char;
use crate::distance::{standard_distance, transposition_distance};
#[no_mangle]
pub unsafe extern "C" fn llev_distance(
source: *const c_char,
source_len: usize,
target: *const c_char,
target_len: usize,
) -> usize {
let source = match super::cstr_to_str(source) {
Some(s) => &s[..source_len.min(s.len())],
None => return usize::MAX,
};
let target = match super::cstr_to_str(target) {
Some(s) => &s[..target_len.min(s.len())],
None => return usize::MAX,
};
standard_distance(source, target)
}
#[no_mangle]
pub unsafe extern "C" fn llev_distance_threshold(
source: *const c_char,
source_len: usize,
target: *const c_char,
target_len: usize,
threshold: usize,
) -> usize {
let source = match super::cstr_to_str(source) {
Some(s) => &s[..source_len.min(s.len())],
None => return usize::MAX,
};
let target = match super::cstr_to_str(target) {
Some(s) => &s[..target_len.min(s.len())],
None => return usize::MAX,
};
let dist = standard_distance(source, target);
if dist > threshold {
usize::MAX - 1
} else {
dist
}
}
#[no_mangle]
pub unsafe extern "C" fn llev_damerau_distance(
source: *const c_char,
source_len: usize,
target: *const c_char,
target_len: usize,
) -> usize {
let source = match super::cstr_to_str(source) {
Some(s) => &s[..source_len.min(s.len())],
None => return usize::MAX,
};
let target = match super::cstr_to_str(target) {
Some(s) => &s[..target_len.min(s.len())],
None => return usize::MAX,
};
transposition_distance(source, target)
}
#[no_mangle]
pub unsafe extern "C" fn llev_damerau_distance_threshold(
source: *const c_char,
source_len: usize,
target: *const c_char,
target_len: usize,
threshold: usize,
) -> usize {
let source = match super::cstr_to_str(source) {
Some(s) => &s[..source_len.min(s.len())],
None => return usize::MAX,
};
let target = match super::cstr_to_str(target) {
Some(s) => &s[..target_len.min(s.len())],
None => return usize::MAX,
};
let dist = transposition_distance(source, target);
if dist > threshold {
usize::MAX - 1
} else {
dist
}
}