use crate::{decode, encode};
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
#[no_mangle]
pub unsafe extern "C" fn dsk_encode(input: *const c_char) -> *mut c_char {
if input.is_null() {
return std::ptr::null_mut();
}
let cstr = CStr::from_ptr(input);
let Ok(text) = cstr.to_str() else {
return std::ptr::null_mut();
};
let Ok(encoded) = encode(text) else {
return std::ptr::null_mut();
};
CString::new(encoded)
.map(|c| c.into_raw())
.unwrap_or(std::ptr::null_mut())
}
#[no_mangle]
pub unsafe extern "C" fn dsk_decode(input: *const c_char) -> *mut c_char {
if input.is_null() {
return std::ptr::null_mut();
}
let cstr = CStr::from_ptr(input);
let Ok(text) = cstr.to_str() else {
return std::ptr::null_mut();
};
let Ok(decoded) = decode(text) else {
return std::ptr::null_mut();
};
CString::new(decoded)
.map(|c| c.into_raw())
.unwrap_or(std::ptr::null_mut())
}
#[no_mangle]
pub unsafe extern "C" fn dsk_string_free(s: *mut c_char) {
if !s.is_null() {
drop(CString::from_raw(s));
}
}