use std::ffi::{c_char, CString};
#[no_mangle]
pub unsafe extern "C" fn llev_string_free(ptr: *mut c_char) {
if !ptr.is_null() {
drop(CString::from_raw(ptr));
}
}
#[no_mangle]
pub unsafe extern "C" fn llev_string_array_free(arr: *mut *mut c_char, len: usize) {
if arr.is_null() {
return;
}
let slice = std::slice::from_raw_parts_mut(arr, len);
for ptr in slice.iter() {
if !ptr.is_null() {
drop(CString::from_raw(*ptr));
}
}
drop(Vec::from_raw_parts(arr, len, len));
}
#[no_mangle]
pub unsafe extern "C" fn llev_string_dup(src: *const c_char) -> *mut c_char {
if src.is_null() {
return std::ptr::null_mut();
}
match std::ffi::CStr::from_ptr(src).to_str() {
Ok(s) => match CString::new(s) {
Ok(cstr) => cstr.into_raw(),
Err(_) => std::ptr::null_mut(),
},
Err(_) => std::ptr::null_mut(),
}
}