forked from wasmerio/wasmer-ruby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgreet.rs
29 lines (24 loc) · 772 Bytes
/
greet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use std::ffi::{CStr, CString};
use std::mem;
use std::os::raw::{c_char, c_void};
#[no_mangle]
pub extern "C" fn allocate(size: usize) -> *mut c_void {
let mut buffer = Vec::with_capacity(size);
let pointer = buffer.as_mut_ptr();
mem::forget(buffer);
pointer as *mut c_void
}
#[no_mangle]
pub extern "C" fn deallocate(pointer: *mut c_void, capacity: usize) {
unsafe {
let _ = Vec::from_raw_parts(pointer, 0, capacity);
}
}
#[no_mangle]
pub extern "C" fn greet(subject: *mut c_char) -> *mut c_char {
let subject = unsafe { CStr::from_ptr(subject).to_bytes().to_vec() };
let mut output = b"Hello, ".to_vec();
output.extend(&subject);
output.extend(&[b'!']);
unsafe { CString::from_vec_unchecked(output) }.into_raw()
}