feat: add calltoc

This commit is contained in:
2022-12-30 13:04:31 +08:00
parent b98542fff3
commit 060c6b2263
6 changed files with 102 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
[build]
rustflags = ["-C", "link-args=-L/Users/hatterjiang/Code/hattergit/simple-rust-tests/__ffi/calltoc -lmyc"]

16
__ffi/calltoc/Cargo.lock generated Normal file
View File

@@ -0,0 +1,16 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "calltoc"
version = "0.1.0"
dependencies = [
"libc",
]
[[package]]
name = "libc"
version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"

9
__ffi/calltoc/Cargo.toml Normal file
View File

@@ -0,0 +1,9 @@
[package]
name = "calltoc"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
libc = "0.2.139"

7
__ffi/calltoc/justfile Normal file
View File

@@ -0,0 +1,7 @@
_:
@just --list
compile_c:
gcc -c myc.c -o myc.o
ar -r libmyc.a myc.o

30
__ffi/calltoc/myc.c Normal file
View File

@@ -0,0 +1,30 @@
#include <stdio.h>
#include <stdlib.h>
char* hello() {
char* ptr = (char*)malloc(13);
if (ptr == NULL) {
return ptr;
}
ptr[0] = 'H';
ptr[1] = 'e';
ptr[2] = 'l';
ptr[3] = 'l';
ptr[4] = 'o';
ptr[5] = ' ';
ptr[6] = 'w';
ptr[7] = 'o';
ptr[8] = 'r';
ptr[9] = 'l';
ptr[10] = 'd';
ptr[11] = '!';
ptr[12] = '\0';
return ptr;
}
void goodbye(char* ptr) {
if (ptr != NULL) {
free(ptr);
}
}

37
__ffi/calltoc/src/main.rs Normal file
View File

@@ -0,0 +1,37 @@
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());
}