38 lines
665 B
Rust
38 lines
665 B
Rust
use std::ffi::{c_char, CStr};
|
|
use std::ops::Deref;
|
|
|
|
extern "C" {
|
|
fn hello() -> *const c_char;
|
|
fn goodbye(s: *const c_char);
|
|
}
|
|
|
|
struct Greeting {
|
|
message: *const c_char,
|
|
}
|
|
|
|
impl Drop for Greeting {
|
|
fn drop(&mut self) {
|
|
unsafe { goodbye(self.message); }
|
|
}
|
|
}
|
|
|
|
impl Greeting {
|
|
fn new() -> Greeting {
|
|
Greeting { message: unsafe { hello() } }
|
|
}
|
|
}
|
|
|
|
impl Deref for Greeting {
|
|
type Target = str;
|
|
fn deref<'a>(&'a self) -> &'a str {
|
|
let c_str = unsafe{ CStr::from_ptr(self.message) };
|
|
c_str.to_str().unwrap()
|
|
}
|
|
}
|
|
|
|
|
|
fn main() {
|
|
let greeting = Greeting::new();
|
|
println!("{}", greeting.deref());
|
|
}
|