String member definitions not longer used in the base project

This commit is contained in:
Edward R. Gonzalez 2024-12-01 03:06:30 -05:00
parent c7b072266f
commit e5acac1d18
14 changed files with 594 additions and 574 deletions

View File

@ -13,7 +13,7 @@ Builder Builder::open( char const* path )
return result; return result;
} }
result.Buffer = String::make_reserve( GlobalAllocator, Builder_StrBufferReserve ); result.Buffer = string_make_reserve( GlobalAllocator, Builder_StrBufferReserve );
// log_fmt("$Builder - Opened file: %s\n", result.File.filename ); // log_fmt("$Builder - Opened file: %s\n", result.File.filename );
return result; return result;
@ -21,7 +21,7 @@ Builder Builder::open( char const* path )
void Builder::pad_lines( s32 num ) void Builder::pad_lines( s32 num )
{ {
Buffer.append( "\n" ); append( Buffer, "\n" );
} }
void Builder::print( Code code ) void Builder::print( Code code )
@ -29,7 +29,7 @@ void Builder::print( Code code )
String str = code->to_string(); String str = code->to_string();
// const ssize len = str.length(); // const ssize len = str.length();
// log_fmt( "%s - print: %.*s\n", File.filename, len > 80 ? 80 : len, str.Data ); // log_fmt( "%s - print: %.*s\n", File.filename, len > 80 ? 80 : len, str.Data );
Buffer.append( str ); append( Buffer, str );
} }
void Builder::print_fmt( char const* fmt, ... ) void Builder::print_fmt( char const* fmt, ... )
@ -43,17 +43,17 @@ void Builder::print_fmt( char const* fmt, ... )
va_end( va ); va_end( va );
// log_fmt( "$%s - print_fmt: %.*s\n", File.filename, res > 80 ? 80 : res, buf ); // log_fmt( "$%s - print_fmt: %.*s\n", File.filename, res > 80 ? 80 : res, buf );
Buffer.append( buf, res ); append( Buffer, buf, res );
} }
void Builder::write() void Builder::write()
{ {
b32 result = file_write( & File, Buffer, Buffer.length() ); b32 result = file_write( & File, Buffer, length(Buffer) );
if ( result == false ) if ( result == false )
log_failure("gen::File::write - Failed to write to file: %s\n", file_name( & File ) ); log_failure("gen::File::write - Failed to write to file: %s\n", file_name( & File ) );
log_fmt( "Generated: %s\n", File.filename ); log_fmt( "Generated: %s\n", File.filename );
file_close( & File ); file_close( & File );
Buffer.free(); free(Buffer);
} }

View File

@ -23,9 +23,9 @@ Code scan_file( char const* path )
GEN_FATAL("scan_file: %s is empty", path ); GEN_FATAL("scan_file: %s is empty", path );
} }
String str = String::make_reserve( GlobalAllocator, fsize ); String str = string_make_reserve( GlobalAllocator, fsize );
file_read( & file, str, fsize ); file_read( & file, str, fsize );
str.get_header().Length = fsize; get_header(str).Length = fsize;
// Skip GEN_INTELLISENSE_DIRECTIVES preprocessor blocks // Skip GEN_INTELLISENSE_DIRECTIVES preprocessor blocks
// Its designed so that the directive should be the first thing in the file. // Its designed so that the directive should be the first thing in the file.
@ -97,12 +97,12 @@ Code scan_file( char const* path )
if ( (scanner + 2) >= ( str.Data + fsize ) ) if ( (scanner + 2) >= ( str.Data + fsize ) )
{ {
mem_move( str, scanner, left ); mem_move( str, scanner, left );
str.get_header().Length = left; get_header(str).Length = left;
break; break;
} }
mem_move( str, scanner, left ); mem_move( str, scanner, left );
str.get_header().Length = left; get_header(str).Length = left;
break; break;
} }

View File

