From 7a22503baca163babffe0b05d3ec655c4807f7ae Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Thu, 4 Jul 2024 22:56:52 +0200 Subject: [PATCH] feature: Add helloName function to greet with a name --- lib/libp4pillondebuglib.a | Bin 3180 -> 3474 bytes lib/p4pillondebuglib.o | Bin 2872 -> 3152 bytes src/main.rs | 15 +++++++++++++-- src/p4pillondebuglib.c | 8 ++++++++ src/p4pillondebuglib.h | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/libp4pillondebuglib.a b/lib/libp4pillondebuglib.a index f36c97a3b72d8e93fe251d72fdd62620df213248..e31fd853b1950f9a4c83e17bdf36bbd863f3ad49 100644 GIT binary patch delta 1092 zcmaKqO=uHA6o6+o$!2%cl%OR)8j}?iLaUgqZMN+}ky70FlX~!{iilBDtVwE{M9@R2 zP%VTIuzenK3W8oOh=LwG)RXn#&s8YcV-8*fg+MF%COZjZ4?dWA?|tvho1Zt|gUh=g z?YY!%3=j3|dR%8B&bn?G11+lSS2aS2LI{=rH*RKfx!a^Qr_%Y%($upEuWrQSSh_PO z2C(p9V-WhNA$?Kc3hh0mTjjZiRT*no<@XKTjaUn-YR4{*HLZoYCMiX&$~l(Sw5r}# zR{0YqyaVK<^r5)?`ElQ(aSsL$hBDV7Sk%rwcT z@iDHG;!I&`x-@Aw=}f86G0=tyc?2HI!Q@_E#fcglPPYEoa!}xIfgk5wLhZo8J`0lz z@Jo)uE7=!%U<1M`;+uCW*5SDvII$u`#r@UR&6#O{g0>igiG`y@?+R|)KDxB3YSqOdeJHVGV2{6@Q{8;F>+!|k5pXZeTM zA+LOsR0&dQLT&W{!!@X?rj(T6hvJ8IHP$x6T1-vybA{lvX3}f$P&+Cu@k}k|sJof9;>&efFayBSVAJw2!gE{&_Xya)3%s~j27ptJoe`h!AG zeF0~x4^3^7R$y04!j6`LKe+n|ms*mZgQ0(m&SDoP&rruSeT8)}DwCvnql=rrZ$|{;J?xZGe|Tn;;sXb{x@Byl_|+*`E^HlIKN*bJe=QPgqHxUzsey6Kl0M5>fD=$e#BF5Db6ttik%A0 z*LKRf6=#0{ZQG+Ne76fqPT`SGism8h6e26^h$uq>zT=r}cqseOcRZ`gMuxHtH@F+H RPes{+xu~ZU@xO>Z{|7xT$p8QV diff --git a/lib/p4pillondebuglib.o b/lib/p4pillondebuglib.o index 4a1decf2a2ebab8314e4ab6ab64f7afc471c5fe5..3711dc74f1e97e152cbbe2f8be508bbff2fea0ce 100644 GIT binary patch delta 910 zcmZ`%O=uHA6rP#wCOfMwL5kU}(rux|5-L&;UF{`E32w1i1^)^jTs5VdwAN$=FC{{y z5JJK5F7c9!cojUEgNJysf@nPof<1W1wa`Prg1*VVEg{ekX5M?>``*0yYnu`(+*Go*x7FWKmA|2=q1>1p@Tk*=`(OoxA-Vj_2kr9TCWdn9LK@G5SNJ;Xf+%r#kb*;?!dC1;4jfj@;dl9 zzf)_Kwn@{w)_xa%4E?Cb0G%o75%I&st94>s`U_or_g)`{{4`Sq-3`7UQ6N-DgwiKq zD|W^9J27J~$SQ#v71)aL>>LEsHCQxU zJ_l8K1{#J%UfZzb9Bs-5Te|!{T$gEHMO~WL;D=0`+myFB44JN>E&$PlMbnkL>WL6F Yc#Y9>J&ZQtr|Ft^@c%0W3^y|TAN?lK1ONa4 delta 655 zcmca0u|sTv2Gb7qiCS74SFC58oWx{0c?MI-WF2M+#+b>j%<_|6m^CK%0C{^RFJ+cz zyfgVI^I}dd1_)4|T*x9VD#XCZU=9^2fYRnb8F5BCFzE^+6McX(AeGC}RK`HX#Tg+I zB2f7RsJJ#%TplW(4i)!;if2Q`OD89?nyChq6fqPR6lLa>q%mZq=H%o91;An@MLDT? z47rIwq2$TOSgj`iW0jgbgPmtG4;v4o!Q_K%;*4IC8G&Tfa0#KKt>#ar-M^?WMNt}OjFT1xSEOZ;7HZTEc5MDm{ zBfGdHEaVQL$!bql4toL`|D`6e53nKLp^&g8OZGGc-#T5P&fcV&E$_jo&!6CS2B4cr#t|!ppW(d diff --git a/src/main.rs b/src/main.rs index 6526ca4..69018ee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,13 @@ extern crate libc; use libc::{ c_char, c_int, c_void, size_t }; -use std::ffi::CStr; +use std::ffi::{ CStr, CString }; use std::ptr; -extern { +#[link(name = "p4pillondebuglib")] +extern "C" { fn hello() -> *const c_char; + fn helloName(name: *const c_char) -> *const c_char; fn helloPtr(result: *mut c_char); fn helloPtrPtr(result: *mut *mut c_char, size: *mut size_t); fn helloVoidPtrPtr(result: *mut *mut c_void, size: *mut size_t); @@ -22,6 +24,15 @@ fn main() { println!("{} from C", r_str); } + let name = CString::new("John").expect("CString::new failed"); + unsafe { + let c_str = helloName(name.as_ptr()); + let r_str = CStr::from_ptr(c_str).to_str().expect("Conversion failed"); + println!("{} from C with name", r_str); + + libc::free(c_str as *mut c_void); + } + let mut buffer: [c_char; 50] = [0; 50]; unsafe { helloPtr(buffer.as_mut_ptr()); diff --git a/src/p4pillondebuglib.c b/src/p4pillondebuglib.c index 22348af..d9038c6 100644 --- a/src/p4pillondebuglib.c +++ b/src/p4pillondebuglib.c @@ -7,6 +7,14 @@ char* hello() { return "Hello, World!"; } +char* helloName(const char *name) { + char *result = (char *)malloc(strlen(name) + 9); + if (result) { + sprintf(result, "Hello, %s!", name); + } + return result; +} + void helloPtr(char *result) { sprintf(result, "Hello, World!"); } diff --git a/src/p4pillondebuglib.h b/src/p4pillondebuglib.h index 462098f..c839174 100644 --- a/src/p4pillondebuglib.h +++ b/src/p4pillondebuglib.h @@ -4,6 +4,7 @@ #include char* hello(); +char* helloName(const char *name); void helloPtr(char *result); void helloPtrPtr(char **result, size_t *size); void helloVoidPtrPtr(void **result, size_t *size);