56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
#[unsafe(no_mangle)]
|
|
extern "C" fn panic() -> ! {
|
|
panic!("Called panic from external code.");
|
|
}
|
|
|
|
#[repr(C)]
|
|
struct FFISlice {
|
|
ptr: *const u8,
|
|
len: usize,
|
|
}
|
|
|
|
impl FFISlice {
|
|
fn as_slice(&self) -> &[u8] {
|
|
unsafe { core::slice::from_raw_parts(self.ptr, self.len) }
|
|
}
|
|
fn as_str(&self) -> &str {
|
|
unsafe { core::str::from_utf8_unchecked(self.as_slice()) }
|
|
}
|
|
}
|
|
|
|
unsafe extern "C" {
|
|
unsafe fn int_to_str2(value: isize, buffer: *mut u8, buffer_len: usize, radix: u8) -> FFISlice;
|
|
}
|
|
|
|
fn main() {
|
|
let value = 1234567890isize;
|
|
let mut buffer = [0u8; 32];
|
|
unsafe {
|
|
let slice = int_to_str2(value, buffer.as_mut_ptr(), buffer.len(), 10);
|
|
let s = slice.as_str();
|
|
println!("Integer: {}, String: {}", value, s);
|
|
assert_eq!(s, format!("{value}"));
|
|
|
|
let slice = int_to_str2(0 - value, buffer.as_mut_ptr(), buffer.len(), 10);
|
|
let s = slice.as_str();
|
|
println!("Integer: {}, String: {}", 0 - value, s);
|
|
assert_eq!(s, format!("{}", 0 - value));
|
|
|
|
let slice = int_to_str2(value, buffer.as_mut_ptr(), buffer.len(), 16);
|
|
let s = slice.as_str();
|
|
println!("Integer: {:x}, String: {}", value, s);
|
|
assert_eq!(s, format!("{value:x}"));
|
|
|
|
let slice = int_to_str2(value, buffer.as_mut_ptr(), buffer.len(), 8);
|
|
let s = slice.as_str();
|
|
println!("Integer: {:o}, String: {}", value, s);
|
|
assert_eq!(s, format!("{value:o}"));
|
|
|
|
let value = 235isize;
|
|
let slice = int_to_str2(value, buffer.as_mut_ptr(), buffer.len(), 2);
|
|
let s = slice.as_str();
|
|
println!("Integer: {:b}, String: {}", value, s);
|
|
assert_eq!(s, format!("{value:b}"));
|
|
}
|
|
}
|