fixes for c library

This commit is contained in:
2024-12-15 22:53:32 -05:00
parent 980d1d7134
commit c90c210e04
24 changed files with 244 additions and 92 deletions

View File

@ -1036,12 +1036,24 @@ void specifiers_to_strbuilder_ref( CodeSpecifiers self, StrBuilder* result )
GEN_ASSERT(result);
s32 idx = 0;
s32 left = self->NumEntries;
while ( left-- )
while ( left -- )
{
Str spec = spec_to_str( self->ArrSpecs[idx] );
strbuilder_append_fmt( result, "%.*s ", spec.Len, spec.Ptr );
Specifier spec = self->ArrSpecs[idx];
Str spec_str = spec_to_str( spec );
if ( idx > 0 ) switch (spec) {
case Spec_Ptr:
case Spec_Ref:
case Spec_RValue:
break;
default:
strbuilder_append_str(result, txt(" "));
break;
}
strbuilder_append_fmt( result, "%S", spec_str );
idx++;
}
strbuilder_append_str(result, txt(" "));
}
StrBuilder struct_to_strbuilder(CodeStruct self)
@ -1445,7 +1457,7 @@ void var_to_strbuilder_ref(CodeVar self, StrBuilder* result )
strbuilder_append_fmt( result, "%SB ", attributes_to_strbuilder(self->Attributes) );
if ( self->Specs )
strbuilder_append_fmt( result, "%SB\n", specifiers_to_strbuilder(self->Specs) );
strbuilder_append_fmt( result, "%SB", specifiers_to_strbuilder(self->Specs) );
strbuilder_append_fmt( result, "%SB %S", typename_to_strbuilder(self->ValueType), self->Name );

View File

