diff --git a/.gitignore b/.gitignore index 3ca43ae..ea8c4bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1 @@ -# ---> Rust -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..72980c3 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "utils-debug-c-lib" +version = "0.1.0" +dependencies = [ + "libc", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..837c7be --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "utils-debug-c-lib" +version = "0.1.0" +edition = "2021" +build = "build.rs" + +[dependencies] +libc = "0.2" diff --git a/README.md b/README.md index c25e7b4..de13168 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# Krys4lide +## À explorer -Logiciel de pharmacie \ No newline at end of file +- Générer des bindings RUST depuis des .h : https://jvns.ca/blog/2017/12/21/bindgen-is-awesome/ diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..f540504 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +fn main() { + println!("cargo:rustc-link-search=native=./lib"); + println!("cargo:rustc-link-lib=static=p4pillondebuglib"); + println!("cargo:rerun-if-changed=lib/libp4pillondebuglib.a"); +} diff --git a/lib/libp4pillondebuglib.a b/lib/libp4pillondebuglib.a new file mode 100644 index 0000000..f36c97a Binary files /dev/null and b/lib/libp4pillondebuglib.a differ diff --git a/lib/p4pillondebuglib.o b/lib/p4pillondebuglib.o new file mode 100644 index 0000000..4a1decf Binary files /dev/null and b/lib/p4pillondebuglib.o differ diff --git a/makefile b/makefile new file mode 100644 index 0000000..0da93cd --- /dev/null +++ b/makefile @@ -0,0 +1,32 @@ +# Detect the operating system +ifeq ($(OS),Windows_NT) + MKDIR = if not exist $(LIB_DIR) mkdir $(LIB_DIR) + RM = del +else + MKDIR = mkdir -p $(LIB_DIR) + RM = rm -f +endif + +CC = gcc +AR = ar +CFLAGS = -Wall -fPIC +SRC_DIR = src +LIB_DIR = lib +SRC_FILES = $(wildcard $(SRC_DIR)/*.c) +OBJ_FILES = $(SRC_FILES:$(SRC_DIR)/%.c=$(LIB_DIR)/%.o) +STATIC_LIB = $(LIB_DIR)/libp4pillondebuglib.a + +all: $(STATIC_LIB) + +$(STATIC_LIB): $(OBJ_FILES) + $(MKDIR) + $(AR) rcs $@ $^ + +$(LIB_DIR)/%.o: $(SRC_DIR)/%.c + $(MKDIR) + $(CC) $(CFLAGS) -c $< -o $@ + +clean: + $(RM) $(OBJ_FILES) $(STATIC_LIB) + +.PHONY: all clean \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..6526ca4 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,90 @@ +extern crate libc; + +use libc::{ c_char, c_int, c_void, size_t }; +use std::ffi::CStr; +use std::ptr; + +extern { + fn hello() -> *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); + fn add(a: c_int, b: c_int) -> c_int; + fn addPtr(a: c_int, b: c_int, result: *mut c_int); + fn fillHexValues(result: *mut *mut c_void, size: *mut size_t); +} + +fn main() { + + unsafe { + let c_str = hello(); + let r_str = CStr::from_ptr(c_str).to_str().unwrap(); + println!("{} from C", r_str); + } + + let mut buffer: [c_char; 50] = [0; 50]; + unsafe { + helloPtr(buffer.as_mut_ptr()); + let c_str = CStr::from_ptr(buffer.as_ptr()); + let r_str = c_str.to_str().unwrap(); + println!("{} from C Ptr", r_str); + } + + let mut buffer: *mut c_char = ptr::null_mut(); + let mut size: size_t = 0; + unsafe { + helloPtrPtr(&mut buffer, &mut size); + + if !buffer.is_null() { + let c_str = CStr::from_ptr(buffer); + let r_str = c_str.to_str().unwrap(); + println!("{} from C Ptr Ptr (size: {})", r_str, size); + + libc::free(buffer as *mut c_void); + } + } + + let mut buffer: *mut c_void = ptr::null_mut(); + let mut size: size_t = 0; + unsafe { + helloVoidPtrPtr(&mut buffer, &mut size); + + if !buffer.is_null() { + let c_str = CStr::from_ptr(buffer as *const c_char); + let r_str = c_str.to_str().unwrap(); + println!("{} from C Void Ptr Ptr (size: {})", r_str, size); + + libc::free(buffer); + } + } + + unsafe { + let result = add(1, 2); + println!("Result of 1 + 2 = {}", result); + } + + unsafe { + let mut result = 0; + addPtr(1, 2, &mut result); + println!("Result Ptr of 1 + 2 = {}", result); + } + + let mut buffer: *mut c_void = ptr::null_mut(); + let mut size: size_t = 0; + unsafe { + fillHexValues(&mut buffer, &mut size); + + if !buffer.is_null() { + let hex_values = std::slice::from_raw_parts(buffer as *const u8, size); + for &byte in hex_values { + print!("{:02X} ", byte); + } + println!(); + + libc::free(buffer); + } + } + + + +} diff --git a/src/p4pillondebuglib.c b/src/p4pillondebuglib.c new file mode 100644 index 0000000..22348af --- /dev/null +++ b/src/p4pillondebuglib.c @@ -0,0 +1,49 @@ +// mylib.c +#include +#include +#include + +char* hello() { + return "Hello, World!"; +} + +void helloPtr(char *result) { + sprintf(result, "Hello, World!"); +} + +void helloPtrPtr(char **result, size_t *size) { + const char *message = "Hello, World!"; + *size = strlen(message) + 1; // +1 for null terminator + *result = (char *)malloc(*size); + if (*result) { + strcpy(*result, message); + } +} + +void helloVoidPtrPtr(void **result, size_t *size) { + const char *message = "Hello, World!"; + *size = strlen(message) + 1; // +1 for null terminator + *result = malloc(*size); + if (*result != NULL) { + strcpy((char *)*result, message); + } +} + +int add(int a, int b) { + return a + b; +} + +// Add function returning result in a pointer +void addPtr(int a, int b, int *result) { + *result = a + b; +} + +void fillHexValues(void **result, size_t *size) { + unsigned char values[5] = {0x05, 0xE7, 0x02, 0x00, 0x00}; + + *size = sizeof(values); + *result = malloc(*size); + if (*result != NULL) { + memcpy(*result, values, *size); + } +} diff --git a/src/p4pillondebuglib.h b/src/p4pillondebuglib.h new file mode 100644 index 0000000..462098f --- /dev/null +++ b/src/p4pillondebuglib.h @@ -0,0 +1,14 @@ +#ifndef P4PILLONDEBUGLIB_H +#define P4PILLONDEBUGLIB_H + +#include + +char* hello(); +void helloPtr(char *result); +void helloPtrPtr(char **result, size_t *size); +void helloVoidPtrPtr(void **result, size_t *size); +int add(int a, int b); +void addPtr(int a, int b, int *result); +void fillHexValues(void **result, size_t *size); + +#endif // P4PILLONDEBUGLIB_H \ No newline at end of file