commit 19226ca82a16b81f03f42381de24347db1bd29c4 Author: Pratchaya Khansomboon Date: Mon Sep 15 16:08:41 2025 +0200 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..02fbb92 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +[*] +end_of_line = LF +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{ts,js,tsx,jsx,lua,sh}] +charset = utf-8 +indent_style = space +indent_size = 2 + +[*.{go,bb}] +indent_style = tab + +[Makefile] +indent_style = tab + +[*.{yml,json}] +indent_style = space +indent_size = 2 + +[meson.{build,options}] +indent_style = space +indent_size = 2 + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..638da72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# CMake/Meson +build* +cmake-build-* + +# IntelliJ +.idea + +# LSPs +.ccls +.ccls-cache +.cache +compile_commands.json + +# JetBrains Fleet +.fleet + +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# Visual Studio Code +.vscode + +# ImGui +imgui.ini diff --git a/hax.cpp b/hax.cpp new file mode 100644 index 0000000..ed73b4f --- /dev/null +++ b/hax.cpp @@ -0,0 +1,8 @@ +extern "C" { +#include "mod.h" +} + +auto main([[maybe_unused]]int argc, [[maybe_unused]]char const* arv[]) -> int { + run_mods(); + return 0; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..e2e50f1 --- /dev/null +++ b/meson.build @@ -0,0 +1,27 @@ +project( + 'cchax', + ['c', 'cpp'], + version : '0.1', + default_options : [ + 'warning_level=3', + 'c_std=c2x', + 'cpp_std=c++23' + ]) + +modules = static_library( + 'mods', + [ + 'mod.c', + 'mods/mod_a.c', + 'mods/mod_b.c', + ], +) + +executable( + 'hax', + [ + 'hax.cpp', + ], + link_whole: modules, + install : false +) diff --git a/mod.c b/mod.c new file mode 100644 index 0000000..dcc94cf --- /dev/null +++ b/mod.c @@ -0,0 +1,22 @@ +#include "mod.h" +#include + +extern struct mod_t __start___mod_list[]; // note: [] not single object +extern struct mod_t __stop___mod_list[]; + +static inline size_t mod_count(void) { + return (size_t)(__stop___mod_list - __start___mod_list); +} + +// mod_register(mod_begin, mod_begin); + +void run_mods(void) { + printf("Running mods! %lu\n", mod_count()); + // mod_t* first = &mod_mod_begin; + // + // mod_t* it = first + 1; + // + // it->fn(); + + // for (mod_t* it = first + 1; ieiieieieieie +} diff --git a/mod.h b/mod.h new file mode 100644 index 0000000..cd7168b --- /dev/null +++ b/mod.h @@ -0,0 +1,23 @@ +#ifndef CCHAX_MOD_H +#define CCHAX_MOD_H + +typedef int (*fn_t)(void); + +typedef struct mod_t { + char const* name; + fn_t fn; +} mod_t; + +#define mod_register(name_ref, fn_ref) \ + static struct mod_t mod_##name_ref __attribute__(( \ + used, \ + section("__mod_list"), \ + aligned(__alignof__(struct mod_t)) \ + )) = { \ + .name = #name_ref, \ + .fn = fn_ref \ + } + +void run_mods(void); + +#endif // !CCHAX_MOD_H diff --git a/mods/mod_a.c b/mods/mod_a.c new file mode 100644 index 0000000..0e48949 --- /dev/null +++ b/mods/mod_a.c @@ -0,0 +1,11 @@ +#include "mod.h" + +#include + +static int hello() { + printf("Hello, World!\n"); + return 0; +} + +mod_register(mod_a, hello); + diff --git a/mods/mod_b.c b/mods/mod_b.c new file mode 100644 index 0000000..41dcd4c --- /dev/null +++ b/mods/mod_b.c @@ -0,0 +1,12 @@ +#include "mod.h" + +#include + +static int hello() { + printf("Hello, World!\n"); + return 0; +} + +mod_register(mod_b, hello); + +