@ -503,7 +503,7 @@ void register_macros( s32 num, ... )
va_end(va);
}
void register_macros( s32 num, Macro* macros )
void register_macros_arr( s32 num, Macro* macros )
{
GEN_ASSERT(num > 0);
do

View File

@ -93,6 +93,9 @@ struct Context
// TODO(Ed): Active parse context vs a parse result need to be separated conceptually
ParseContext parser;
// TODO(Ed): Formatting - This will eventually be in a separate struct when in the process of serialization of the builder.
s32 temp_serialize_indent;
};
// Initialize the library. There first ctx initialized must exist for lifetime of other contextes that come after as its the one that
@ -121,7 +124,11 @@ GEN_API void register_macro( Macro macro );
// Ease of use batch registration
GEN_API void register_macros( s32 num, ... );
GEN_API void register_macros( s32 num, Macro* macros );
GEN_API void register_macros_arr( s32 num, Macro* macros );
#if GEN_COMPILER_CPP
forceinline void register_macros( s32 num, Macro* macros ) { return register_macros_arr(num, macros); }
#endif
// Used internally to retrive or make string allocations.
// Strings are stored in a series of string arenas of fixed size (SizePer_StringArena)
@ -276,30 +283,45 @@ GEN_API CodeBody def_body( CodeType type );
// There are two options for defining a struct body, either varadically provided with the args macro to auto-deduce the arg num,
/// or provide as an array of Code objects.
GEN_API CodeBody def_class_body ( s32 num, ... );
GEN_API CodeBody def_class_body ( s32 num, Code* codes );
GEN_API CodeDefineParams def_define_params ( s32 num, ... );
GEN_API CodeDefineParams def_define_params ( s32 num, CodeDefineParams* codes );
GEN_API CodeBody def_enum_body ( s32 num, ... );
GEN_API CodeBody def_enum_body ( s32 num, Code* codes );
GEN_API CodeBody def_export_body ( s32 num, ... );
GEN_API CodeBody def_export_body ( s32 num, Code* codes);
GEN_API CodeBody def_extern_link_body( s32 num, ... );
GEN_API CodeBody def_extern_link_body( s32 num, Code* codes );
GEN_API CodeBody def_function_body ( s32 num, ... );
GEN_API CodeBody def_function_body ( s32 num, Code* codes );
GEN_API CodeBody def_global_body ( s32 num, ... );
GEN_API CodeBody def_global_body ( s32 num, Code* codes );
GEN_API CodeBody def_namespace_body ( s32 num, ... );
GEN_API CodeBody def_namespace_body ( s32 num, Code* codes );
GEN_API CodeParams def_params ( s32 num, ... );
GEN_API CodeParams def_params ( s32 num, CodeParams* params );
GEN_API CodeSpecifiers def_specifiers ( s32 num, ... );
GEN_API CodeSpecifiers def_specifiers ( s32 num, Specifier* specs );
GEN_API CodeBody def_struct_body ( s32 num, ... );
GEN_API CodeBody def_struct_body ( s32 num, Code* codes );
GEN_API CodeBody def_union_body ( s32 num, ... );
GEN_API CodeBody def_union_body ( s32 num, Code* codes );
GEN_API CodeBody def_class_body ( s32 num, ... );
GEN_API CodeBody def_class_body_arr ( s32 num, Code* codes );
GEN_API CodeDefineParams def_define_params ( s32 num, ... );
GEN_API CodeDefineParams def_define_params_arr ( s32 num, CodeDefineParams* codes );
GEN_API CodeBody def_enum_body ( s32 num, ... );
GEN_API CodeBody def_enum_body_arr ( s32 num, Code* codes );
GEN_API CodeBody def_export_body ( s32 num, ... );
GEN_API CodeBody def_export_body_arr ( s32 num, Code* codes);
GEN_API CodeBody def_extern_link_body ( s32 num, ... );
GEN_API CodeBody def_extern_link_body_arr ( s32 num, Code* codes );
GEN_API CodeBody def_function_body ( s32 num, ... );
GEN_API CodeBody def_function_body_arr ( s32 num, Code* codes );
GEN_API CodeBody def_global_body ( s32 num, ... );
GEN_API CodeBody def_global_body_arr ( s32 num, Code* codes );
GEN_API CodeBody def_namespace_body ( s32 num, ... );
GEN_API CodeBody def_namespace_body_arr ( s32 num, Code* codes );
GEN_API CodeParams def_params ( s32 num, ... );
GEN_API CodeParams def_params_arr ( s32 num, CodeParams* params );
GEN_API CodeSpecifiers def_specifiers ( s32 num, ... );
GEN_API CodeSpecifiers def_specifiers_arr ( s32 num, Specifier* specs );
GEN_API CodeBody def_struct_body ( s32 num, ... );
GEN_API CodeBody def_struct_body_arr ( s32 num, Code* codes );
GEN_API CodeBody def_union_body ( s32 num, ... );
GEN_API CodeBody def_union_body_arr ( s32 num, Code* codes );
#if GEN_COMPILER_CPP
forceinline CodeBody def_class_body ( s32 num, Code* codes ) { return def_class_body_arr(num, codes); }
forceinline CodeDefineParams def_define_params ( s32 num, CodeDefineParams* codes ) { return def_define_params_arr(num, codes); }
forceinline CodeBody def_enum_body ( s32 num, Code* codes ) { return def_enum_body_arr(num, codes); }
forceinline CodeBody def_export_body ( s32 num, Code* codes) { return def_export_body_arr(num, codes); }
forceinline CodeBody def_extern_link_body( s32 num, Code* codes ) { return def_extern_link_body_arr(num, codes); }
forceinline CodeBody def_function_body ( s32 num, Code* codes ) { return def_function_body_arr(num, codes); }
forceinline CodeBody def_global_body ( s32 num, Code* codes ) { return def_global_body_arr(num, codes); }
forceinline CodeBody def_namespace_body ( s32 num, Code* codes ) { return def_namespace_body_arr(num, codes); }
forceinline CodeParams def_params ( s32 num, CodeParams* params ) { return def_params_arr(num, params); }
forceinline CodeSpecifiers def_specifiers ( s32 num, Specifier* specs ) { return def_specifiers_arr(num, specs); }
forceinline CodeBody def_struct_body ( s32 num, Code* codes ) { return def_struct_body_arr(num, codes); }
forceinline CodeBody def_union_body ( s32 num, Code* codes ) { return def_union_body_arr(num, codes); }
#endif
#pragma endregion Upfront

View File

@ -73,7 +73,7 @@ CodeConstructor parse_constructor( Str def )
if ( NumSpecifiers )
{
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
// <specifiers> ...
}

View File

