From 6e36cee9e332e724c43e9e4759151315a675b6e9 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Tue, 11 Feb 2025 16:39:17 -0500 Subject: [PATCH] was able to parse stb_sprintf.h, had to make mods to gencpp_c11.h (will eventually protogate to its repo) --- gen_c11/gen_c11.c | 28 +++---- gen_c11/gen_common.h | 14 +--- third_party/gencpp_c11/gencpp_c11.h | 118 +++++++++++++++++++--------- third_party/stb/stb_sprintf.h | 29 ++++--- 4 files changed, 121 insertions(+), 68 deletions(-) diff --git a/gen_c11/gen_c11.c b/gen_c11/gen_c11.c index 3f8a9c2..61f5316 100644 --- a/gen_c11/gen_c11.c +++ b/gen_c11/gen_c11.c @@ -28,6 +28,20 @@ int main() register_library_macros(); + gen_CodeBody tb_stb_printf_h_parsed = gen_parse_file(path_third_party "stb/stb_sprintf.h"); + gen_CodeBody tb_stb_printf_header = gen_def_body(CT_Global_Body); + gen_CodeBody tb_stb_printf_source = gen_def_body(CT_Global_Body); + + for (gen_Code stb_code = gen_iterator(CodeBody, tb_stb_printf_h_parsed, stb_code)) switch(stb_code->Type) + { + case CT_Preprocess_Define: + { + + } + break; + + } + gen_Str generation_notice = lit( "// This file was generated automatially by metadesk's gen_c11.c " "(See: https://github.com/Ed94/metadesk/tree/master)\n\n" @@ -348,20 +362,6 @@ int main() if (GENERATE_SEGEREGATED) { - gen_CodeBody tb_stb_printf_h_parsed = gen_parse_file(path_third_party "stb/stb_sprintf.h"); - gen_CodeBody tb_stb_printf_header = gen_def_body(CT_Global_Body); - gen_CodeBody tb_stb_printf_source = gen_def_body(CT_Global_Body); - - for (gen_Code stb_code = gen_iterator(CodeBody, tb_stb_printf_h_parsed, stb_code)) switch(stb_code->Type) - { - case CT_Preprocess_Define: - { - - } - break; - - } - // Dependencies #define builder header_deps diff --git a/gen_c11/gen_common.h b/gen_c11/gen_common.h index 39b4a09..8d894ae 100644 --- a/gen_c11/gen_common.h +++ b/gen_c11/gen_common.h @@ -69,21 +69,15 @@ void register_library_macros() // third_party/stb/stb_sprintf.h gen_register_macros( args( ((gen_Macro) { lit("STB_SPRINTF_H_INCLUDE"), MT_Statement, }), - ((gen_Macro) { lit("STBSP__ASAN"), MT_Statement, }), + ((gen_Macro) { lit("STBSP__ASAN"), MT_Statement, MF_Allow_As_Attribute }), ((gen_Macro) { lit("STBSP__PUBLICDEC"), MT_Statement, MF_Allow_As_Attribute }), ((gen_Macro) { lit("STBSP__ATTRIBUTE_FORMAT"), MT_Statement, MF_Functional | MF_Allow_As_Attribute }), ((gen_Macro) { lit("STBSP__NOTUSED"), MT_Expression, MF_Functional | MF_Allow_As_Attribute }), ((gen_Macro) { lit("STBSP__NOTUSED"), MT_Expression, MF_Functional }), - ((gen_Macro) { lit("STB_SPRINTF_MIN"), MT_Expression, MF_Allow_As_Identifier }), + ((gen_Macro) { lit("STB_SPRINTF_MIN"), MT_Expression, MF_Allow_As_Identifier }), ((gen_Macro) { lit("STB_SPRINTF_DECORATE"), MT_Expression, MF_Functional | MF_Allow_As_Identifier }), - ((gen_Macro) { lit("stbsp__uint32"), MT_Expression, }), - ((gen_Macro) { lit("stbsp__int32"), MT_Expression, }), - ((gen_Macro) { lit("stbsp__uint64"), MT_Expression, }), - ((gen_Macro) { lit("stbsp__int64"), MT_Expression, }), - ((gen_Macro) { lit("stbsp__uint16"), MT_Expression, }), - ((gen_Macro) { lit("stbsp__uintptr"), MT_Expression, }), ((gen_Macro) { lit("STB_SPRINTF_MSVC_MODE"), MT_Expression, }), - ((gen_Macro) { lit("STBSP__PUBLICDEF"), MT_Expression, }), + ((gen_Macro) { lit("STBSP__PUBLICDEF"), MT_Statement, MF_Allow_As_Attribute }), ((gen_Macro) { lit("STBSP__UNALIGNED"), MT_Expression, MF_Functional }), ((gen_Macro) { lit("STBSP__SPECIAL"), MT_Expression, }), ((gen_Macro) { lit("STBSP__LEFTJUST"), MT_Expression, }), @@ -105,7 +99,7 @@ void register_library_macros() ((gen_Macro) { lit("stbsp__cb_buf_clamp"), MT_Expression, MF_Functional }), ((gen_Macro) { lit("STBSP__NUMSZ"), MT_Expression, }), ((gen_Macro) { lit("STBSP__COPYFP"), MT_Expression, MF_Functional }), - ((gen_Macro) { lit("stbsp__tento19th"), MT_Expression, MF_Functional }), + ((gen_Macro) { lit("stbsp__tento19th"), MT_Expression, }), ((gen_Macro) { lit("stbsp__ddmulthi"), MT_Expression, MF_Functional }), ((gen_Macro) { lit("stbsp__ddrenorm"), MT_Expression, MF_Functional }), ((gen_Macro) { lit("stbsp__ddmultlo"), MT_Expression, MF_Functional }), diff --git a/third_party/gencpp_c11/gencpp_c11.h b/third_party/gencpp_c11/gencpp_c11.h index fd62485..0d87d2d 100644 --- a/third_party/gencpp_c11/gencpp_c11.h +++ b/third_party/gencpp_c11/gencpp_c11.h @@ -9508,6 +9508,9 @@ struct gen_Context gen_u32 InitSize_LexerTokens; gen_u32 SizePer_StringArena; + gen_u32 InitSize_StrCacheTable; + gen_u32 InitSize_MacrosTable; + // TODO(Ed): Symbol Table // Keep track of all resolved symbols (naemspaced identifiers) @@ -17745,6 +17748,15 @@ void gen_init(gen_Context* ctx) ctx->InitSize_Fallback_Allocator_Bucket_Size = gen_megabytes(8); } + if (ctx->InitSize_StrCacheTable == 0) + { + ctx->InitSize_StrCacheTable = gen_kilobytes(8); + } + if (ctx->InitSize_MacrosTable == 0) + { + ctx->InitSize_MacrosTable = gen_kilobytes(8); + } + // Override the current context (user has to put it back if unwanted). gen__ctx = ctx; @@ -17773,11 +17785,11 @@ void gen_init(gen_Context* ctx) } // Setup the gen_hash tables { - ctx->StrCache = gen_hashtable_init(gen_StrCached, ctx->Allocator_DyanmicContainers); + ctx->StrCache = gen_hashtable_init_reserve(gen_StrCached, ctx->Allocator_DyanmicContainers, ctx->InitSize_StrCacheTable); if (ctx->StrCache.Entries == gen_nullptr) GEN_FATAL("gen::gen_init: Failed to initialize the StringCache"); - ctx->Macros = gen_hashtable_init(gen_Macro, ctx->Allocator_DyanmicContainers); + ctx->Macros = gen_hashtable_init_reserve(gen_Macro, ctx->Allocator_DyanmicContainers, ctx->InitSize_MacrosTable); if (ctx->Macros.Hashes == gen_nullptr || ctx->Macros.Entries == gen_nullptr) { GEN_FATAL("gen::gen_init: Failed to initialize the PreprocessMacros table"); @@ -23636,22 +23648,33 @@ gen_internal inline gen_CodeFn gen_parse_function_after_name( eat(Tok_Number); // ( ) = 0 } - gen_Token stmt_end = currtok; - eat(Tok_Statement_End); - - if (currtok_noskip.Type == Tok_Comment && currtok_noskip.Line == stmt_end.Line) - inline_cmt = gen_parse_comment(); - // ( ) ; } - else + + if (body == gen_nullptr) { + // Check for trailing specifiers... + gen_CodeAttributes post_rt_attributes = gen_parse_attributes(); + if (post_rt_attributes) + { + if (attributes) + { + gen_StrBuilder merged = gen_strbuilder_fmt_buf(gen__ctx->Allocator_Temp, "%S %S", attributes->Content, post_rt_attributes->Content); + attributes->Content = gen_cache_str(gen_strbuilder_to_str(merged)); + } + else + { + attributes = post_rt_attributes; + } + } + // ( ) + gen_Token stmt_end = currtok; eat(Tok_Statement_End); - // ( ) ; + // ( ) < = 0 or delete > ; if (currtok_noskip.Type == Tok_Comment && currtok_noskip.Line == stmt_end.Line) inline_cmt = gen_parse_comment(); - // ( ) ; + // ( ) < = 0 or delete > ; } gen_StrBuilder name_stripped = gen_strbuilder_make_str(gen__ctx->Allocator_Temp, name.Text); @@ -24223,8 +24246,16 @@ gen_internal gen_Token gen_parse_identifier(bool* possible_member_function) // Typename can be: '::' // If that is the case first option will be Tok_Access_StaticSymbol below - if (check(Tok_Identifier) || accept_as_identifier) - eat(Tok_Identifier); + if (check(Tok_Identifier) || accept_as_identifier) + { + if (macro) { + gen_Code name_macro = gen_parse_simple_preprocess(currtok.Type); + name.Text.Len = ( ( gen_sptr )prevtok.Text.Ptr + prevtok.Text.Len ) - ( gen_sptr )name.Text.Ptr; + } + else { + eat(Tok_Identifier); + } + } // gen_parse_template_args(&name); @@ -26908,32 +26939,49 @@ gen_internal gen_CodeTypename gen_parser_parse_type(bool from_template, bool* ge // All kinds of nonsense can makeup a type signature, first we check for a in-place definition of a class, enum, struct, or union else if (currtok.Type == Tok_Decl_Class || currtok.Type == Tok_Decl_Enum || currtok.Type == Tok_Decl_Struct || currtok.Type == Tok_Decl_Union) { - switch (currtok.Type) + gen_Token next = nexttok; + + // names are optional if its an inplace + if (next.Type == Tok_Identifier) { - case Tok_Decl_Class: - tag = Tag_Class; - break; - case Tok_Decl_Enum: - tag = Tag_Enum; - break; - case Tok_Decl_Struct: - tag = Tag_Struct; - break; - case Tok_Decl_Union: - tag = Tag_Union; - break; - default: - break; + switch (currtok.Type) + { + case Tok_Decl_Class: + tag = Tag_Class; + break; + case Tok_Decl_Enum: + tag = Tag_Enum; + break; + case Tok_Decl_Struct: + tag = Tag_Struct; + break; + case Tok_Decl_Union: + tag = Tag_Union; + break; + default: + break; + } + eat(currtok.Type); + // + + name = gen_parse_identifier(gen_nullptr); + // } - eat(currtok.Type); - // + else if (next.Type == Tok_BraceCurly_Open) + { + name = currtok; + // We have an inplace definition, we need to consume that... - name = gen_parse_identifier(gen_nullptr); + // TODO(Ed): we need to add a way for AST_CodeTypename to track an implace definition.. + gen_b32 const inplace = true; + gen_Code indplace_def = gen_cast(gen_Code, gen_parser_parse_struct(inplace)); - // name.Length = ( ( gen_sptr )currtok.Text + currtok.Length ) - ( gen_sptr )name.Text; - // eat( Tok_Identifier ); - gen__ctx->parser.Scope->Name = name.Text; - // + // For now we lose the structural information, + name.Text.Len = ( ( gen_sptr )prevtok.Text.Ptr + prevtok.Text.Len ) - ( gen_sptr )name.Text.Ptr; + // eat( Tok_Identifier ); + gen__ctx->parser.Scope->Name = name.Text; + // + } } // Decltype draft implementation diff --git a/third_party/stb/stb_sprintf.h b/third_party/stb/stb_sprintf.h index 7fa753e..48b9655 100644 --- a/third_party/stb/stb_sprintf.h +++ b/third_party/stb/stb_sprintf.h @@ -229,23 +229,34 @@ STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char peri #ifdef STB_SPRINTF_IMPLEMENTATION -#define stbsp__uint32 unsigned int -#define stbsp__int32 signed int +// NOTE(Ed): Modifying because I don't want to introduce this kind of mess to the gencpp parser + +// #define stbsp__uint32 unsigned int +// #define stbsp__int32 signed int +typedef unsigned int stbsp__uint32; +typedef signed int stbsp__int32; #ifdef _MSC_VER -# define stbsp__uint64 unsigned __int64 -# define stbsp__int64 signed __int64 +// # define stbsp__uint64 unsigned __int64 +// # define stbsp__int64 signed __int64 +typedef unsigned __int64 stbsp__uint64; +typedef signed __int64 stbsp__int64; #else -# define stbsp__uint64 unsigned long long -# define stbsp__int64 signed long long +// # define stbsp__uint64 unsigned long long +// # define stbsp__int64 signed long long +typedef unsigned long long stbsp__uint64; +typedef signed long long stbsp__int64; #endif -#define stbsp__uint16 unsigned short +// #define stbsp__uint16 unsigned short +typedef unsigned short stbsp__uint16; #ifndef stbsp__uintptr # if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) -# define stbsp__uintptr stbsp__uint64 +// # define stbsp__uintptr stbsp__uint64 + typedef stbsp__uint64 stbsp__uintptr; # else -# define stbsp__uintptr stbsp__uint32 +// # define stbsp__uintptr stbsp__uint32 + typedef stbsp__uint32 stbsp__uintptr; # endif #endif