From b03f32da00b2abe55dc2720feace61bc21b75cd6 Mon Sep 17 00:00:00 2001 From: Devin Bidwell Date: Wed, 26 Nov 2025 14:27:12 -0700 Subject: [PATCH] wip --- Cargo.lock | 206 -------------------------------------- Cargo.toml | 4 - libs/tokenizer/src/lib.rs | 6 ++ src/lib.rs | 58 +++++++---- 4 files changed, 47 insertions(+), 227 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d0923d..6348b0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,41 +265,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "ext-trait" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d772df1c1a777963712fb68e014235e80863d6a91a85c4e06ba2d16243a310e5" -dependencies = [ - "ext-trait-proc_macros", -] - -[[package]] -name = "ext-trait-proc_macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab7934152eaf26aa5aa9f7371408ad5af4c31357073c9e84c3b9d7f11ad639a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "extension-traits" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a296e5a895621edf9fa8329c83aa1cb69a964643e36cf54d8d7a69b789089537" -dependencies = [ - "ext-trait", -] - -[[package]] -name = "extern-c" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320bea982e85d42441eb25c49b41218e7eaa2657e8f90bc4eca7437376751e23" - [[package]] name = "funty" version = "2.0.0" @@ -363,15 +328,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "inventory" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" -dependencies = [ - "rustversion", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -400,22 +356,6 @@ version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" -[[package]] -name = "macro_rules_attribute" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf0c9b980bf4f3a37fd7b1c066941dd1b1d0152ce6ee6e8fe8c49b9f6810d862" -dependencies = [ - "macro_rules_attribute-proc_macro", - "paste", -] - -[[package]] -name = "macro_rules_attribute-proc_macro" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58093314a45e00c77d5c508f76e77c3396afbbc0d01506e7fae47b018bac2b1d" - [[package]] name = "memchr" version = "2.7.6" @@ -470,12 +410,6 @@ dependencies = [ "tokenizer", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -495,16 +429,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -654,15 +578,6 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustversion" version = "1.0.22" @@ -675,56 +590,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "safer-ffi" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435fdd58b61a6f1d8545274c1dfa458e905ff68c166e65e294a0130ef5e675bd" -dependencies = [ - "extern-c", - "inventory", - "libc", - "macro_rules_attribute", - "paste", - "safer_ffi-proc_macros", - "scopeguard", - "stabby", - "uninit", - "unwind_safe", - "with_builtin_macros", -] - -[[package]] -name = "safer_ffi-proc_macros" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f25be5ba5f319542edb31925517e0380245ae37df50a9752cdbc05ef948156" -dependencies = [ - "macro_rules_attribute", - "prettyplease", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "seahash" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - [[package]] name = "serde" version = "1.0.228" @@ -767,53 +638,12 @@ dependencies = [ "serde_core", ] -[[package]] -name = "sha2-const-stable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" - [[package]] name = "simdutf8" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" -[[package]] -name = "stabby" -version = "36.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b7e94eaf470c2e76b5f15fb2fb49714471a36cc512df5ee231e62e82ec79f8" -dependencies = [ - "rustversion", - "stabby-abi", -] - -[[package]] -name = "stabby-abi" -version = "36.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc7a63b8276b54e51bfffe3d85da56e7906b2dcfcb29018a8ab666c06734c1a" -dependencies = [ - "rustc_version", - "rustversion", - "sha2-const-stable", - "stabby-macros", -] - -[[package]] -name = "stabby-macros" -version = "36.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eecb7ec5611ec93ec79d120fbe55f31bea234dc1bed1001d4a071bb688651615" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "rand", - "syn 1.0.109", -] - [[package]] name = "stationlang" version = "0.1.0" @@ -824,7 +654,6 @@ dependencies = [ "parser", "quick-error", "rust_decimal", - "safer-ffi", "tokenizer", ] @@ -922,21 +751,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" -[[package]] -name = "uninit" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e130f2ed46ca5d8ec13c7ff95836827f92f5f5f37fd2b2bf16f33c408d98bb6" -dependencies = [ - "extension-traits", -] - -[[package]] -name = "unwind_safe" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0976c77def3f1f75c4ef892a292c31c0bbe9e3d0702c63044d7c76db298171a3" - [[package]] name = "utf8parse" version = "0.2.2" @@ -1034,26 +848,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "with_builtin_macros" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a59d55032495429b87f9d69954c6c8602e4d3f3e0a747a12dea6b0b23de685da" -dependencies = [ - "with_builtin_macros-proc_macros", -] - -[[package]] -name = "with_builtin_macros-proc_macros" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bd7679c15e22924f53aee34d4e448c45b674feb6129689af88593e129f8f42" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "wyz" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index dd79ed3..5939f95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ members = ["libs/*"] [workspace.dependencies] quick-error = "2" rust_decimal = "1" -safer-ffi = { version = "^0.1" } [profile.release] strip = true @@ -30,10 +29,7 @@ rust_decimal = { workspace = true } tokenizer = { path = "libs/tokenizer" } parser = { path = "libs/parser" } compiler = { path = "libs/compiler" } -safer-ffi = { workspace = true } -[features] -headers = ["safer-ffi/headers"] [dev-dependencies] anyhow = { version = "^1.0", features = ["backtrace"] } diff --git a/libs/tokenizer/src/lib.rs b/libs/tokenizer/src/lib.rs index 9e0bfb8..d360bc0 100644 --- a/libs/tokenizer/src/lib.rs +++ b/libs/tokenizer/src/lib.rs @@ -76,6 +76,12 @@ impl From for Tokenizer { } } +impl From<&str> for Tokenizer { + fn from(value: &str) -> Self { + Self::from(value.to_string()) + } +} + impl Tokenizer { /// Consumes the tokenizer and returns the next token in the stream /// If there are no more tokens in the stream, this function returns None diff --git a/src/lib.rs b/src/lib.rs index 68a5650..e7c09ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,34 +1,58 @@ use compiler::Compiler; use parser::Parser; -use safer_ffi::ffi_export; -use std::io::BufWriter; +use std::{ + ffi::{CStr, CString}, + io::BufWriter, +}; use tokenizer::Tokenizer; -#[ffi_export] -fn compile_from_string( - input: &safer_ffi::string::String, - output: &mut safer_ffi::string::String, -) -> bool { - let mut writer = BufWriter::new(Vec::new()); +/// Takes a raw pointer to a string and compiles the `slang` code into valid IC10 +/// # Safety +/// This must be called with a valid string pointer from C# (or wherever is calling this function) +#[no_mangle] +pub unsafe extern "C" fn compile_from_string( + input_ptr: *const std::os::raw::c_char, +) -> *mut std::os::raw::c_char { + if input_ptr.is_null() { + return std::ptr::null_mut(); + } - let tokenizer = Tokenizer::from(input.to_string()); + let c_str = unsafe { CStr::from_ptr(input_ptr) }; + + let Ok(input_str) = c_str.to_str() else { + return std::ptr::null_mut(); + }; + + let mut writer = BufWriter::new(Vec::new()); + let tokenizer = Tokenizer::from(input_str); let parser = Parser::new(tokenizer); let compiler = Compiler::new(parser, &mut writer, None); let Ok(()) = compiler.compile() else { - return false; + return std::ptr::null_mut(); }; let Ok(buffer) = writer.into_inner() else { - return false; + return std::ptr::null_mut(); }; - let Ok(output_string) = String::from_utf8(buffer) else { - return false; - }; + let c_string = CString::from_vec_unchecked(buffer); - *output = output_string.into(); - - return true; + c_string.into_raw() +} + +/// Takes ownership of the string pointer and drops it, freeing the memory +/// # Safety +/// Must be called with a valid string pointer +#[no_mangle] +pub unsafe extern "C" fn free_slang_string(input_ptr: *mut std::os::raw::c_char) { + if input_ptr.is_null() { + return; + } + + unsafe { + // Takes ownership of the input string, and then drops it immediately + let _ = CString::from_raw(input_ptr); + } }