@ -24,20 +24,20 @@ constexpr char const* generation_notice =
void format_file( char const* path ) void format_file( char const* path )
{ {
String resolved_path = String::make(GlobalAllocator, to_str(path)); String resolved_path = string_make(GlobalAllocator, to_str(path));
String style_arg = String::make(GlobalAllocator, txt("-style=file:")); String style_arg = string_make(GlobalAllocator, txt("-style=file:"));
style_arg.append("../scripts/.clang-format "); append( style_arg, "../scripts/.clang-format ");
// Need to execute clang format on the generated file to get it to match the original. // Need to execute clang format on the generated file to get it to match the original.
#define clang_format "clang-format " #define clang_format "clang-format "
#define cf_format_inplace "-i " #define cf_format_inplace "-i "
#define cf_verbose "-verbose " #define cf_verbose "-verbose "
String command = String::make( GlobalAllocator, clang_format ); String command = string_make( GlobalAllocator, clang_format );
command.append( cf_format_inplace ); append( command, cf_format_inplace );
command.append( cf_verbose ); append( command, cf_verbose );
command.append( style_arg ); append( command, style_arg );
command.append( resolved_path ); append( command, resolved_path );
log_fmt("\tRunning clang-format on file:\n"); log_fmt("\tRunning clang-format on file:\n");
system( command ); system( command );
log_fmt("\tclang-format finished reformatting.\n"); log_fmt("\tclang-format finished reformatting.\n");

View File

@ -9,16 +9,16 @@ Code Code::Invalid;
// This serializes all the data-members in a "debug" format, where each member is printed with its associated value. // This serializes all the data-members in a "debug" format, where each member is printed with its associated value.
char const* AST::debug_str() char const* AST::debug_str()
{ {
String result = String::make_reserve( GlobalAllocator, kilobytes(1) ); String result = string_make_reserve( GlobalAllocator, kilobytes(1) );
if ( Parent ) if ( Parent )
result.append_fmt( "\n\tParent : %S %S", Parent->type_str(), Name ? Name : "" ); append_fmt( result, "\n\tParent : %S %S", Parent->type_str(), Name ? Name : "" );
else else
result.append_fmt( "\n\tParent : %S", "Null" ); append_fmt( result, "\n\tParent : %S", "Null" );
result.append_fmt( "\n\tName : %S", Name ? Name : "Null" ); append_fmt( result, "\n\tName : %S", Name ? Name : "Null" );
result.append_fmt( "\n\tType : %S", type_str() ); append_fmt( result, "\n\tType : %S", type_str() );
result.append_fmt( "\n\tModule Flags : %S", to_str( ModuleFlags ) ); append_fmt( result, "\n\tModule Flags : %S", to_str( ModuleFlags ) );
switch ( Type ) switch ( Type )
{ {
@ -30,9 +30,9 @@ char const* AST::debug_str()
case Access_Protected: case Access_Protected:
case Access_Public: case Access_Public:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
break; break;
case Untyped: case Untyped:
@ -48,74 +48,74 @@ char const* AST::debug_str()
case Preprocess_IfDef: case Preprocess_IfDef:
case Preprocess_IfNotDef: case Preprocess_IfNotDef:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tContent: %S", Content ); append_fmt( result, "\n\tContent: %S", Content );
break; break;
case Class: case Class:
case Struct: case Struct:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); append_fmt( result, "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" );
result.append_fmt( "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); append_fmt( result, "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Class_Fwd: case Class_Fwd:
case Struct_Fwd: case Struct_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); append_fmt( result, "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" );
result.append_fmt( "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); append_fmt( result, "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" );
break; break;
case Constructor: case Constructor:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); append_fmt( result, "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Constructor_Fwd: case Constructor_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); append_fmt( result, "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
break; break;
case Destructor: case Destructor:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Destructor_Fwd: case Destructor_Fwd:
@ -124,208 +124,208 @@ char const* AST::debug_str()
case Enum: case Enum:
case Enum_Class: case Enum_Class:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); append_fmt( result, "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Enum_Fwd: case Enum_Fwd:
case Enum_Class_Fwd: case Enum_Class_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); append_fmt( result, "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" );
break; break;
case Extern_Linkage: case Extern_Linkage:
case Namespace: case Namespace:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tBody: %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody: %S", Body ? Body->debug_str() : "Null" );
break; break;
case Friend: case Friend:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); append_fmt( result, "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" );
break; break;
case Function: case Function:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Function_Fwd: case Function_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
break; break;
case Module: case Module:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
break; break;
case Operator: case Operator:
case Operator_Member: case Operator_Member:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
result.append_fmt( "\n\tOp : %S", to_str( Op ) ); append_fmt( result, "\n\tOp : %S", to_str( Op ) );
break; break;
case Operator_Fwd: case Operator_Fwd:
case Operator_Member_Fwd: case Operator_Member_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tOp : %S", to_str( Op ) ); append_fmt( result, "\n\tOp : %S", to_str( Op ) );
break; break;
case Operator_Cast: case Operator_Cast:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Operator_Cast_Fwd: case Operator_Cast_Fwd:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" );
break; break;
case Parameters: case Parameters:
result.append_fmt( "\n\tNumEntries: %d", NumEntries ); append_fmt( result, "\n\tNumEntries: %d", NumEntries );
result.append_fmt( "\n\tLast : %S", Last->Name ); append_fmt( result, "\n\tLast : %S", Last->Name );
result.append_fmt( "\n\tNext : %S", Next->Name ); append_fmt( result, "\n\tNext : %S", Next->Name );
result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" );
result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" );
break; break;
case Specifiers: case Specifiers:
{ {
result.append_fmt( "\n\tNumEntries: %d", NumEntries ); append_fmt( result, "\n\tNumEntries: %d", NumEntries );
result.append( "\n\tArrSpecs: " ); GEN_NS append( result, "\n\tArrSpecs: " );
s32 idx = 0; s32 idx = 0;
s32 left = NumEntries; s32 left = NumEntries;
while ( left-- ) while ( left-- )
{ {
StrC spec = ESpecifier::to_str( ArrSpecs[idx] ); StrC spec = ESpecifier::to_str( ArrSpecs[idx] );
result.append_fmt( "%.*s, ", spec.Len, spec.Ptr ); append_fmt( result, "%.*s, ", spec.Len, spec.Ptr );
idx++; idx++;
} }
result.append_fmt( "\n\tNextSpecs: %S", NextSpecs ? NextSpecs->debug_str() : "Null" ); append_fmt( result, "\n\tNextSpecs: %S", NextSpecs ? NextSpecs->debug_str() : "Null" );
} }
break; break;
case Template: case Template:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); append_fmt( result, "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" );
break; break;
case Typedef: case Typedef:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); append_fmt( result, "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" );
break; break;
case Typename: case Typename:
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tReturnType : %S", ReturnType ? ReturnType->to_string() : "Null" ); append_fmt( result, "\n\tReturnType : %S", ReturnType ? ReturnType->to_string() : "Null" );
result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" );
result.append_fmt( "\n\tArrExpr : %S", ArrExpr ? ArrExpr->to_string() : "Null" ); append_fmt( result, "\n\tArrExpr : %S", ArrExpr ? ArrExpr->to_string() : "Null" );
break; break;
case Union: case Union:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" );
break; break;
case Using: case Using:
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); append_fmt( result, "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" );
break; break;
case Variable: case Variable:
@ -333,25 +333,25 @@ char const* AST::debug_str()
if ( Parent && Parent->Type == Variable ) if ( Parent && Parent->Type == Variable )
{ {
// Its a NextVar // Its a NextVar
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" );
result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); append_fmt( result, "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" );
result.append_fmt( "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); append_fmt( result, "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" );
break; break;
} }
if ( Prev ) if ( Prev )
result.append_fmt( "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tPrev: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
if ( Next ) if ( Next )
result.append_fmt( "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" ); append_fmt( result, "\n\tNext: %S %S", Prev->type_str(), Prev->Name ? Prev->Name : "Null" );
result.append_fmt( "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" );
result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" );
result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" );
result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" );
result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); append_fmt( result, "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" );
result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" );
result.append_fmt( "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); append_fmt( result, "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" );
break; break;
} }
@ -372,7 +372,7 @@ AST* AST::duplicate()
String AST::to_string() String AST::to_string()
{ {
String result = String::make( GlobalAllocator, "" ); String result = string_make( GlobalAllocator, "" );
to_string( result ); to_string( result );
return result; return result;
} }
@ -390,25 +390,25 @@ void AST::to_string( String& result )
#ifdef GEN_DONT_ALLOW_INVALID_CODE #ifdef GEN_DONT_ALLOW_INVALID_CODE
log_failure("Attempted to serialize invalid code! - %S", Parent ? Parent->debug_str() : Name ); log_failure("Attempted to serialize invalid code! - %S", Parent ? Parent->debug_str() : Name );
#else #else
result.append_fmt( "Invalid Code!" ); append_fmt( result, "Invalid Code!" );
#endif #endif
break; break;
case NewLine: case NewLine:
result.append("\n"); GEN_NS append( result,"\n");
break; break;
case Untyped: case Untyped:
case Execution: case Execution:
case Comment: case Comment:
case PlatformAttributes: case PlatformAttributes:
result.append( Content ); GEN_NS append( result, Content );
break; break;
case Access_Private: case Access_Private:
case Access_Protected: case Access_Protected:
case Access_Public: case Access_Public:
result.append( Name ); GEN_NS append( result, Name );
break; break;
case Class: case Class:
@ -659,8 +659,8 @@ bool AST::is_equal( AST* other )
"so it must be verified by eye for now\n" \ "so it must be verified by eye for now\n" \
"AST Content:\n%S\n" \ "AST Content:\n%S\n" \
"Other Content:\n%S\n" \ "Other Content:\n%S\n" \
, content.visualize_whitespace() \ , visualize_whitespace(content) \
, other->content.visualize_whitespace() \ , visualize_whitespace(other->content) \
); \ ); \
} }

