Compare commits
No commits in common. "b9e26418ad5df483f6fd9ce5a533e4c3f8286cf5" and "7d1a41aca9e6a173ec502b595625bb1d3bc6548d" have entirely different histories.
b9e26418ad
...
7d1a41aca9
11
Cargo.toml
11
Cargo.toml
|
@ -23,6 +23,11 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
trixy-parser = { path = "./trixy-parser" }
|
convert_case = "0.6.0"
|
||||||
trixy-macros = { path = "./trixy-macros" }
|
log = "0.4.20"
|
||||||
trixy-types = { path = "./trixy-types" }
|
proc-macro2 = "1.0.70"
|
||||||
|
quote = "1.0.33"
|
||||||
|
syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing"] }
|
||||||
|
thiserror = "1.0.51"
|
||||||
|
# trixy-lang_parser = { path = "./trixy-lang_parser" }
|
||||||
|
# trixy-macros = { path = "./trixy-macros" }
|
||||||
|
|
47
src/lib.rs
47
src/lib.rs
|
@ -1,7 +1,44 @@
|
||||||
pub mod types {
|
/*
|
||||||
pub use trixy_types::*;
|
* Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
||||||
}
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
pub mod macros {
|
//! Trixy contains the types used by the [trixy-macros] crate to provide ffi safe types
|
||||||
pub use trixy_macros::*;
|
use std::{ffi::c_char, ops::Deref};
|
||||||
|
|
||||||
|
use proc_macro2::TokenStream;
|
||||||
|
use quote::quote;
|
||||||
|
|
||||||
|
pub mod error;
|
||||||
|
pub mod traits;
|
||||||
|
|
||||||
|
// NOTE(@soispha): All types specified here *MUST* be include in the BASE_TYPES constant, otherwise
|
||||||
|
// they are not usable from Trixy code <2023-12-25>
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct String(*const c_char);
|
||||||
|
|
||||||
|
/// These are the "primitive" types used in Trixy, you can use any of them to create new structures
|
||||||
|
pub const BASE_TYPES: [&'static str; 2] = ["String", "u8"];
|
||||||
|
|
||||||
|
pub fn to_c_name<T: Deref<Target = str>>(rust_type: T) -> TokenStream {
|
||||||
|
match &*rust_type {
|
||||||
|
"String" => quote!(const char*),
|
||||||
|
other => panic! {"'{}' is not a vaild type name!", other},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "trixy-parser"
|
name = "trixy-lang_parser"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ edition = "2021"
|
||||||
clap = { version = "4.4.11", features = ["derive"], optional = true }
|
clap = { version = "4.4.11", features = ["derive"], optional = true }
|
||||||
convert_case = "0.6.0"
|
convert_case = "0.6.0"
|
||||||
thiserror = "1.0.50"
|
thiserror = "1.0.50"
|
||||||
trixy-types = { path = "../trixy-types" }
|
trixy = { path = "../../trixy" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
pretty_assertions = "1.4.0"
|
pretty_assertions = "1.4.0"
|
|
@ -23,6 +23,5 @@
|
||||||
|
|
||||||
// an empty comment:
|
// an empty comment:
|
||||||
//
|
//
|
||||||
// an empty doc comment:
|
|
||||||
///
|
//
|
||||||
nasp test {}
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::{fs, process::exit};
|
use std::{fs, process::exit};
|
||||||
|
|
||||||
use trixy_lang_parser::{lexing::TokenStream, parse_trixy_lang};
|
use trixy_lang_parser::{lexing::TokenStream, parse_trixy_lang};
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! This module contains the already type checked types.
|
//! This module contains the already type checked types.
|
||||||
|
|
||||||
use std::fmt::{Display, Write};
|
use std::fmt::{Display, Write};
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub mod checked;
|
pub mod checked;
|
||||||
pub mod unchecked;
|
pub mod unchecked;
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! This module contains the not type checked types.
|
//! This module contains the not type checked types.
|
||||||
//! These are generated on the first pass of the parser, to be later converted into the checked
|
//! These are generated on the first pass of the parser, to be later converted into the checked
|
||||||
//! ones.
|
//! ones.
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::{error::Error, fmt::Display};
|
use std::{error::Error, fmt::Display};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
use self::{error::SpannedLexingError, tokenizer::Tokenizer};
|
use self::{error::SpannedLexingError, tokenizer::Tokenizer};
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use crate::lexing::{Keyword, Token, TokenKind, TokenSpan};
|
use crate::lexing::{Keyword, Token, TokenKind, TokenSpan};
|
||||||
|
|
||||||
use super::TokenStream;
|
use super::TokenStream;
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// This code is heavily inspired by: https://michael-f-bryan.github.io/static-analyser-in-rust/book/lex.html
|
// This code is heavily inspired by: https://michael-f-bryan.github.io/static-analyser-in-rust/book/lex.html
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -167,10 +170,10 @@ fn tokenize_comment(text: &str) -> Result<(TokenKind, usize), LexingError> {
|
||||||
} else {
|
} else {
|
||||||
let text: &str = &text[2..];
|
let text: &str = &text[2..];
|
||||||
if let Some('/') = text.chars().next() {
|
if let Some('/') = text.chars().next() {
|
||||||
let text = &text[1..];
|
|
||||||
if end_of_line(&text) {
|
if end_of_line(&text) {
|
||||||
Ok((TokenKind::DocComment("".to_owned()), 1 + 3))
|
Ok((TokenKind::DocComment("".to_owned()), 1 + 3))
|
||||||
} else {
|
} else {
|
||||||
|
let text = &text[1..];
|
||||||
let (doc_comment, chars_read) = take_while(text, |ch| ch != '\n' && ch != '\r')?;
|
let (doc_comment, chars_read) = take_while(text, |ch| ch != '\n' && ch != '\r')?;
|
||||||
|
|
||||||
// trim whitespace
|
// trim whitespace
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use error::TrixyError;
|
use error::TrixyError;
|
||||||
|
|
||||||
use crate::lexing::TokenStream;
|
use crate::lexing::TokenStream;
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use std::{error::Error, fmt::Display};
|
use std::{error::Error, fmt::Display};
|
|
@ -18,10 +18,13 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use trixy_types::BASE_TYPES;
|
use trixy::BASE_TYPES;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
command_spec::{
|
command_spec::{
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use crate::command_spec::checked::{
|
use crate::command_spec::checked::{
|
||||||
Attribute, CommandSpec, DocIdentifier, DocNamedType, Enumeration, Function, Identifier,
|
Attribute, CommandSpec, DocIdentifier, DocNamedType, Enumeration, Function, Identifier,
|
||||||
NamedType, Namespace, Structure, Type,
|
NamedType, Namespace, Structure, Type,
|
|
@ -18,5 +18,8 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub mod checked;
|
pub mod checked;
|
||||||
pub mod unchecked;
|
pub mod unchecked;
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::{error::Error, fmt::Display};
|
use std::{error::Error, fmt::Display};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
|
@ -28,5 +28,5 @@ prettyplease = "0.2.15"
|
||||||
proc-macro2 = "1.0.70"
|
proc-macro2 = "1.0.70"
|
||||||
quote = "1.0.33"
|
quote = "1.0.33"
|
||||||
syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing"] }
|
syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing"] }
|
||||||
trixy-parser = { path = "../trixy-parser" }
|
trixy-lang_parser = { path = "../trixy-lang_parser" }
|
||||||
trixy-types = { path = "../trixy-types" }
|
trixy = { path = "../../trixy" }
|
||||||
|
|
|
@ -3,9 +3,5 @@
|
||||||
/result
|
/result
|
||||||
/dist
|
/dist
|
||||||
|
|
||||||
# C stuff
|
|
||||||
*.d
|
|
||||||
*.o
|
|
||||||
|
|
||||||
# This crate is a library
|
# This crate is a library
|
||||||
Cargo.lock
|
Cargo.lock
|
||||||
|
|
|
@ -23,14 +23,13 @@ version = "0.0.0"
|
||||||
publish = false
|
publish = false
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# [lib]
|
[lib]
|
||||||
# crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
trixy = { path = "../../../../trixy" }
|
trixy = { path = "../../../../trixy" }
|
||||||
env_logger = { version = "0.10.1" }
|
env_logger = { version = "0.10.1" }
|
||||||
log = "0.4.20"
|
log = "0.4.20"
|
||||||
libloading = "0.8.1"
|
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
trixy-macros = {path = "../../../trixy-macros"}
|
trixy-macros = {path = "../../../trixy-macros"}
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
PREFIX := /usr/local
|
|
||||||
BINPREFIX := $(DESTDIR)$(PREFIX)/bin
|
|
||||||
MANPREFIX := $(DESTDIR)$(PREFIX)/share/man/man1
|
|
||||||
|
|
||||||
BIN_NAME := libmain.so
|
|
||||||
|
|
||||||
SRC := $(wildcard c_src/*.c)
|
|
||||||
OBJ := $(SRC:.c=.o)
|
|
||||||
DEP := $(OBJ:.o=.d)
|
|
||||||
|
|
||||||
LIBS := main-example
|
|
||||||
|
|
||||||
ALL_CFLAGS := -fPIC -O3 -MMD -Wall -Wextra -Wno-unused-parameter $(CFLAGS) $(CPPFLAGS)
|
|
||||||
ALL_LDFLAGS := -shared $(addprefix -l,$(LIBS)) -L $(LD_LIBRARY_PATH) $(CFLAGS) $(LDFLAGS)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$(BIN_NAME): $(OBJ)
|
|
||||||
$(CC) -o $@ $+ $(ALL_LDFLAGS)
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
$(CC) -o $@ $< -c $(ALL_CFLAGS)
|
|
||||||
|
|
||||||
.PHONY : clean options
|
|
||||||
options:
|
|
||||||
@echo "CC = $(CC)"
|
|
||||||
@echo "CFLAGS = $(ALL_CFLAGS)"
|
|
||||||
@echo "LDFLAGS = $(ALL_LDFLAGS)"
|
|
||||||
@echo "SRC = $(SRC)"
|
|
||||||
@echo "OBJ = $(OBJ)"
|
|
||||||
@echo "DEP = $(DEP)"
|
|
||||||
@echo ""
|
|
||||||
|
|
||||||
clean :
|
|
||||||
rm $(BIN_NAME) $(OBJ) $(DEP)
|
|
|
@ -18,10 +18,10 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
use trixy_macros::config::TrixyConfig;
|
use trixy_macros::config::TrixyConfig;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("cargo:rustc-link-arg=--relocatable");
|
|
||||||
println!("cargo:rerun-if-changed=./src/api.tri");
|
println!("cargo:rerun-if-changed=./src/api.tri");
|
||||||
TrixyConfig::new("callback")
|
TrixyConfig::new("callback")
|
||||||
.trixy_path("./src/api.tri")
|
.trixy_path("./src/api.tri")
|
||||||
|
|
|
@ -1,37 +1,35 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu,
|
* Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
||||||
* antifallobst@systemausfall.org>
|
*
|
||||||
*
|
* This file is part of the Trixy crate for Trinitrix.
|
||||||
* This file is part of the Trixy crate for Trinitrix.
|
*
|
||||||
*
|
* Trixy is free software: you can redistribute it and/or modify
|
||||||
* Trixy is free software: you can redistribute it and/or modify
|
* it under the terms of the Lesser GNU General Public License as
|
||||||
* it under the terms of the Lesser GNU General Public License as
|
* published by the Free Software Foundation, either version 3 of
|
||||||
* published by the Free Software Foundation, either version 3 of
|
* the License, or (at your option) any later version.
|
||||||
* the License, or (at your option) any later version.
|
*
|
||||||
*
|
* This program is distributed in the hope that it will be useful,
|
||||||
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
||||||
* GNU General Public License for more details.
|
*
|
||||||
*
|
* You should have received a copy of the GNU General Public License
|
||||||
* You should have received a copy of the GNU General Public License
|
* and the Lesser GNU General Public License along with this program.
|
||||||
* and the Lesser GNU General Public License along with this program.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../dist/interface.h"
|
#include "../dist/interface.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int two;
|
||||||
|
} a_t;
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
// You can simply call functions ..
|
|
||||||
fn_alone("hi");
|
fn_alone("hi");
|
||||||
|
|
||||||
// .. but they check their inputs:
|
|
||||||
// This call for example will fail, as a null pointer isn't supported.
|
|
||||||
//
|
|
||||||
// A error will be signaled by a 0 return code, then the error can be obtained
|
|
||||||
// with the `last_error_length` and `last_error_message` functions
|
|
||||||
if (!fn_alone(0x0)) {
|
if (!fn_alone(0x0)) {
|
||||||
int error_length = last_error_length();
|
int error_length = last_error_length();
|
||||||
char *error = malloc(error_length);
|
char *error = malloc(error_length);
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
/home/soispha/repos/rust/trinitrix/trixy/trixy-lang_parser/example/full.tri
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
macro_rules! callback {
|
||||||
|
($cmd:expr) => {{
|
||||||
|
println!("{:#?}", $cmd);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/api.rs"));
|
|
@ -18,21 +18,8 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::ffi::c_int;
|
|
||||||
macro_rules! callback {
|
|
||||||
($cmd:expr) => {{
|
|
||||||
println!("{:#?}", $cmd);
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/api.rs"));
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let out = unsafe {
|
let input = include_str!(concat!(env!("OUT_DIR"), "/interface.h"));
|
||||||
let lib = libloading::Library::new("./libmain.so").unwrap();
|
println!("{}", input);
|
||||||
let func: libloading::Symbol<unsafe extern "C" fn() -> c_int> = lib.get(b"main").unwrap();
|
|
||||||
func()
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(out, 0);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! This module is responsible for the config passed to trixy.
|
//! This module is responsible for the config passed to trixy.
|
||||||
//! It works using the popular builder syntax:
|
//! It works using the popular builder syntax:
|
||||||
//! ```no_run
|
//! ```no_run
|
||||||
|
@ -31,7 +34,7 @@
|
||||||
//!# }
|
//!# }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Language {
|
pub enum Language {
|
||||||
|
|
|
@ -18,13 +18,14 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//! This module generates the c header
|
//! This module generates the c header
|
||||||
//! It works by firstly listing the functions and then by grouping them into structures, effectively
|
//! It works by firstly listing the functions and then by grouping them into structures, effectively
|
||||||
//! simulating namespaces in c.
|
//! simulating namespaces in c.
|
||||||
|
|
||||||
use proc_macro2::TokenStream as TokenStream2;
|
use proc_macro2::{Ident, Punct, Spacing, TokenStream as TokenStream2};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use trixy_parser::command_spec::{
|
use trixy_lang_parser::command_spec::{
|
||||||
Attribute, CommandSpec, Function, Identifier, NamedType, Namespace,
|
Attribute, CommandSpec, Function, Identifier, NamedType, Namespace,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,7 +122,7 @@ pub fn generate(trixy: &CommandSpec, _config: &TrixyConfig) -> String {
|
||||||
format!(
|
format!(
|
||||||
"{}\n\n{}\n\n{}\n{}\n{}\n{}\n\n{}",
|
"{}\n\n{}\n\n{}\n{}\n{}\n{}\n\n{}",
|
||||||
BEGIN_HEADER_GUARD,
|
BEGIN_HEADER_GUARD,
|
||||||
trixy_types::traits::errno::ERROR_FUNCTIONS,
|
trixy::traits::errno::ERROR_FUNCTIONS,
|
||||||
functions,
|
functions,
|
||||||
namespaces,
|
namespaces,
|
||||||
type_defs,
|
type_defs,
|
||||||
|
@ -153,7 +154,7 @@ fn attribute_to_doc_comment(attribute: &Attribute) -> String {
|
||||||
fn named_type_to_c(named_type: &NamedType) -> TokenStream2 {
|
fn named_type_to_c(named_type: &NamedType) -> TokenStream2 {
|
||||||
let ident = identifier_to_rust(&named_type.name);
|
let ident = identifier_to_rust(&named_type.name);
|
||||||
let r#type = type_to_rust(&named_type.r#type);
|
let r#type = type_to_rust(&named_type.r#type);
|
||||||
let c_type = trixy_types::to_c_name(r#type.to_string());
|
let c_type = trixy::to_c_name(r#type.to_string());
|
||||||
quote! {
|
quote! {
|
||||||
#c_type #ident
|
#c_type #ident
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use proc_macro2::TokenStream as TokenStream2;
|
use proc_macro2::TokenStream as TokenStream2;
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use trixy_parser::command_spec::{CommandSpec, Function, Identifier, NamedType, Namespace};
|
use trixy_lang_parser::command_spec::{CommandSpec, Function, Identifier, NamedType, Namespace};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
config::TrixyConfig,
|
config::TrixyConfig,
|
||||||
|
|
|
@ -18,9 +18,10 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
use proc_macro2::Ident;
|
use proc_macro2::Ident;
|
||||||
use quote::format_ident;
|
use quote::format_ident;
|
||||||
use trixy_parser::command_spec::{Function, Identifier};
|
use trixy_lang_parser::command_spec::{Function, Identifier};
|
||||||
|
|
||||||
pub mod header;
|
pub mod header;
|
||||||
pub mod host;
|
pub mod host;
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! This module is responsible for generating the rust code used to interface with the api.
|
//! This module is responsible for generating the rust code used to interface with the api.
|
||||||
//! That includes the structs and enums declared in the trixy file and the enum used to describe the
|
//! That includes the structs and enums declared in the trixy file and the enum used to describe the
|
||||||
//! command being executed.
|
//! command being executed.
|
||||||
|
@ -27,7 +30,7 @@ use std::cell::OnceCell;
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use proc_macro2::TokenStream as TokenStream2;
|
use proc_macro2::TokenStream as TokenStream2;
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use trixy_parser::command_spec::{
|
use trixy_lang_parser::command_spec::{
|
||||||
Attribute, CommandSpec, DocIdentifier, DocNamedType, Enumeration, Function, Namespace,
|
Attribute, CommandSpec, DocIdentifier, DocNamedType, Enumeration, Function, Namespace,
|
||||||
Structure,
|
Structure,
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,9 +18,12 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use proc_macro2::TokenStream as TokenStream2;
|
use proc_macro2::TokenStream as TokenStream2;
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use trixy_parser::command_spec::{CommandSpec, Identifier, NamedType, Type};
|
use trixy_lang_parser::command_spec::{CommandSpec, Identifier, NamedType, Type};
|
||||||
|
|
||||||
use crate::config::TrixyConfig;
|
use crate::config::TrixyConfig;
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,12 @@
|
||||||
* If not, see <https://www.gnu.org/licenses/>.
|
* If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
use std::{env, fs, io::Write, path::PathBuf, process::Command};
|
use std::{env, fs, io::Write, path::PathBuf, process::Command};
|
||||||
|
|
||||||
use trixy_parser::parse_trixy_lang;
|
use trixy_lang_parser::parse_trixy_lang;
|
||||||
|
|
||||||
use crate::config::TrixyConfig;
|
use crate::config::TrixyConfig;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
# build
|
|
||||||
/target
|
|
||||||
/result
|
|
||||||
|
|
||||||
# This crate is a library
|
|
||||||
Cargo.lock
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
[package]
|
|
||||||
name = "trixy-types"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
convert_case = "0.6.0"
|
|
||||||
log = "0.4.20"
|
|
||||||
proc-macro2 = "1.0.70"
|
|
||||||
quote = "1.0.33"
|
|
||||||
syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing"] }
|
|
||||||
thiserror = "1.0.51"
|
|
|
@ -1,55 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2023 The Trinitrix Project <soispha@vhack.eu, antifallobst@systemausfall.org>
|
|
||||||
*
|
|
||||||
* 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 <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//! Trixy contains the types used by the [trixy-macros] crate to provide ffi safe types
|
|
||||||
use std::{ffi::c_char, ops::Deref};
|
|
||||||
|
|
||||||
use proc_macro2::TokenStream;
|
|
||||||
use quote::quote;
|
|
||||||
|
|
||||||
pub mod error;
|
|
||||||
pub mod traits;
|
|
||||||
|
|
||||||
// NOTE(@soispha): All types specified here *MUST* be include in the BASE_TYPES constant, otherwise
|
|
||||||
// they are not usable from Trixy code <2023-12-25>
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct String(*const c_char);
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct Vec<T>(*const T);
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct Function(*const usize);
|
|
||||||
|
|
||||||
pub type Option<T> = std::option::Option<T>;
|
|
||||||
|
|
||||||
/// These are the "primitive" types used in Trixy, you can use any of them to create new structures
|
|
||||||
pub const BASE_TYPES: [&'static str; 4] = ["String", "Vec", "Option", "Function"];
|
|
||||||
|
|
||||||
pub fn to_c_name<T: Deref<Target = str>>(rust_type: T) -> TokenStream {
|
|
||||||
match &*rust_type {
|
|
||||||
"String" => quote!(const char*),
|
|
||||||
"Vec" => quote!(const char**),
|
|
||||||
// TODO(@soispha): This should show that it's optional <2023-12-25>
|
|
||||||
"Option<String>" => quote!(const char*),
|
|
||||||
other => panic! {"'{}' is not a vaild type name!", other},
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue