use alloc::boxed::Box;
use core::ffi::{c_char, CStr};
fn shared_ffi_core(
input: *const c_char,
out_candidates: *mut *const usize,
inner: impl FnOnce(&str) -> Box<[usize]>,
) -> usize {
let input = unsafe { CStr::from_ptr(input) };
let Ok(input) = input.to_str() else { return 0 };
let result = inner(input);
let ret = result.len();
unsafe { out_candidates.write((*result).as_ptr()) };
core::mem::forget(result);
ret
}
#[unsafe(no_mangle)]
extern "C" fn find_kashidas_arabic(
input: *const c_char,
out_candidates: *mut *const usize,
) -> usize {
shared_ffi_core(input, out_candidates, super::arabic::find_kashidas)
}
#[unsafe(no_mangle)]
extern "C" fn find_kashidas_syriac(
input: *const c_char,
out_candidates: *mut *const usize,
) -> usize {
shared_ffi_core(input, out_candidates, super::syriac::find_kashidas)
}
#[unsafe(no_mangle)]
extern "C" fn find_kashidas_generic(
input: *const c_char,
out_candidates: *mut *const usize,
) -> usize {
shared_ffi_core(input, out_candidates, super::global::find_kashidas)
}
#[unsafe(no_mangle)]
extern "C" fn free_candidates(data: *mut usize, len: usize) {
unsafe {
drop(Box::from_raw(core::ptr::slice_from_raw_parts_mut(data, len)));
};
}