File diff suppressed because it is too large Load Diff

View File

@ -74,26 +74,26 @@ void* Global_Allocator_Proc( void* allocator_data, AllocType type, ssize size, s
internal internal
void define_constants() void define_constants()
{ {
Code::Global = make_code(); Code::Global = make_code();
Code::Global->Name = get_cached_string( txt("Global Code") ); scast(String, Code::Global->Name) = get_cached_string( txt("Global Code") );
Code::Global->Content = Code::Global->Name; scast(String, Code::Global->Content) = Code::Global->Name;
Code::Invalid = make_code(); Code::Invalid = make_code();
Code::Invalid.set_global(); Code::Invalid.set_global();
t_empty = (CodeType) make_code(); t_empty = (CodeType) make_code();
t_empty->Type = ECode::Typename; t_empty->Type = ECode::Typename;
t_empty->Name = get_cached_string( txt("") ); scast(String, t_empty->Name) = get_cached_string( txt("") );
t_empty.set_global(); t_empty.set_global();
access_private = make_code(); access_private = make_code();
access_private->Type = ECode::Access_Private; access_private->Type = ECode::Access_Private;
access_private->Name = get_cached_string( txt("private:\n") ); scast(String, access_private->Name) = get_cached_string( txt("private:\n") );
access_private.set_global(); access_private.set_global();
access_protected = make_code(); access_protected = make_code();
access_protected->Type = ECode::Access_Protected; access_protected->Type = ECode::Access_Protected;
access_protected->Name = get_cached_string( txt("protected:\n") ); scast(String, access_protected->Name) = get_cached_string( txt("protected:\n") );
access_protected.set_global(); access_protected.set_global();
access_public = make_code(); access_public = make_code();
@ -398,7 +398,7 @@ StringCached get_cached_string( StrC str )
return * result; return * result;
} }
String result = String::make( get_string_allocator( str.Len ), str ); String result = string_make( get_string_allocator( str.Len ), str );
set<StringCached>(StringCache, key, result ); set<StringCached>(StringCache, key, result );
return result; return result;

View File

@ -458,7 +458,7 @@ CodeComment def_comment( StrC content )
static char line[ MaxCommentLineLength ]; static char line[ MaxCommentLineLength ];
String cmt_formatted = String::make_reserve( GlobalAllocator, kilobytes(1) ); String cmt_formatted = string_make_reserve( GlobalAllocator, kilobytes(1) );
char const* end = content.Ptr + content.Len; char const* end = content.Ptr + content.Len;
char const* scanner = content.Ptr; char const* scanner = content.Ptr;
s32 curr = 0; s32 curr = 0;
@ -474,15 +474,15 @@ CodeComment def_comment( StrC content )
length++; length++;
str_copy( line, scanner, length ); str_copy( line, scanner, length );
cmt_formatted.append_fmt( "//%.*s", length, line ); append_fmt(cmt_formatted, "//%.*s", length, line );
mem_set( line, 0, MaxCommentLineLength ); mem_set( line, 0, MaxCommentLineLength );
scanner += length; scanner += length;
} }
while ( scanner <= end ); while ( scanner <= end );
if ( cmt_formatted.back() != '\n' ) if ( back(cmt_formatted) != '\n' )
cmt_formatted.append( "\n" ); append( cmt_formatted, "\n" );
Code Code
result = make_code(); result = make_code();
@ -490,7 +490,7 @@ CodeComment def_comment( StrC content )
result->Name = get_cached_string( cmt_formatted ); result->Name = get_cached_string( cmt_formatted );
result->Content = result->Name; result->Content = result->Name;
cmt_formatted.free(); free(cmt_formatted);
return (CodeComment) result; return (CodeComment) result;
} }

