From 3f5b9c0bc80ebf7575574760bcd73eea3381d93e Mon Sep 17 00:00:00 2001 From: Pihkaal Date: Thu, 22 Jan 2026 17:58:25 +0100 Subject: [PATCH] feat: generate C struct info --- src/main.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 965dad1..b3d5185 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -118,6 +119,35 @@ void print_struct(Struct_Info info) { printf("]\n"); } +#define gen(...) do { \ + fprintf(stream, __VA_ARGS__); \ + fprintf(stream, " // %s:%d\n", __FILE__, __LINE__); \ + } while(0) + +char* to_lowercase(char* str) { + size_t len = strlen(str); + for(size_t i = 0; i < len; i += 1) { + str[i] = tolower(str[i]); + } + return str; +} + +void generate_struct_info(FILE* stream, Struct_Info info) { + char* lowercase_name = to_lowercase(strdup(info.name)); + + gen("static Struct_Info %s_info = {", lowercase_name); + gen(" .name = \"%s\",", info.name); + gen(" .fields_count = %zu,", info.fields_count); + gen(" .fields = (Field_Info[%zu]) {", info.fields_count); + for (size_t i = 0; i < info.fields_count; i += 1) { + gen(" { .type = \"%s\", .name = \"%s\" },", info.fields[i].type, info.fields[i].name); + } + gen(" },"); + gen("};"); + + free(lowercase_name); +} + int main(void) { const char *source = "typedef struct { int int_field; bool bool_field; } My_Struct;"; @@ -126,8 +156,10 @@ int main(void) Struct_Info info = {0}; if (!parse_struct(&info)) return 1; - + printf("--- Parsed ------------\n"); print_struct(info); + printf("--- Generated ---------\n"); + generate_struct_info(stdout, info); return 0; }