# Host files File path: `out/dir/api.rs` ```rust // Host code /* Rust API */ #[derive(Debug)] pub enum Commands { #[allow(non_camel_case_types)] print { message: String }, Trinitrix(trinitrix::Trinitrix), } pub mod trinitrix { #[derive(Debug)] pub enum Trinitrix { #[allow(non_camel_case_types)] hi { trixy_output: trixy::oneshot::Sender, name: String }, } } /* C API */ #[no_mangle] pub extern "C" fn print(message: String) -> core::ffi::c_int { callback_function(print); return 1; } pub mod trinitrix_c {} #[no_mangle] pub extern "C" fn trinitrix_hi( output: *mut trixy::types::String, name: String, ) -> core::ffi::c_int { let output_val: trixy::types::String = { let (tx, rx) = trixy::oneshot::channel(); callback_function(trinitrix_hi); let recv = rx .recv() .expect("The channel should not be closed until this value is received"); recv.into() }; unsafe { std::ptr::write(output, output_val); } return 1; } // vim: filetype=rust ``` # Auxiliary files File path: `dist/interface.h` ```c #if !defined TRIXY_MAIN_HEADER #define TRIXY_MAIN_HEADER #include "errno.h" #include "string.h" #include "vec.h" extern int print (const char *message); extern int trinitrix_hi (const char **trixy_output, const char *name); struct trinitrix { int (*hi) (const char **, const char *); }; const struct trinitrix trinitrix = { .hi = trinitrix_hi, }; #endif // if !defined TRIXY_MAIN_HEADER // vim: filetype=c ``` File path: `dist/errno.h` ```c /* * Copyright (C) 2023 - 2024: * The Trinitrix Project * * This file is part of the Trixy crate for Trinitrix. * * Trixy is free software: you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * and the Lesser GNU General Public License along with this program. * If not, see . */ #ifndef TRIXY_ERRNO_H #define TRIXY_ERRNO_H #include /** Calculate the number of bytes in the last error's error message **not** * including any trailing `null` characters. */ extern int last_error_length (); /** Write the most recent error message into a caller-provided buffer as a * UTF-8 string, returning the number of bytes written. * * # Note * * This writes a **UTF-8** string into the buffer. Windows users may need to * convert it to a UTF-16 “Unicode” afterwards. * * If there are no recent errors then this returns `0` (because we wrote 0 * bytes). `-1` is returned if there are any errors, for example when passed a * null pointer or a buffer of insufficient size. */ extern int last_error_message (char *buffer, uint64_t length); #endif // TRIXY_ERRNO_H ``` File path: `dist/string.h` ```c /* * Copyright (C) 2023 - 2024: * The Trinitrix Project * * This file is part of the Trixy crate for Trinitrix. * * Trixy is free software: you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * and the Lesser GNU General Public License along with this program. * If not, see . */ #ifndef TRIXY_STRING_H #define TRIXY_STRING_H /** * @brief Frees a rust-allocated string. */ extern int string_free (const char *string); #endif // TRIXY_STRING_H ``` File path: `dist/vec.h` ```c /* * Copyright (C) 2023 - 2024: * The Trinitrix Project * * This file is part of the Trixy crate for Trinitrix. * * Trixy is free software: you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * and the Lesser GNU General Public License along with this program. * If not, see . */ #ifndef TRIXY_VEC_H #define TRIXY_VEC_H #include /** * @brief A read-only vector from rust. * * @detail * You are must not free it by calling c's `free`. Use `vec_free` * instead. */ struct vec { void *data; size_t length; }; extern int vec_free (struct vec vector); #endif // TRIXY_VEC_H ```