View File

@ -89,11 +89,11 @@ struct Token
String to_string() String to_string()
{ {
String result = String::make_reserve( GlobalAllocator, kilobytes(4) ); String result = string_make_reserve( GlobalAllocator, kilobytes(4) );
StrC type_str = ETokType::to_str( Type ); StrC type_str = ETokType::to_str( Type );
result.append_fmt( "Line: %d Column: %d, Type: %.*s Content: %.*s" append_fmt( result, "Line: %d Column: %d, Type: %.*s Content: %.*s"
, Line, Column , Line, Column
, type_str.Len, type_str.Ptr , type_str.Len, type_str.Ptr
, Length, Text , Length, Text
@ -352,7 +352,7 @@ s32 lex_preprocessor_directive(
if ( current != '"' && current != '<' ) if ( current != '"' && current != '<' )
{ {
String directive_str = String::fmt_buf( GlobalAllocator, "%.*s", min( 80, left + preprocess_content.Length ), token.Text ); String directive_str = string_fmt_buf( GlobalAllocator, "%.*s", min( 80, left + preprocess_content.Length ), token.Text );
log_failure( "gen::Parser::lex: Expected '\"' or '<' after #include, not '%c' (%d, %d)\n%s" log_failure( "gen::Parser::lex: Expected '\"' or '<' after #include, not '%c' (%d, %d)\n%s"
, current , current
@ -419,8 +419,8 @@ s32 lex_preprocessor_directive(
} }
else else
{ {
String directive_str = String::make_length( GlobalAllocator, token.Text, token.Length ); String directive_str = string_make_length( GlobalAllocator, token.Text, token.Length );
String content_str = String::fmt_buf( GlobalAllocator, "%.*s", min( 400, left + preprocess_content.Length ), preprocess_content.Text ); String content_str = string_fmt_buf( GlobalAllocator, "%.*s", min( 400, left + preprocess_content.Length ), preprocess_content.Text );
log_failure( "gen::Parser::lex: Invalid escape sequence '\\%c' (%d, %d)" log_failure( "gen::Parser::lex: Invalid escape sequence '\\%c' (%d, %d)"
" in preprocessor directive '%s' (%d, %d)\n%s" " in preprocessor directive '%s' (%d, %d)\n%s"
@ -586,7 +586,7 @@ TokArray lex( StrC content )
{ {
s32 length = 0; s32 length = 0;
char const* scanner = entry.Data; char const* scanner = entry.Data;
while ( entry.length() > length && (char_is_alphanumeric( *scanner ) || *scanner == '_') ) while ( GEN_NS length(entry) > length && (char_is_alphanumeric( *scanner ) || *scanner == '_') )
{ {
scanner++; scanner++;
length ++; length ++;
@ -678,7 +678,7 @@ TokArray lex( StrC content )
} }
else else
{ {
String context_str = String::fmt_buf( GlobalAllocator, "%s", scanner, min( 100, left ) ); String context_str = string_fmt_buf( GlobalAllocator, "%s", scanner, min( 100, left ) );
log_failure( "gen::lex: invalid varadic argument, expected '...' got '..%c' (%d, %d)\n%s", current, line, column, context_str ); log_failure( "gen::lex: invalid varadic argument, expected '...' got '..%c' (%d, %d)\n%s", current, line, column, context_str );
} }
@ -1239,7 +1239,7 @@ TokArray lex( StrC content )
); );
} }
String context_str = String::fmt_buf( GlobalAllocator, "%.*s", min( 100, left ), scanner ); String context_str = string_fmt_buf( GlobalAllocator, "%.*s", min( 100, left ), scanner );
log_failure( "Failed to lex token '%c' (%d, %d)\n%s", current, line, column, context_str ); log_failure( "Failed to lex token '%c' (%d, %d)\n%s", current, line, column, context_str );
// Skip to next whitespace since we can't know if anything else is valid until then. // Skip to next whitespace since we can't know if anything else is valid until then.

View File

@ -45,7 +45,7 @@ struct ParseContext
String to_string() String to_string()
{ {
String result = String::make_reserve( GlobalAllocator, kilobytes(4) ); String result = string_make_reserve( GlobalAllocator, kilobytes(4) );
Token scope_start = Scope->Start; Token scope_start = Scope->Start;
Token last_valid = Tokens.Idx >= num(Tokens.Arr) ? Tokens.Arr[num(Tokens.Arr) -1] : Tokens.current(); Token last_valid = Tokens.Idx >= num(Tokens.Arr) ? Tokens.Arr[num(Tokens.Arr) -1] : Tokens.current();
@ -58,18 +58,18 @@ struct ParseContext
length++; length++;
} }
String line = String::make( GlobalAllocator, { length, scope_start.Text } ); String line = string_make( GlobalAllocator, { length, scope_start.Text } );
result.append_fmt("\tScope : %s\n", line ); append_fmt( result, "\tScope : %s\n", line );
line.free(); free(line);
sptr dist = (sptr)last_valid.Text - (sptr)scope_start.Text + 2; sptr dist = (sptr)last_valid.Text - (sptr)scope_start.Text + 2;
sptr length_from_err = dist; sptr length_from_err = dist;
String line_from_err = String::make( GlobalAllocator, { length_from_err, last_valid.Text } ); String line_from_err = string_make( GlobalAllocator, { length_from_err, last_valid.Text } );
if ( length_from_err < 100 ) if ( length_from_err < 100 )
result.append_fmt("\t(%d, %d):%*c\n", last_valid.Line, last_valid.Column, length_from_err, '^' ); append_fmt(result, "\t(%d, %d):%*c\n", last_valid.Line, last_valid.Column, length_from_err, '^' );
else else
result.append_fmt("\t(%d, %d)\n", last_valid.Line, last_valid.Column ); append_fmt(result, "\t(%d, %d)\n", last_valid.Line, last_valid.Column );
StackNode* curr_scope = Scope; StackNode* curr_scope = Scope;
s32 level = 0; s32 level = 0;
@ -77,11 +77,11 @@ struct ParseContext
{ {
if ( curr_scope->Name ) if ( curr_scope->Name )
{ {
result.append_fmt("\t%d: %s, AST Name: %.*s\n", level, curr_scope->ProcName.Ptr, curr_scope->Name.Length, curr_scope->Name.Text ); append_fmt(result, "\t%d: %s, AST Name: %.*s\n", level, curr_scope->ProcName.Ptr, curr_scope->Name.Length, curr_scope->Name.Text );
} }
else else
{ {
result.append_fmt("\t%d: %s\n", level, curr_scope->ProcName.Ptr ); append_fmt(result, "\t%d: %s\n", level, curr_scope->ProcName.Ptr );
} }
curr_scope = curr_scope->Prev; curr_scope = curr_scope->Prev;
@ -243,7 +243,7 @@ constexpr bool strip_formatting_dont_preserve_newlines = false;
internal internal
String strip_formatting( StrC raw_text, bool preserve_newlines = true ) String strip_formatting( StrC raw_text, bool preserve_newlines = true )
{ {
String content = String::make_reserve( GlobalAllocator, raw_text.Len ); String content = string_make_reserve( GlobalAllocator, raw_text.Len );
if ( raw_text.Len == 0 ) if ( raw_text.Len == 0 )
return content; return content;
@ -290,7 +290,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
if ( tokleft ) if ( tokleft )
move_fwd(); move_fwd();
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
@ -312,7 +312,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
if ( tokleft ) if ( tokleft )
move_fwd(); move_fwd();
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
@ -326,7 +326,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
scanner += 2; scanner += 2;
tokleft -= 2; tokleft -= 2;
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
@ -345,7 +345,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
if (tokleft) if (tokleft)
move_fwd(); move_fwd();
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
@ -354,10 +354,10 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
if (scanner[0] == '\t') if (scanner[0] == '\t')
{ {
if (pos > last_cut) if (pos > last_cut)
content.append(cut_ptr, cut_length); append( content, cut_ptr, cut_length);
if ( content.back() != ' ' ) if ( back( content ) != ' ' )
content.append(' '); append( content, ' ');
move_fwd(); move_fwd();
last_cut = sptr(scanner) - sptr(raw_text.Ptr); last_cut = sptr(scanner) - sptr(raw_text.Ptr);
@ -373,17 +373,17 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
scanner += 2; scanner += 2;
tokleft -= 2; tokleft -= 2;
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
if ( pos > last_cut ) if ( pos > last_cut )
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
// Replace with a space // Replace with a space
if ( content.back() != ' ' ) if ( back( content ) != ' ' )
content.append( ' ' ); append( content, ' ' );
scanner += 2; scanner += 2;
tokleft -= 2; tokleft -= 2;
@ -400,17 +400,17 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
move_fwd(); move_fwd();
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
continue; continue;
} }
if ( pos > last_cut ) if ( pos > last_cut )
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
// Replace with a space // Replace with a space
if ( content.back() != ' ' ) if ( back( content ) != ' ' )
content.append( ' ' ); append( content, ' ' );
move_fwd(); move_fwd();
@ -421,7 +421,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
// Escaped newlines // Escaped newlines
if ( scanner[0] == '\\' ) if ( scanner[0] == '\\' )
{ {
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
s32 amount_to_skip = 1; s32 amount_to_skip = 1;
if ( tokleft > 1 && scanner[1] == '\n' ) if ( tokleft > 1 && scanner[1] == '\n' )
@ -448,7 +448,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
// Consectuive spaces // Consectuive spaces
if ( tokleft > 1 && char_is_space( scanner[0] ) && char_is_space( scanner[ 1 ] ) ) if ( tokleft > 1 && char_is_space( scanner[0] ) && char_is_space( scanner[ 1 ] ) )
{ {
content.append( cut_ptr, cut_length ); append( content, cut_ptr, cut_length );
do do
{ {
move_fwd(); move_fwd();
@ -458,8 +458,8 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr );
// Preserve only 1 space of formattting // Preserve only 1 space of formattting
if ( content.back() != ' ' ) if ( back( content ) != ' ' )
content.append( ' ' ); append( content, ' ' );
continue; continue;
} }
@ -469,7 +469,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true )
if ( last_cut < raw_text.Len ) if ( last_cut < raw_text.Len )
{ {
content.append( cut_ptr, raw_text.Len - last_cut ); append( content, cut_ptr, raw_text.Len - last_cut );
} }
#undef cut_ptr #undef cut_ptr
@ -1039,8 +1039,8 @@ CodeBody parse_class_struct_body( TokType which, Token name )
if ( attributes ) if ( attributes )
{ {
String fused = String::make_reserve( GlobalAllocator, attributes->Content.length() + more_attributes->Content.length() ); String fused = string_make_reserve( GlobalAllocator, length(attributes->Content) + length(more_attributes->Content) );
fused.append_fmt( "%S %S", attributes->Content, more_attributes->Content ); append_fmt( fused, "%S %S", attributes->Content, more_attributes->Content );
attributes->Name = get_cached_string(fused); attributes->Name = get_cached_string(fused);
attributes->Content = attributes->Name; attributes->Content = attributes->Name;
@ -1484,8 +1484,8 @@ CodeFn parse_function_after_name(
using namespace ECode; using namespace ECode;
String String
name_stripped = String::make( GlobalAllocator, name ); name_stripped = string_make( GlobalAllocator, name );
name_stripped.strip_space(); strip_space(name_stripped);
CodeFn CodeFn
result = (CodeFn) make_code(); result = (CodeFn) make_code();
@ -4114,7 +4114,7 @@ CodeOpCast parse_operator_cast( CodeSpecifiers specifiers )
Code type = parse_type(); Code type = parse_type();
// <Specifiers> <Qualifier> :: ... operator <UnderlyingType> // <Specifiers> <Qualifier> :: ... operator <UnderlyingType>
Context.Scope->Name = { type->Name.Data, type->Name.length() }; Context.Scope->Name = { type->Name.Data, length(type->Name) };
eat( TokType::Capture_Start ); eat( TokType::Capture_Start );
eat( TokType::Capture_End ); eat( TokType::Capture_End );

View File

@ -1099,10 +1099,10 @@ String csv_write_string_delimiter( AllocatorInfo a, CSV_Object* obj, char delimi
FileInfo tmp; FileInfo tmp;
file_stream_new( &tmp, a ); file_stream_new( &tmp, a );
csv_write_delimiter( &tmp, obj, delimiter ); csv_write_delimiter( &tmp, obj, delimiter );
ssize fsize; ssize fsize;
u8* buf = file_stream_buf( &tmp, &fsize ); u8* buf = file_stream_buf( &tmp, &fsize );
String output = String::make_length( a, ( char* )buf, fsize ); String output = string_make_length( a, ( char* )buf, fsize );
file_close( &tmp ); file_close( &tmp );
return output; return output;
} }

View File

@ -1,5 +1,3 @@
#define GEN_SUPPORT_CPP_MEMBER_FEATURES 0
#ifdef GEN_INTELLISENSE_DIRECTIVES #ifdef GEN_INTELLISENSE_DIRECTIVES
# pragma once # pragma once
#endif #endif

View File

@ -422,7 +422,7 @@ neverinline ssize str_fmt_va( char* text, ssize max_len, char const* fmt, va_lis
{ {
String gen_str = String { va_arg( va, char*) }; String gen_str = String { va_arg( va, char*) };
info.precision = gen_str.length(); info.precision = length(gen_str);
len = _print_string( text, remaining, &info, gen_str ); len = _print_string( text, remaining, &info, gen_str );
} }
break; break;

View File

@ -8,7 +8,7 @@
// Constant string with length. // Constant string with length.
struct StrC struct StrC
{ {
ssize Len; ssize Len;
char const* Ptr; char const* Ptr;
operator char const* () const { return Ptr; } operator char const* () const { return Ptr; }
@ -28,10 +28,14 @@ StrC to_str( char const* str ) {
// They used a header pattern // They used a header pattern
// I kept it for simplicty of porting but its not necessary to keep it that way. // I kept it for simplicty of porting but its not necessary to keep it that way.
#pragma region String #pragma region String
struct String;
struct StringHeader; struct StringHeader;
// Forward declarations for all file-scope functions #if GEN_COMPILER_C
typedef char* String;
#else
struct String;
#endif
String string_make(AllocatorInfo allocator, char const* str); String string_make(AllocatorInfo allocator, char const* str);
String string_make(AllocatorInfo allocator, StrC str); String string_make(AllocatorInfo allocator, StrC str);
String string_make_reserve(AllocatorInfo allocator, ssize capacity); String string_make_reserve(AllocatorInfo allocator, ssize capacity);
@ -73,11 +77,33 @@ struct StringHeader {
ssize Length; ssize Length;
}; };
#if ! GEN_COMPILER_C
struct String struct String
{ {
char* Data; char* Data;
#if 1 forceinline operator bool() { return Data != nullptr; }
forceinline operator char*() { return Data; }
forceinline operator char const*() const { return Data; }
forceinline operator StrC() const { return { length(* this), Data }; }
String const& operator=(String const& other) const {
if (this == &other)
return *this;
String* this_ = ccast(String*, this);
this_->Data = other.Data;
return *this;
}
forceinline char& operator[](ssize index) { return Data[index]; }
forceinline char const& operator[](ssize index) const { return Data[index]; }
forceinline char* begin() const { return Data; }
forceinline char* end() const { return Data + length(* this); }
#if GEN_SUPPORT_CPP_MEMBER_FEATURES
#pragma region Member Mapping #pragma region Member Mapping
forceinline static String make(AllocatorInfo allocator, char const* str) { return GEN_NS string_make(allocator, str); } forceinline static String make(AllocatorInfo allocator, char const* str) { return GEN_NS string_make(allocator, str); }
forceinline static String make(AllocatorInfo allocator, StrC str) { return GEN_NS string_make(allocator, str); } forceinline static String make(AllocatorInfo allocator, StrC str) { return GEN_NS string_make(allocator, str); }
@ -143,30 +169,14 @@ struct String
return GEN_NS append(*this, buf, res); return GEN_NS append(*this, buf, res);
} }
forceinline operator bool() { return Data != nullptr; }
forceinline operator char*() { return Data; }
forceinline operator char const*() const { return Data; }
forceinline operator StrC() const { return { length(), Data }; }
String const& operator=(String const& other) const {
if (this == &other)
return *this;
String* this_ = ccast(String*, this);
this_->Data = other.Data;
return *this;
}
forceinline char& operator[](ssize index) { return Data[index]; }
forceinline char const& operator[](ssize index) const { return Data[index]; }
forceinline char* begin() const { return Data; }
forceinline char* end() const { return Data + length(); }
#pragma endregion Member Mapping #pragma endregion Member Mapping
#endif #endif
}; };
#endif
inline char* begin(String& str) { return str; }
inline char* end(String& str) { return scast(char*, str) + length(str); }
inline char* next(String& str) { return scast(char*, str) + 1; }
inline inline
usize string_grow_formula(usize value) { usize string_grow_formula(usize value) {
@ -247,9 +257,9 @@ bool append(String& str, char const* str_to_append, ssize append_length)
StringHeader& header = get_header(str); StringHeader& header = get_header(str);
mem_copy(str.Data + curr_len, str_to_append, append_length); mem_copy( scast(char*, str) + curr_len, str_to_append, append_length);
str.Data[curr_len + append_length] = '\0'; str[curr_len + append_length] = '\0';
header.Length = curr_len + append_length; header.Length = curr_len + append_length;
} }
@ -263,7 +273,19 @@ bool append(String& str, StrC str_to_append) {
inline inline
bool append(String& str, const String other) { bool append(String& str, const String other) {
return append(str, other.Data, length(other)); return append(str, other, length(other));
}
bool append_fmt(String& str, char const* fmt, ...) {
ssize res;
char buf[GEN_PRINTF_MAXLEN] = { 0 };
va_list va;
va_start(va, fmt);
res = str_fmt_va(buf, count_of(buf) - 1, fmt, va) - 1;
va_end(va);
return append(str, buf, res);
} }
inline inline
@ -294,7 +316,7 @@ bool are_equal(String lhs, StrC rhs)
inline inline
ssize avail_space(String const& str) { ssize avail_space(String const& str) {
StringHeader const& header = *rcast(StringHeader const*, str.Data - sizeof(StringHeader)); StringHeader const& header = *rcast(StringHeader const*, scast(char const*, str) - sizeof(StringHeader));
return header.Capacity - header.Length; return header.Capacity - header.Length;
} }
@ -306,7 +328,7 @@ char& back(String& str) {
inline inline
bool contains(String const& str, StrC substring) bool contains(String const& str, StrC substring)
{ {
StringHeader const& header = *rcast(StringHeader const*, str.Data - sizeof(StringHeader)); StringHeader const& header = *rcast(StringHeader const*, scast(char const*, str) - sizeof(StringHeader));
if (substring.Len > header.Length) if (substring.Len > header.Length)
return false; return false;
@ -326,7 +348,7 @@ bool contains(String const& str, StrC substring)
inline inline
bool contains(String const& str, String const& substring) bool contains(String const& str, String const& substring)
{ {
StringHeader const& header = *rcast(StringHeader const*, str.Data - sizeof(StringHeader)); StringHeader const& header = *rcast(StringHeader const*, scast(char const*, str) - sizeof(StringHeader));
if (length(substring) > header.Length) if (length(substring) > header.Length)
return false; return false;
@ -345,7 +367,7 @@ bool contains(String const& str, String const& substring)
inline inline
ssize capacity(String const& str) { ssize capacity(String const& str) {
StringHeader const& header = *rcast(StringHeader const*, str.Data - sizeof(StringHeader)); StringHeader const& header = *rcast(StringHeader const*, scast(char const*, str) - sizeof(StringHeader));
return header.Capacity; return header.Capacity;
} }
@ -356,7 +378,7 @@ void clear(String& str) {
inline inline
String duplicate(String const& str, AllocatorInfo allocator) { String duplicate(String const& str, AllocatorInfo allocator) {
return string_make_length(allocator, str.Data, length(str)); return string_make_length(allocator, str, length(str));
} }
inline inline
@ -376,7 +398,7 @@ StringHeader& get_header(String& str) {
inline inline
ssize length(String const& str) ssize length(String const& str)
{ {
StringHeader const& header = *rcast(StringHeader const*, str.Data - sizeof(StringHeader)); StringHeader const& header = *rcast(StringHeader const*, scast(char const*, str) - sizeof(StringHeader));
return header.Length; return header.Length;
} }
@ -511,10 +533,10 @@ void trim_space(String& str) {
inline inline
String visualize_whitespace(String const& str) String visualize_whitespace(String const& str)
{ {
StringHeader* header = (StringHeader*)(str.Data - sizeof(StringHeader)); StringHeader* header = (StringHeader*)(scast(char const*, str) - sizeof(StringHeader));
String result = string_make_reserve(header->Allocator, length(str) * 2); // Assume worst case for space requirements. String result = string_make_reserve(header->Allocator, length(str) * 2); // Assume worst case for space requirements.
for (char c : str) switch (c) for (auto c : str) switch (c)
{ {
case ' ': case ' ':
append(result, txt("·")); append(result, txt("·"));
@ -549,10 +571,10 @@ struct String_POD {
static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" ); static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" );
// Implements basic string interning. Data structure is based off the ZPL Hashtable. // Implements basic string interning. Data structure is based off the ZPL Hashtable.
using StringTable = HashTable<String const>; typedef HashTable<String const> StringTable;
// Represents strings cached with the string table. // Represents strings cached with the string table.
// Should never be modified, if changed string is desired, cache_string( str ) another. // Should never be modified, if changed string is desired, cache_string( str ) another.
using StringCached = String const; typedef String const StringCached;
#pragma endregion Strings #pragma endregion Strings

View File

@ -20,14 +20,14 @@ CodeBody gen_ecode( char const* path )
Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes; Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes;
String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String enum_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
String to_str_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String to_str_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
for ( ADT_Node node : enum_strs ) for ( ADT_Node node : enum_strs )
{ {
char const* code = node.string; char const* code = node.string;
enum_entries.append_fmt( "%s,\n", code ); append_fmt( enum_entries, "%s,\n", code );
to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", code, code ); append_fmt( to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", code, code );
} }
CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { <entries> NumTypes };")); CodeEnum enum_code = parse_enum(gen::token_fmt_impl((3 + 1) / 2, "entries", (StrC)enum_entries, "enum Type : u32 { <entries> NumTypes };"));
@ -67,16 +67,16 @@ CodeBody gen_eoperator( char const* path )
Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes; Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes;
Array<ADT_Node> str_strs = csv_nodes.nodes[1].nodes; Array<ADT_Node> str_strs = csv_nodes.nodes[1].nodes;
String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String enum_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
String to_str_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String to_str_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
for (usize idx = 0; idx < num(enum_strs); idx++) for (usize idx = 0; idx < num(enum_strs); idx++)
{ {
char const* enum_str = enum_strs[idx].string; char const* enum_str = enum_strs[idx].string;
char const* entry_to_str = str_strs [idx].string; char const* entry_to_str = str_strs [idx].string;
enum_entries.append_fmt( "%s,\n", enum_str ); append_fmt( enum_entries, "%s,\n", enum_str );
to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); append_fmt( to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
} }
CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, stringize( CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, stringize(
@ -123,16 +123,16 @@ CodeBody gen_especifier( char const* path )
Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes; Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes;
Array<ADT_Node> str_strs = csv_nodes.nodes[1].nodes; Array<ADT_Node> str_strs = csv_nodes.nodes[1].nodes;
String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String enum_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
String to_str_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); String to_str_entries = string_make_reserve( GlobalAllocator, kilobytes(1) );
for (usize idx = 0; idx < num(enum_strs); idx++) for (usize idx = 0; idx < num(enum_strs); idx++)
{ {
char const* enum_str = enum_strs[idx].string; char const* enum_str = enum_strs[idx].string;
char const* entry_to_str = str_strs [idx].string; char const* entry_to_str = str_strs [idx].string;
enum_entries.append_fmt( "%s,\n", enum_str ); append_fmt( enum_entries, "%s,\n", enum_str );
to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); append_fmt( to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
} }
CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, stringize( CodeEnum enum_code = parse_enum(token_fmt("entries", (StrC)enum_entries, stringize(
@ -237,19 +237,19 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
Array<ADT_Node> attribute_strs = csv_attr_nodes.nodes[0].nodes; Array<ADT_Node> attribute_strs = csv_attr_nodes.nodes[0].nodes;
Array<ADT_Node> attribute_str_strs = csv_attr_nodes.nodes[1].nodes; Array<ADT_Node> attribute_str_strs = csv_attr_nodes.nodes[1].nodes;
String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(2) ); String enum_entries = string_make_reserve( GlobalAllocator, kilobytes(2) );
String to_str_entries = String::make_reserve( GlobalAllocator, kilobytes(4) ); String to_str_entries = string_make_reserve( GlobalAllocator, kilobytes(4) );
String attribute_entries = String::make_reserve( GlobalAllocator, kilobytes(2) ); String attribute_entries = string_make_reserve( GlobalAllocator, kilobytes(2) );
String to_str_attributes = String::make_reserve( GlobalAllocator, kilobytes(4) ); String to_str_attributes = string_make_reserve( GlobalAllocator, kilobytes(4) );
String attribute_define_entries = String::make_reserve( GlobalAllocator, kilobytes(4) ); String attribute_define_entries = string_make_reserve( GlobalAllocator, kilobytes(4) );
for (usize idx = 0; idx < num(enum_strs); idx++) for (usize idx = 0; idx < num(enum_strs); idx++)
{ {
char const* enum_str = enum_strs[idx].string; char const* enum_str = enum_strs[idx].string;
char const* entry_to_str = enum_str_strs [idx].string; char const* entry_to_str = enum_str_strs [idx].string;
enum_entries.append_fmt( "%s,\n", enum_str ); append_fmt( enum_entries, "%s,\n", enum_str );
to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); append_fmt( to_str_entries, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
} }
for ( usize idx = 0; idx < num(attribute_strs); idx++ ) for ( usize idx = 0; idx < num(attribute_strs); idx++ )
@ -257,14 +257,14 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path )
char const* attribute_str = attribute_strs[idx].string; char const* attribute_str = attribute_strs[idx].string;
char const* entry_to_str = attribute_str_strs [idx].string; char const* entry_to_str = attribute_str_strs [idx].string;
attribute_entries.append_fmt( "Attribute_%s,\n", attribute_str ); append_fmt( attribute_entries, "Attribute_%s,\n", attribute_str );
to_str_attributes.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); append_fmt( to_str_attributes, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str);
attribute_define_entries.append_fmt( "Entry( Attribute_%s, \"%s\" )", attribute_str, entry_to_str ); append_fmt( attribute_define_entries, "Entry( Attribute_%s, \"%s\" )", attribute_str, entry_to_str );
if ( idx < num(attribute_strs) - 1 ) if ( idx < num(attribute_strs) - 1 )
attribute_define_entries.append( " \\\n"); append( attribute_define_entries, " \\\n");
else else
attribute_define_entries.append( "\n"); append( attribute_define_entries, "\n");
} }
#pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS") #pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")