use std::ffi::{CString, CStr}; use std::os::raw::c_char; #[unsafe(no_mangle)] pub extern "C" fn hello(s_ptr: *const c_char) -> *const c_char { let s = unsafe { CStr::from_ptr(s_ptr) }.to_str().expect("invalid UTF-8"); CString::new(format!("Hello {}!", s)).unwrap().into_raw() } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { let ptr = hello(CStr::from_bytes_with_nul(b"Rust\0").unwrap().as_ptr()); let out = unsafe { CStr::from_ptr(ptr) }; let expected = CStr::from_bytes_with_nul(b"Hello Rust!\0").unwrap(); assert_eq!(out, expected); } }