use libc::{c_char, size_t};
use std::ffi::{CStr, CString};
use std::slice;
use std::str::Utf8Error;
pub unsafe fn convert_double_pointer_to_vec(data: *const *const c_char, len: size_t) -> Result<Vec<String>, Utf8Error> {
unsafe {
slice::from_raw_parts(data, len)
.iter()
.map(|arg| CStr::from_ptr(*arg).to_str().map(ToString::to_string))
.collect()
}
}
pub unsafe fn convert_char_ptr_to_string(data: *const c_char) -> Result<String, Utf8Error> {
unsafe { CStr::from_ptr(data).to_str().map(ToString::to_string) }
}
#[unsafe(no_mangle)]
pub extern "C" fn free_c_string(ptr: *const c_char) {
unsafe {
let _ = CString::from_raw(ptr.cast_mut());
}
}
#[unsafe(no_mangle)]
pub extern "C" fn free_u64(ptr: *const u64) {
unsafe {
let _ = Box::from_raw(ptr.cast_mut());
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn free_c_string_array(ptr: *const *const c_char, count: usize) {
if ptr.is_null() {
return;
}
let slice = unsafe { Box::from_raw(std::ptr::slice_from_raw_parts_mut(ptr.cast_mut(), count)) };
let _: Vec<_> = slice
.iter()
.filter(|p| !p.is_null())
.map(|arg| unsafe { CString::from_raw((*arg).cast_mut()) })
.collect();
}