use std::ffi::CString;
use std::os::raw::c_char;
pub unsafe fn copy_to_c_char(src: String, buf: *mut c_char, size: usize) -> bool {
if let Ok(src) = CString::new(src) {
let src = src.as_bytes_with_nul();
if size >= src.len() {
let buf = std::slice::from_raw_parts_mut(buf as *mut u8, size);
buf[0..src.len()].copy_from_slice(src);
return true;
}
}
false
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_copy_to_c_char() {
unsafe {
const INPUT: &str = "1234567890";
let buf = [0_i8; INPUT.len() + 1];
assert!(copy_to_c_char(
INPUT.to_string(),
buf.as_ptr() as *mut c_char,
buf.len()
));
let output = std::ffi::CStr::from_ptr(buf.as_ptr() as *const c_char)
.to_str()
.unwrap();
assert_eq!(INPUT, output);
};
}
#[test]
fn test_copy_to_c_char_short_output() {
unsafe {
const INPUT: &str = "1234567890";
let buf = [0_i8; INPUT.len()];
assert!(!copy_to_c_char(
INPUT.to_string(),
buf.as_ptr() as *mut c_char,
buf.len()
));
};
}
}