@ -1369,7 +1369,7 @@ CodeBody def_class_body( s32 num, ... )
return result;
}
CodeBody def_class_body( s32 num, Code* codes )
CodeBody def_class_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_class_body );
@ -1432,7 +1432,7 @@ CodeDefineParams def_define_params( s32 num, ... )
return result;
}
CodeDefineParams def_define_params( s32 num, CodeDefineParams* codes )
CodeDefineParams def_define_params_arr( s32 num, CodeDefineParams* codes )
{
def_body_code_array_start( def_define_params );
@ -1491,7 +1491,7 @@ CodeBody def_enum_body( s32 num, ... )
return (CodeBody) result;
}
CodeBody def_enum_body( s32 num, Code* codes )
CodeBody def_enum_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_enum_body );
@ -1552,7 +1552,7 @@ CodeBody def_export_body( s32 num, ... )
return result;
}
CodeBody def_export_body( s32 num, Code* codes )
CodeBody def_export_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_export_body );
@ -1618,7 +1618,7 @@ CodeBody def_extern_link_body( s32 num, ... )
return result;
}
CodeBody def_extern_link_body( s32 num, Code* codes )
CodeBody def_extern_link_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_extern_linkage_body );
@ -1685,7 +1685,7 @@ CodeBody def_function_body( s32 num, ... )
return result;
}
CodeBody def_function_body( s32 num, Code* codes )
CodeBody def_function_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_function_body );
@ -1756,7 +1756,7 @@ CodeBody def_global_body( s32 num, ... )
return result;
}
CodeBody def_global_body( s32 num, Code* codes )
CodeBody def_global_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_global_body );
@ -1827,7 +1827,7 @@ CodeBody def_namespace_body( s32 num, ... )
return result;
}
CodeBody def_namespace_body( s32 num, Code* codes )
CodeBody def_namespace_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_namespace_body );
@ -1889,7 +1889,7 @@ CodeParams def_params( s32 num, ... )
return result;
}
CodeParams def_params( s32 num, CodeParams* codes )
CodeParams def_params_arr( s32 num, CodeParams* codes )
{
def_body_code_array_start( def_params );
@ -1945,7 +1945,7 @@ CodeSpecifiers def_specifiers( s32 num, ... )
return result;
}
CodeSpecifiers def_specifiers( s32 num, Specifier* specs )
CodeSpecifiers def_specifiers_arr( s32 num, Specifier* specs )
{
if ( num <= 0 ) {
log_failure("gen::def_specifiers: num cannot be zero or less");
@ -2004,7 +2004,7 @@ CodeBody def_struct_body( s32 num, ... )
return result;
}
CodeBody def_struct_body( s32 num, Code* codes )
CodeBody def_struct_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_struct_body );
@ -2065,7 +2065,7 @@ CodeBody def_union_body( s32 num, ... )
return result;
}
CodeBody def_union_body( s32 num, Code* codes )
CodeBody def_union_body_arr( s32 num, Code* codes )
{
def_body_code_array_start( def_union_body );

View File

@ -532,7 +532,7 @@ void lex_found_token( LexContext* ctx )
ctx->token.Type = macrotype_to_toktype(macro->Type);
b32 is_functional = macro_is_functional(* macro);
resolved_to_macro = has_args ? is_functional : ! is_functional;
if ( ! resolved_to_macro ) {
if ( ! resolved_to_macro && GEN_BUILD_DEBUG ) {
log_fmt("Info(%d, %d): %S identified as a macro but usage here does not resolve to one (interpreting as identifier)\n"
, ctx->token.Line
, ctx->token.Line

View File

@ -1028,7 +1028,7 @@ CodeBody parse_class_struct_body( TokType which, Token name )
if ( NumSpecifiers )
{
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <Attributes> <Specifiers>
@ -1753,7 +1753,7 @@ CodeBody parse_global_nspace( CodeType which )
if ( NumSpecifiers )
{
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <Attributes> <Specifiers>
}
@ -4012,7 +4012,7 @@ CodeFriend parser_parse_friend()
}
if ( NumSpecifiers ) {
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <friend> <specifiers>
}
@ -4129,7 +4129,7 @@ CodeFn parser_parse_function()
}
if ( NumSpecifiers ) {
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <export> <Attributes> <Specifiers>
@ -4237,7 +4237,7 @@ CodeOperator parser_parse_operator()
}
if ( NumSpecifiers ) {
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <export> <Attributes> <Specifiers>
@ -4475,7 +4475,7 @@ CodeTemplate parser_parse_template()
}
if ( NumSpecifiers ) {
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <export> template< <Parameters> > <Attributes> <Specifiers>
}
@ -4733,7 +4733,7 @@ else if ( currtok.Type == Tok_DeclType )
#ifdef GEN_USE_NEW_TYPENAME_PARSING
if ( NumSpecifiers )
{
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
NumSpecifiers = 0;
}
#endif
@ -4813,7 +4813,7 @@ else if ( currtok.Type == Tok_DeclType )
#else
if ( NumSpecifiers )
return_type->Specs = def_specifiers( NumSpecifiers, ( Specifier* )specs_found );
return_type->Specs = def_specifiers_arr( NumSpecifiers, ( Specifier* )specs_found );
// Reset specifiers, the function itself will have its own suffix specifiers possibly.
NumSpecifiers = 0;
@ -4864,7 +4864,7 @@ else if ( currtok.Type == Tok_DeclType )
if ( NumSpecifiers )
{
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
NumSpecifiers = 0;
// <Attributes> <ReturnType> ( <Specifiers>
@ -4935,7 +4935,7 @@ else if ( currtok.Type == Tok_DeclType )
#ifdef GEN_USE_NEW_TYPENAME_PARSING
if ( NumSpecifiers )
{
func_suffix_specs = def_specifiers( NumSpecifiers, specs_found );
func_suffix_specs = def_specifiers_arr( NumSpecifiers, specs_found );
NumSpecifiers = 0;
}
#endif
@ -4985,7 +4985,7 @@ else if ( currtok.Type == Tok_DeclType )
#else
if ( NumSpecifiers )
{
CodeSpecifiers specifiers = def_specifiers( NumSpecifiers, ( Specifier* )specs_found );
CodeSpecifiers specifiers = def_specifiers_arr( NumSpecifiers, ( Specifier* )specs_found );
result->Specs = specifiers;
}
#endif
@ -5523,7 +5523,7 @@ CodeVar parser_parse_variable()
}
if ( NumSpecifiers ) {
specifiers = def_specifiers( NumSpecifiers, specs_found );
specifiers = def_specifiers_arr( NumSpecifiers, specs_found );
}
// <ModuleFlags> <Attributes> <Specifiers>

View File

@ -5,10 +5,9 @@
#pragma region StaticData
global Context* _ctx;
global u32 context_counter;
#pragma region Constants
global u32 context_counter;
global Macro enum_underlying_macro;
global Code Code_Global;

View File

@ -282,10 +282,9 @@ bool array_fill(Array<Type> array, usize begin, usize end, Type value)
ArrayHeader* header = array_get_header(array);
if (begin < 0 || end > header->Num)
return false;
return false;
for (ssize idx = ssize(begin); idx < ssize(end); idx++)
{
for (ssize idx = ssize(begin); idx < ssize(end); idx++) {
array[idx] = value;
}
@ -754,7 +753,7 @@ HashTableFindResult hashtable__find(HashTable<Type> table, u64 key)
if (table.Entries[result.EntryIndex].Key == key)
break;
result.PrevIndex = result.EntryIndex;
result.PrevIndex = result.EntryIndex;
result.EntryIndex = table.Entries[result.EntryIndex].Next;
}
}

View File

@ -11,10 +11,10 @@
#if GEN_BUILD_DEBUG
# if defined( GEN_COMPILER_MSVC )
# if _MSC_VER < 1300
#pragma message("GEN_BUILD_DEBUG: __asm int 3")
// #pragma message("GEN_BUILD_DEBUG: __asm int 3")
# define GEN_DEBUG_TRAP() __asm int 3 /* Trap to debugger! */
# else
#pragma message("GEN_BUILD_DEBUG: __debugbreak()")
// #pragma message("GEN_BUILD_DEBUG: __debugbreak()")
# define GEN_DEBUG_TRAP() __debugbreak()
# endif
# elif defined( GEN_COMPILER_TINYC )
@ -23,7 +23,7 @@
# define GEN_DEBUG_TRAP() __builtin_trap()
# endif
#else
#pragma message("GEN_BUILD_DEBUG: omitted")
// #pragma message("GEN_BUILD_DEBUG: omitted")
# define GEN_DEBUG_TRAP()
#endif

View File

@ -89,13 +89,13 @@
#define src_line_str stringize(__LINE__)
#ifndef do_once
#define do_once() \
static int __do_once_counter_##src_line_str = 0; \
for(; __do_once_counter_##src_line_str != 1; __do_once_counter_##src_line_str = 1 ) \
#define do_once() \
local_persist int __do_once_counter_##src_line_str = 0; \
for(; __do_once_counter_##src_line_str != 1; __do_once_counter_##src_line_str = 1 ) \
#define do_once_defer( expression ) \
static int __do_once_counter_##src_line_str = 0; \
for(; __do_once_counter_##src_line_str != 1; __do_once_counter_##src_line_str = 1, (expression)) \
#define do_once_defer( expression ) \
local_persist int __do_once_counter_##src_line_str = 0; \
for(;__do_once_counter_##src_line_str != 1; __do_once_counter_##src_line_str = 1, (expression)) \
#define do_once_start \
do \