diff --git a/project/auxillary/builder.cpp b/project/auxillary/builder.cpp index 900a03a..4632772 100644 --- a/project/auxillary/builder.cpp +++ b/project/auxillary/builder.cpp @@ -13,7 +13,7 @@ Builder Builder::open( char const* path ) 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 ); return result; @@ -21,7 +21,7 @@ Builder Builder::open( char const* path ) void Builder::pad_lines( s32 num ) { - Buffer.append( "\n" ); + append( Buffer, "\n" ); } void Builder::print( Code code ) @@ -29,7 +29,7 @@ void Builder::print( Code code ) String str = code->to_string(); // const ssize len = str.length(); // 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, ... ) @@ -43,17 +43,17 @@ void Builder::print_fmt( char const* fmt, ... ) va_end( va ); // 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() { - b32 result = file_write( & File, Buffer, Buffer.length() ); + b32 result = file_write( & File, Buffer, length(Buffer) ); if ( result == false ) log_failure("gen::File::write - Failed to write to file: %s\n", file_name( & File ) ); log_fmt( "Generated: %s\n", File.filename ); file_close( & File ); - Buffer.free(); + free(Buffer); } diff --git a/project/auxillary/scanner.hpp b/project/auxillary/scanner.hpp index 97af098..6540a4d 100644 --- a/project/auxillary/scanner.hpp +++ b/project/auxillary/scanner.hpp @@ -23,9 +23,9 @@ Code scan_file( char const* 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 ); - str.get_header().Length = fsize; + get_header(str).Length = fsize; // Skip GEN_INTELLISENSE_DIRECTIVES preprocessor blocks // 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 ) ) { mem_move( str, scanner, left ); - str.get_header().Length = left; + get_header(str).Length = left; break; } mem_move( str, scanner, left ); - str.get_header().Length = left; + get_header(str).Length = left; break; } diff --git a/project/bootstrap.cpp b/project/bootstrap.cpp index e4f2aa7..3214183 100644 --- a/project/bootstrap.cpp +++ b/project/bootstrap.cpp @@ -24,20 +24,20 @@ constexpr char const* generation_notice = 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:")); - style_arg.append("../scripts/.clang-format "); + String style_arg = string_make(GlobalAllocator, txt("-style=file:")); + append( style_arg, "../scripts/.clang-format "); // Need to execute clang format on the generated file to get it to match the original. #define clang_format "clang-format " #define cf_format_inplace "-i " #define cf_verbose "-verbose " - String command = String::make( GlobalAllocator, clang_format ); - command.append( cf_format_inplace ); - command.append( cf_verbose ); - command.append( style_arg ); - command.append( resolved_path ); + String command = string_make( GlobalAllocator, clang_format ); + append( command, cf_format_inplace ); + append( command, cf_verbose ); + append( command, style_arg ); + append( command, resolved_path ); log_fmt("\tRunning clang-format on file:\n"); system( command ); log_fmt("\tclang-format finished reformatting.\n"); diff --git a/project/components/ast.cpp b/project/components/ast.cpp index b19f7ef..d56eebf 100644 --- a/project/components/ast.cpp +++ b/project/components/ast.cpp @@ -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. char const* AST::debug_str() { - String result = String::make_reserve( GlobalAllocator, kilobytes(1) ); + String result = string_make_reserve( GlobalAllocator, kilobytes(1) ); 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 - result.append_fmt( "\n\tParent : %S", "Null" ); + append_fmt( result, "\n\tParent : %S", "Null" ); - result.append_fmt( "\n\tName : %S", Name ? Name : "Null" ); - result.append_fmt( "\n\tType : %S", type_str() ); - result.append_fmt( "\n\tModule Flags : %S", to_str( ModuleFlags ) ); + append_fmt( result, "\n\tName : %S", Name ? Name : "Null" ); + append_fmt( result, "\n\tType : %S", type_str() ); + append_fmt( result, "\n\tModule Flags : %S", to_str( ModuleFlags ) ); switch ( Type ) { @@ -30,9 +30,9 @@ char const* AST::debug_str() case Access_Protected: case Access_Public: 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 ) - 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; case Untyped: @@ -48,74 +48,74 @@ char const* AST::debug_str() case Preprocess_IfDef: case Preprocess_IfNotDef: 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 ) - 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; case Class: case Struct: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); - result.append_fmt( "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); + append_fmt( result, "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Class_Fwd: case Struct_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); - result.append_fmt( "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); + append_fmt( result, "\n\tInlineCmd : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tParentAccess: %s", ParentType ? to_str( ParentAccess ) : "No Parent" ); + append_fmt( result, "\n\tParentType : %s", ParentType ? ParentType->type_str() : "Null" ); break; case Constructor: 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 ) - 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" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Constructor_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tInitializerList: %S", InitializerList ? InitializerList->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); break; case Destructor: 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 ) - 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" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Destructor_Fwd: @@ -124,208 +124,208 @@ char const* AST::debug_str() case Enum: case Enum_Class: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Enum_Fwd: case Enum_Class_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tUnderlying Type : %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); break; case Extern_Linkage: case Namespace: 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 ) - 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; case Friend: 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 ) - 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" ); - result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); break; case Function: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Function_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); break; case Module: 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 ) - 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; case Operator: case Operator_Member: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); - result.append_fmt( "\n\tOp : %S", to_str( Op ) ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tOp : %S", to_str( Op ) ); break; case Operator_Fwd: case Operator_Member_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); - result.append_fmt( "\n\tOp : %S", to_str( Op ) ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tReturnType: %S", ReturnType ? ReturnType->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tOp : %S", to_str( Op ) ); break; case Operator_Cast: 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 ) - 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" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Operator_Cast_Fwd: 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 ) - 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" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); break; case Parameters: - result.append_fmt( "\n\tNumEntries: %d", NumEntries ); - result.append_fmt( "\n\tLast : %S", Last->Name ); - result.append_fmt( "\n\tNext : %S", Next->Name ); - result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); - result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); + append_fmt( result, "\n\tNumEntries: %d", NumEntries ); + append_fmt( result, "\n\tLast : %S", Last->Name ); + append_fmt( result, "\n\tNext : %S", Next->Name ); + append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); + append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" ); break; case Specifiers: { - result.append_fmt( "\n\tNumEntries: %d", NumEntries ); - result.append( "\n\tArrSpecs: " ); + append_fmt( result, "\n\tNumEntries: %d", NumEntries ); + GEN_NS append( result, "\n\tArrSpecs: " ); s32 idx = 0; s32 left = NumEntries; while ( left-- ) { StrC spec = ESpecifier::to_str( ArrSpecs[idx] ); - result.append_fmt( "%.*s, ", spec.Len, spec.Ptr ); + append_fmt( result, "%.*s, ", spec.Len, spec.Ptr ); idx++; } - result.append_fmt( "\n\tNextSpecs: %S", NextSpecs ? NextSpecs->debug_str() : "Null" ); + append_fmt( result, "\n\tNextSpecs: %S", NextSpecs ? NextSpecs->debug_str() : "Null" ); } break; case Template: 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 ) - 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" ); - result.append_fmt( "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tDeclaration: %S", Declaration ? Declaration->to_string() : "Null" ); break; case Typedef: 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 ) - 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" ); - result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); break; case Typename: - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tReturnType : %S", ReturnType ? ReturnType->to_string() : "Null" ); - result.append_fmt( "\n\tParams : %S", Params ? Params->to_string() : "Null" ); - result.append_fmt( "\n\tArrExpr : %S", ArrExpr ? ArrExpr->to_string() : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tReturnType : %S", ReturnType ? ReturnType->to_string() : "Null" ); + append_fmt( result, "\n\tParams : %S", Params ? Params->to_string() : "Null" ); + append_fmt( result, "\n\tArrExpr : %S", ArrExpr ? ArrExpr->to_string() : "Null" ); break; case Union: 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 ) - 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" ); - result.append_fmt( "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); + append_fmt( result, "\n\tAttributes: %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tBody : %S", Body ? Body->debug_str() : "Null" ); break; case Using: 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tUnderlyingType: %S", UnderlyingType ? UnderlyingType->to_string() : "Null" ); break; case Variable: @@ -333,25 +333,25 @@ char const* AST::debug_str() if ( Parent && Parent->Type == Variable ) { // Its a NextVar - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); - result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); - result.append_fmt( "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" ); + append_fmt( result, "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); + append_fmt( result, "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); break; } 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 ) - 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" ); - result.append_fmt( "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); - result.append_fmt( "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); - result.append_fmt( "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); - result.append_fmt( "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); - result.append_fmt( "\n\tValue : %S", Value ? Value->to_string() : "Null" ); - result.append_fmt( "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); + append_fmt( result, "\n\tInlineCmt : %S", InlineCmt ? InlineCmt->Content : "Null" ); + append_fmt( result, "\n\tAttributes : %S", Attributes ? Attributes->to_string() : "Null" ); + append_fmt( result, "\n\tSpecs : %S", Specs ? Specs->to_string() : "Null" ); + append_fmt( result, "\n\tValueType : %S", ValueType ? ValueType->to_string() : "Null" ); + append_fmt( result, "\n\tBitfieldSize: %S", BitfieldSize ? BitfieldSize->to_string() : "Null" ); + append_fmt( result, "\n\tValue : %S", Value ? Value->to_string() : "Null" ); + append_fmt( result, "\n\tNextVar : %S", NextVar ? NextVar->debug_str() : "Null" ); break; } @@ -372,7 +372,7 @@ AST* AST::duplicate() String AST::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -390,25 +390,25 @@ void AST::to_string( String& result ) #ifdef GEN_DONT_ALLOW_INVALID_CODE log_failure("Attempted to serialize invalid code! - %S", Parent ? Parent->debug_str() : Name ); #else - result.append_fmt( "Invalid Code!" ); + append_fmt( result, "Invalid Code!" ); #endif break; case NewLine: - result.append("\n"); + GEN_NS append( result,"\n"); break; case Untyped: case Execution: case Comment: case PlatformAttributes: - result.append( Content ); + GEN_NS append( result, Content ); break; case Access_Private: case Access_Protected: case Access_Public: - result.append( Name ); + GEN_NS append( result, Name ); break; case Class: @@ -659,8 +659,8 @@ bool AST::is_equal( AST* other ) "so it must be verified by eye for now\n" \ "AST Content:\n%S\n" \ "Other Content:\n%S\n" \ - , content.visualize_whitespace() \ - , other->content.visualize_whitespace() \ + , visualize_whitespace(content) \ + , visualize_whitespace(other->content) \ ); \ } diff --git a/project/components/code_serialization.cpp b/project/components/code_serialization.cpp index 208e622..1597e38 100644 --- a/project/components/code_serialization.cpp +++ b/project/components/code_serialization.cpp @@ -15,18 +15,18 @@ String Code::to_string() String CodeAttributes::to_string() { - return ast->Content.duplicate( GlobalAllocator ); + return GEN_NS duplicate( ast->Content, GlobalAllocator ); } String CodeBody::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; case Untyped: case Execution: - result.append( raw()->Content ); + GEN_NS append( result, raw()->Content ); break; case Enum_Body: @@ -53,34 +53,34 @@ void CodeBody::to_string( String& result ) s32 left = ast->NumEntries; while ( left -- ) { - result.append_fmt( "%S", curr.to_string() ); + append_fmt( result, "%S", curr.to_string() ); ++curr; } } void CodeBody::to_string_export( String& result ) { - result.append_fmt( "export\n{\n" ); + append_fmt( result, "export\n{\n" ); Code curr = *this; s32 left = ast->NumEntries; while ( left-- ) { - result.append_fmt( "%S", curr.to_string() ); + append_fmt( result, "%S", curr.to_string() ); ++curr; } - result.append_fmt( "};\n" ); + append_fmt( result, "};\n" ); } String CodeComment::to_string() { - return ast->Content.duplicate( GlobalAllocator ); + return GEN_NS duplicate( ast->Content, GlobalAllocator ); } String CodeConstructor::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch (ast->Type) { using namespace ECode; @@ -98,53 +98,53 @@ void CodeConstructor::to_string_def( String& result ) { AST* ClassStructParent = ast->Parent->Parent; if (ClassStructParent) { - result.append( ClassStructParent->Name ); + append( result, ClassStructParent->Name ); } else { - result.append( ast->Name ); + append( result, ast->Name ); } if ( ast->Params ) - result.append_fmt( "( %S )", ast->Params.to_string() ); + append_fmt( result, "( %S )", ast->Params.to_string() ); else - result.append( "()" ); + append( result, "()" ); if ( ast->InitializerList ) - result.append_fmt( " : %S", ast->InitializerList.to_string() ); + append_fmt( result, " : %S", ast->InitializerList.to_string() ); if ( ast->InlineCmt ) - result.append_fmt( " // %S", ast->InlineCmt->Content ); + append_fmt( result, " // %S", ast->InlineCmt->Content ); - result.append_fmt( "\n{\n%S\n}\n", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}\n", ast->Body.to_string() ); } void CodeConstructor::to_string_fwd( String& result ) { AST* ClassStructParent = ast->Parent->Parent; if (ClassStructParent) { - result.append( ClassStructParent->Name ); + append( result, ClassStructParent->Name ); } else { - result.append( ast->Name ); + append( result, ast->Name ); } if ( ast->Params ) - result.append_fmt( "( %S )", ast->Params.to_string() ); + append_fmt( result, "( %S )", ast->Params.to_string() ); else - result.append_fmt("()"); + append_fmt( result, "()"); if (ast->Body) - result.append_fmt( " = %S", ast->Body.to_string() ); + append_fmt( result, " = %S", ast->Body.to_string() ); if ( ast->InlineCmt ) - result.append_fmt( "; // %S\n", ast->InlineCmt->Content ); + append_fmt( result, "; // %S\n", ast->InlineCmt->Content ); else - result.append( ";\n" ); + append( result, ";\n" ); } String CodeClass::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -161,80 +161,80 @@ String CodeClass::to_string() void CodeClass::to_string_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append( "class " ); + append( result, "class " ); if ( ast->Attributes ) { - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); } if ( ast->ParentType ) { char const* access_level = to_str( ast->ParentAccess ); - result.append_fmt( "%S : %s %S", ast->Name, access_level, ast->ParentType.to_string() ); + append_fmt( result, "%S : %s %S", ast->Name, access_level, ast->ParentType.to_string() ); CodeType interface = ast->ParentType->Next->cast< CodeType >(); if ( interface ) - result.append( "\n" ); + append( result, "\n" ); while ( interface ) { - result.append_fmt( ", %S", interface.to_string() ); + append_fmt( result, ", %S", interface.to_string() ); interface = interface->Next ? interface->Next->cast< CodeType >() : CodeType { nullptr }; } } else if ( ast->Name ) { - result.append( ast->Name ); + append( result, ast->Name ); } if ( ast->InlineCmt ) { - result.append_fmt( " // %S", ast->InlineCmt->Content ); + append_fmt( result, " // %S", ast->InlineCmt->Content ); } - result.append_fmt( "\n{\n%S\n}", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}", ast->Body.to_string() ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) - result.append(";\n"); + append( result, ";\n"); } void CodeClass::to_string_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "class %S %S", ast->Attributes.to_string(), ast->Name ); + append_fmt( result, "class %S %S", ast->Attributes.to_string(), ast->Name ); - else result.append_fmt( "class %S", ast->Name ); + else append_fmt( result, "class %S", ast->Name ); // Check if it can have an end-statement if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) { if ( ast->InlineCmt ) - result.append_fmt( "; // %S\n", ast->InlineCmt->Content ); + append_fmt( result, "; // %S\n", ast->InlineCmt->Content ); else - result.append(";\n"); + append( result,";\n"); } } String CodeDefine::to_string() { - return String::fmt_buf( GlobalAllocator, "#define %S %S\n", ast->Name, ast->Content ); + return string_fmt_buf( GlobalAllocator, "#define %S %S\n", ast->Name, ast->Content ); } void CodeDefine::to_string( String& result ) { - result.append_fmt( "#define %S %S\n", ast->Name, ast->Content ); + append_fmt( result, "#define %S %S\n", ast->Name, ast->Content ); } String CodeDestructor::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -252,19 +252,19 @@ void CodeDestructor::to_string_def( String& result ) { if ( ast->Name ) { - result.append_fmt( "%S()", ast->Name ); + append_fmt( result, "%S()", ast->Name ); } else if ( ast->Specs ) { if ( ast->Specs.has( ESpecifier::Virtual ) ) - result.append_fmt( "virtual ~%S()", ast->Parent->Name ); + append_fmt( result, "virtual ~%S()", ast->Parent->Name ); else - result.append_fmt( "~%S()", ast->Parent->Name ); + append_fmt( result, "~%S()", ast->Parent->Name ); } else - result.append_fmt( "~%S()", ast->Parent->Name ); + append_fmt( result, "~%S()", ast->Parent->Name ); - result.append_fmt( "\n{\n%S\n}\n", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}\n", ast->Body.to_string() ); } void CodeDestructor::to_string_fwd( String& result ) @@ -272,27 +272,27 @@ void CodeDestructor::to_string_fwd( String& result ) if ( ast->Specs ) { if ( ast->Specs.has( ESpecifier::Virtual ) ) - result.append_fmt( "virtual ~%S();\n", ast->Parent->Name ); + append_fmt( result, "virtual ~%S();\n", ast->Parent->Name ); else - result.append_fmt( "~%S()", ast->Parent->Name ); + append_fmt( result, "~%S()", ast->Parent->Name ); if ( ast->Specs.has( ESpecifier::Pure ) ) - result.append( " = 0;" ); + append( result, " = 0;" ); else if (ast->Body) - result.append_fmt( " = %S;", ast->Body.to_string() ); + append_fmt( result, " = %S;", ast->Body.to_string() ); } else - result.append_fmt( "~%S();", ast->Parent->Name ); + append_fmt( result, "~%S();", ast->Parent->Name ); if ( ast->InlineCmt ) - result.append_fmt( " %S", ast->InlineCmt->Content ); + append_fmt( result, " %S", ast->InlineCmt->Content ); else - result.append("\n"); + append( result, "\n"); } String CodeEnum::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -315,150 +315,150 @@ String CodeEnum::to_string() void CodeEnum::to_string_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes || ast->UnderlyingType ) { - result.append( "enum " ); + append( result, "enum " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->UnderlyingType ) - result.append_fmt( "%S : %S\n{\n%S\n}" + append_fmt( result, "%S : %S\n{\n%S\n}" , ast->Name , ast->UnderlyingType.to_string() , ast->Body.to_string() ); - else result.append_fmt( "%S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); + else append_fmt( result, "%S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); } - else result.append_fmt( "enum %S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); + else append_fmt( result, "enum %S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) - result.append(";\n"); + append( result, ";\n"); } void CodeEnum::to_string_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); - result.append_fmt( "enum %S : %S", ast->Name, ast->UnderlyingType.to_string() ); + append_fmt( result, "enum %S : %S", ast->Name, ast->UnderlyingType.to_string() ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) { if ( ast->InlineCmt ) - result.append_fmt("; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append(";\n"); + append( result, ";\n"); } } void CodeEnum::to_string_class_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes || ast->UnderlyingType ) { - result.append( "enum class " ); + append( result, "enum class " ); if ( ast->Attributes ) { - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); } if ( ast->UnderlyingType ) { - result.append_fmt( "%S : %S\n{\n%S\n}", ast->Name, ast->UnderlyingType.to_string(), ast->Body.to_string() ); + append_fmt( result, "%S : %S\n{\n%S\n}", ast->Name, ast->UnderlyingType.to_string(), ast->Body.to_string() ); } else { - result.append_fmt( "%S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); + append_fmt( result, "%S\n{\n%S\n}", ast->Name, ast->Body.to_string() ); } } else { - result.append_fmt( "enum class %S\n{\n%S\n}", ast->Body.to_string() ); + append_fmt( result, "enum class %S\n{\n%S\n}", ast->Body.to_string() ); } if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) - result.append(";\n"); + append( result, ";\n"); } void CodeEnum::to_string_class_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append( "enum class " ); + append( result, "enum class " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); - result.append_fmt( "%S : %S", ast->Name, ast->UnderlyingType.to_string() ); + append_fmt( result, "%S : %S", ast->Name, ast->UnderlyingType.to_string() ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) { if ( ast->InlineCmt ) - result.append_fmt("; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append(";\n"); + append( result, ";\n"); } } String CodeExec::to_string() { - return ast->Content.duplicate( GlobalAllocator ); + return GEN_NS duplicate( ast->Content, GlobalAllocator ); } void CodeExtern::to_string( String& result ) { if ( ast->Body ) - result.append_fmt( "extern \"%S\"\n{\n%S\n}\n", ast->Name, ast->Body.to_string() ); + append_fmt( result, "extern \"%S\"\n{\n%S\n}\n", ast->Name, ast->Body.to_string() ); else - result.append_fmt( "extern \"%S\"\n{}\n", ast->Name ); + append_fmt( result, "extern \"%S\"\n{}\n", ast->Name ); } String CodeInclude::to_string() { - return String::fmt_buf( GlobalAllocator, "#include %S\n", ast->Content ); + return string_fmt_buf( GlobalAllocator, "#include %S\n", ast->Content ); } void CodeInclude::to_string( String& result ) { - result.append_fmt( "#include %S\n", ast->Content ); + append_fmt( result, "#include %S\n", ast->Content ); } String CodeFriend::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } void CodeFriend::to_string( String& result ) { - result.append_fmt( "friend %S", ast->Declaration->to_string() ); + append_fmt( result, "friend %S", ast->Declaration->to_string() ); - if ( ast->Declaration->Type != ECode::Function && result[ result.length() - 1 ] != ';' ) + if ( ast->Declaration->Type != ECode::Function && result[ length(result) - 1 ] != ';' ) { - result.append( ";" ); + append( result, ";" ); } if ( ast->InlineCmt ) - result.append_fmt(" %S", ast->InlineCmt->Content ); + append_fmt( result, " %S", ast->InlineCmt->Content ); else - result.append("\n"); + append( result, "\n"); } String CodeFn::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -475,10 +475,10 @@ String CodeFn::to_string() void CodeFn::to_string_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export" ); + append( result, "export" ); if ( ast->Attributes ) - result.append_fmt( " %S ", ast->Attributes.to_string() ); + append_fmt( result, " %S ", ast->Attributes.to_string() ); bool prefix_specs = false; if ( ast->Specs ) @@ -488,7 +488,7 @@ void CodeFn::to_string_def( String& result ) if ( ! ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); prefix_specs = true; } @@ -496,19 +496,19 @@ void CodeFn::to_string_def( String& result ) } if ( ast->Attributes || prefix_specs ) - result.append( "\n" ); + append( result, "\n" ); if ( ast->ReturnType ) - result.append_fmt( "%S %S(", ast->ReturnType.to_string(), ast->Name ); + append_fmt( result, "%S %S(", ast->ReturnType.to_string(), ast->Name ); else - result.append_fmt( "%S(", ast->Name ); + append_fmt( result, "%S(", ast->Name ); if ( ast->Params ) - result.append_fmt( "%S)", ast->Params.to_string() ); + append_fmt( result, "%S)", ast->Params.to_string() ); else - result.append( ")" ); + append( result, ")" ); if ( ast->Specs ) { @@ -517,21 +517,21 @@ void CodeFn::to_string_def( String& result ) if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } - result.append_fmt( "\n{\n%S\n}\n", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}\n", ast->Body.to_string() ); } void CodeFn::to_string_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); b32 prefix_specs = false; if ( ast->Specs ) @@ -541,7 +541,7 @@ void CodeFn::to_string_fwd( String& result ) if ( ! ESpecifier::is_trailing( spec ) || ! (spec != ESpecifier::Pure) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); prefix_specs = true; } @@ -550,20 +550,20 @@ void CodeFn::to_string_fwd( String& result ) if ( ast->Attributes || prefix_specs ) { - result.append("\n" ); + append( result, "\n" ); } if ( ast->ReturnType ) - result.append_fmt( "%S %S(", ast->ReturnType.to_string(), ast->Name ); + append_fmt( result, "%S %S(", ast->ReturnType.to_string(), ast->Name ); else - result.append_fmt( "%S(", ast->Name ); + append_fmt( result, "%S(", ast->Name ); if ( ast->Params ) - result.append_fmt( "%S)", ast->Params.to_string() ); + append_fmt( result, "%S)", ast->Params.to_string() ); else - result.append( ")" ); + append( result, ")" ); if ( ast->Specs ) { @@ -572,25 +572,25 @@ void CodeFn::to_string_fwd( String& result ) if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } if ( ast->Specs && ast->Specs.has( ESpecifier::Pure ) >= 0 ) - result.append( " = 0;" ); + append( result, " = 0;" ); else if (ast->Body) - result.append_fmt( " = %S;", ast->Body.to_string() ); + append_fmt( result, " = %S;", ast->Body.to_string() ); if ( ast->InlineCmt ) - result.append_fmt( "; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append( ";\n" ); + append( result, ";\n" ); } String CodeModule::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -598,17 +598,17 @@ String CodeModule::to_string() void CodeModule::to_string( String& result ) { if (((u32(ModuleFlag::Export) & u32(ast->ModuleFlags)) == u32(ModuleFlag::Export))) - result.append("export "); + append( result, "export "); if (((u32(ModuleFlag::Import) & u32(ast->ModuleFlags)) == u32(ModuleFlag::Import))) - result.append("import "); + append( result, "import "); - result.append_fmt( "%S;\n", ast->Name ); + append_fmt( result, "%S;\n", ast->Name ); } String CodeNS::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -616,14 +616,14 @@ String CodeNS::to_string() void CodeNS::to_string( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append_fmt( "namespace %S\n{\n%S\n}\n", ast->Name , ast->Body.to_string() ); + append_fmt( result, "namespace %S\n{\n%S\n}\n", ast->Name , ast->Body.to_string() ); } String CodeOperator::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -642,13 +642,13 @@ String CodeOperator::to_string() void CodeOperator::to_string_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->Specs ) { @@ -657,24 +657,24 @@ void CodeOperator::to_string_def( String& result ) if ( ! ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } if ( ast->Attributes || ast->Specs ) { - result.append("\n" ); + append( result, "\n" ); } if ( ast->ReturnType ) - result.append_fmt( "%S %S (", ast->ReturnType.to_string(), ast->Name ); + append_fmt( result, "%S %S (", ast->ReturnType.to_string(), ast->Name ); if ( ast->Params ) - result.append_fmt( "%S)", ast->Params.to_string() ); + append_fmt( result, "%S)", ast->Params.to_string() ); else - result.append( ")" ); + append( result, ")" ); if ( ast->Specs ) { @@ -683,12 +683,12 @@ void CodeOperator::to_string_def( String& result ) if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } - result.append_fmt( "\n{\n%S\n}\n" + append_fmt( result, "\n{\n%S\n}\n" , ast->Body.to_string() ); } @@ -696,10 +696,10 @@ void CodeOperator::to_string_def( String& result ) void CodeOperator::to_string_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "%S\n", ast->Attributes.to_string() ); + append_fmt( result, "%S\n", ast->Attributes.to_string() ); if ( ast->Specs ) { @@ -708,23 +708,23 @@ void CodeOperator::to_string_fwd( String& result ) if ( ! ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } if ( ast->Attributes || ast->Specs ) { - result.append("\n" ); + append( result, "\n" ); } - result.append_fmt( "%S %S (", ast->ReturnType.to_string(), ast->Name ); + append_fmt( result, "%S %S (", ast->ReturnType.to_string(), ast->Name ); if ( ast->Params ) - result.append_fmt( "%S)", ast->Params.to_string() ); + append_fmt( result, "%S)", ast->Params.to_string() ); else - result.append_fmt( ")" ); + append_fmt( result, ")" ); if ( ast->Specs ) { @@ -733,20 +733,20 @@ void CodeOperator::to_string_fwd( String& result ) if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } } if ( ast->InlineCmt ) - result.append_fmt( "; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append( ";\n" ); + append( result, ";\n" ); } String CodeOpCast::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -769,32 +769,32 @@ void CodeOpCast::to_string_def( String& result ) if ( ! ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( "%*s ", spec_str.Len, spec_str.Ptr ); + append_fmt( result, "%*s ", spec_str.Len, spec_str.Ptr ); } } - if ( ast->Name && ast->Name.length() ) - result.append_fmt( "%Soperator %S()", ast->Name, ast->ValueType.to_string() ); + if ( ast->Name && length(ast->Name) ) + append_fmt( result, "%Soperator %S()", ast->Name, ast->ValueType.to_string() ); else - result.append_fmt( "operator %S()", ast->ValueType.to_string() ); + append_fmt( result, "operator %S()", ast->ValueType.to_string() ); for ( SpecifierT spec : ast->Specs ) { if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %.*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %.*s", spec_str.Len, spec_str.Ptr ); } } - result.append_fmt( "\n{\n%S\n}\n", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}\n", ast->Body.to_string() ); return; } - if ( ast->Name && ast->Name.length() ) - result.append_fmt("%Soperator %S()\n{\n%S\n}\n", ast->Name, ast->ValueType.to_string(), ast->Body.to_string() ); + if ( ast->Name && length(ast->Name) ) + append_fmt( result, "%Soperator %S()\n{\n%S\n}\n", ast->Name, ast->ValueType.to_string(), ast->Body.to_string() ); else - result.append_fmt("operator %S()\n{\n%S\n}\n", ast->ValueType.to_string(), ast->Body.to_string() ); + append_fmt( result, "operator %S()\n{\n%S\n}\n", ast->ValueType.to_string(), ast->Body.to_string() ); } void CodeOpCast::to_string_fwd( String& result ) @@ -806,37 +806,37 @@ void CodeOpCast::to_string_fwd( String& result ) if ( ! ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( "%*s ", spec_str.Len, spec_str.Ptr ); + append_fmt( result, "%*s ", spec_str.Len, spec_str.Ptr ); } } - result.append_fmt( "operator %S()", ast->ValueType.to_string() ); + append_fmt( result, "operator %S()", ast->ValueType.to_string() ); for ( SpecifierT spec : ast->Specs ) { if ( ESpecifier::is_trailing( spec ) ) { StrC spec_str = ESpecifier::to_str( spec ); - result.append_fmt( " %*s", spec_str.Len, spec_str.Ptr ); + append_fmt( result, " %*s", spec_str.Len, spec_str.Ptr ); } } if ( ast->InlineCmt ) - result.append_fmt( "; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append( ";\n" ); + append( result, ";\n" ); return; } if ( ast->InlineCmt ) - result.append_fmt("operator %S(); %S", ast->ValueType.to_string() ); + append_fmt( result, "operator %S(); %S", ast->ValueType.to_string() ); else - result.append_fmt("operator %S();\n", ast->ValueType.to_string() ); + append_fmt( result, "operator %S();\n", ast->ValueType.to_string() ); } String CodeParam::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -846,41 +846,41 @@ void CodeParam::to_string( String& result ) if ( ast->Macro ) { // Related to parsing: ( , ... ) - result.append( ast->Macro.ast->Content ); + GEN_NS append( result, ast->Macro.ast->Content ); // Could also be: ( , ... ) } if ( ast->Name ) { if ( ast->ValueType.ast == nullptr ) - result.append_fmt( " %S", ast->Name ); + append_fmt( result, " %S", ast->Name ); else - result.append_fmt( " %S %S", ast->ValueType.to_string(), ast->Name ); + append_fmt( result, " %S %S", ast->ValueType.to_string(), ast->Name ); } else if ( ast->ValueType ) - result.append_fmt( " %S", ast->ValueType.to_string() ); + append_fmt( result, " %S", ast->ValueType.to_string() ); if ( ast->PostNameMacro ) { - result.append_fmt(" %S", ast->PostNameMacro.to_string() ); + append_fmt( result, " %S", ast->PostNameMacro.to_string() ); } if ( ast->Value ) - result.append_fmt( " = %S", ast->Value.to_string() ); + append_fmt( result, " = %S", ast->Value.to_string() ); if ( ast->NumEntries - 1 > 0 ) { for ( CodeParam param : ast->Next ) { - result.append_fmt( ", %S", param.to_string() ); + append_fmt( result, ", %S", param.to_string() ); } } } String CodePreprocessCond::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -908,49 +908,49 @@ String CodePreprocessCond::to_string() void CodePreprocessCond::to_string_if( String& result ) { - result.append_fmt( "#if %S\n", ast->Content ); + append_fmt( result, "#if %S\n", ast->Content ); } void CodePreprocessCond::to_string_ifdef( String& result ) { - result.append_fmt( "#ifdef %S\n", ast->Content ); + append_fmt( result, "#ifdef %S\n", ast->Content ); } void CodePreprocessCond::to_string_ifndef( String& result ) { - result.append_fmt( "#ifndef %S\n", ast->Content ); + append_fmt( result, "#ifndef %S\n", ast->Content ); } void CodePreprocessCond::to_string_elif( String& result ) { - result.append_fmt( "#elif %S\n", ast->Content ); + append_fmt( result, "#elif %S\n", ast->Content ); } void CodePreprocessCond::to_string_else( String& result ) { - result.append_fmt( "#else\n" ); + append_fmt( result, "#else\n" ); } void CodePreprocessCond::to_string_endif( String& result ) { - result.append_fmt( "#endif\n" ); + append_fmt( result, "#endif\n" ); } String CodePragma::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } void CodePragma::to_string( String& result ) { - result.append_fmt( "#pragma %S\n", ast->Content ); + append_fmt( result, "#pragma %S\n", ast->Content ); } String CodeSpecifiers::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -962,14 +962,14 @@ void CodeSpecifiers::to_string( String& result ) while ( left-- ) { StrC spec = ESpecifier::to_str( ast->ArrSpecs[idx] ); - result.append_fmt( "%.*s ", spec.Len, spec.Ptr ); + append_fmt( result, "%.*s ", spec.Len, spec.Ptr ); idx++; } } String CodeStruct::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -986,69 +986,69 @@ String CodeStruct::to_string() void CodeStruct::to_string_def( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append( "struct " ); + append( result, "struct " ); if ( ast->Attributes ) { - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); } if ( ast->ParentType ) { char const* access_level = to_str( ast->ParentAccess ); - result.append_fmt( "%S : %s %S", ast->Name, access_level, ast->ParentType.to_string() ); + append_fmt( result, "%S : %s %S", ast->Name, access_level, ast->ParentType.to_string() ); CodeType interface = ast->ParentType->Next->cast< CodeType >(); if ( interface ) - result.append( "\n" ); + append( result, "\n" ); while ( interface ) { - result.append_fmt( ", %S", interface.to_string() ); + append_fmt( result, ", %S", interface.to_string() ); interface = interface->Next ? interface->Next->cast< CodeType >() : CodeType { nullptr }; } } else if ( ast->Name ) { - result.append( ast->Name ); + append( result, ast->Name ); } if ( ast->InlineCmt ) { - result.append_fmt( " // %S", ast->InlineCmt->Content ); + append_fmt( result, " // %S", ast->InlineCmt->Content ); } - result.append_fmt( "\n{\n%S\n}", ast->Body.to_string() ); + append_fmt( result, "\n{\n%S\n}", ast->Body.to_string() ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) - result.append(";\n"); + append( result, ";\n"); } void CodeStruct::to_string_fwd( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "struct %S %S", ast->Attributes.to_string(), ast->Name ); + append_fmt( result, "struct %S %S", ast->Attributes.to_string(), ast->Name ); - else result.append_fmt( "struct %S", ast->Name ); + else append_fmt( result, "struct %S", ast->Name ); if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) { if ( ast->InlineCmt ) - result.append_fmt("; %S", ast->InlineCmt->Content ); + append_fmt( result, "; %S", ast->InlineCmt->Content ); else - result.append(";\n"); + append( result, ";\n"); } } String CodeTemplate::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -1056,17 +1056,17 @@ String CodeTemplate::to_string() void CodeTemplate::to_string( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Params ) - result.append_fmt( "template< %S >\n%S", ast->Params.to_string(), ast->Declaration.to_string() ); + append_fmt( result, "template< %S >\n%S", ast->Params.to_string(), ast->Declaration.to_string() ); else - result.append_fmt( "template<>\n%S", ast->Declaration.to_string() ); + append_fmt( result, "template<>\n%S", ast->Declaration.to_string() ); } String CodeTypedef::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -1074,41 +1074,41 @@ String CodeTypedef::to_string() void CodeTypedef::to_string( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append( "typedef "); + append( result, "typedef "); // Determines if the typedef is a function typename if ( ast->UnderlyingType->ReturnType ) - result.append( ast->UnderlyingType.to_string() ); + append( result, ast->UnderlyingType.to_string() ); else - result.append_fmt( "%S %S", ast->UnderlyingType.to_string(), ast->Name ); + append_fmt( result, "%S %S", ast->UnderlyingType.to_string(), ast->Name ); if ( ast->UnderlyingType->Type == ECode::Typename && ast->UnderlyingType->ArrExpr ) { - result.append_fmt( "[ %S ];", ast->UnderlyingType->ArrExpr->to_string() ); + append_fmt( result, "[ %S ];", ast->UnderlyingType->ArrExpr->to_string() ); AST* next_arr_expr = ast->UnderlyingType->ArrExpr->Next; while ( next_arr_expr ) { - result.append_fmt( "[ %S ];", next_arr_expr->to_string() ); + append_fmt( result, "[ %S ];", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } } else { - result.append( ";" ); + append( result, ";" ); } if ( ast->InlineCmt ) - result.append_fmt(" %S", ast->InlineCmt->Content); + append_fmt( result, " %S", ast->InlineCmt->Content); else - result.append("\n"); + append( result, "\n"); } String CodeType::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -1119,13 +1119,13 @@ void CodeType::to_string( String& result ) if ( ast->ReturnType && ast->Params ) { if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); else { if ( ast->Specs ) - result.append_fmt( "%S ( %S ) ( %S ) %S", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string(), ast->Specs.to_string() ); + append_fmt( result, "%S ( %S ) ( %S ) %S", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string(), ast->Specs.to_string() ); else - result.append_fmt( "%S ( %S ) ( %S )", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string() ); + append_fmt( result, "%S ( %S ) ( %S )", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string() ); } break; @@ -1134,13 +1134,13 @@ void CodeType::to_string( String& result ) if ( ast->ReturnType && ast->Params ) { if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); else { if ( ast->Specs ) - result.append_fmt( "%S %S ( %S ) %S", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string(), ast->Specs.to_string() ); + append_fmt( result, "%S %S ( %S ) %S", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string(), ast->Specs.to_string() ); else - result.append_fmt( "%S %S ( %S )", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string() ); + append_fmt( result, "%S %S ( %S )", ast->ReturnType.to_string(), ast->Name, ast->Params.to_string() ); } return; @@ -1148,20 +1148,20 @@ void CodeType::to_string( String& result ) #endif if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->Specs ) - result.append_fmt( "%S %S", ast->Name, ast->Specs.to_string() ); + append_fmt( result, "%S %S", ast->Name, ast->Specs.to_string() ); else - result.append_fmt( "%S", ast->Name ); + append_fmt( result, "%S", ast->Name ); if ( ast->IsParamPack ) - result.append("..."); + append( result, "..."); } String CodeUnion::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -1169,16 +1169,16 @@ String CodeUnion::to_string() void CodeUnion::to_string( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); - result.append( "union " ); + append( result, "union " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->Name ) { - result.append_fmt( "%S\n{\n%S\n}" + append_fmt( result, "%S\n{\n%S\n}" , ast->Name , ast->Body.to_string() ); @@ -1186,18 +1186,18 @@ void CodeUnion::to_string( String& result ) else { // Anonymous union - result.append_fmt( "\n{\n%S\n}" + append_fmt( result, "\n{\n%S\n}" , ast->Body.to_string() ); } if ( ast->Parent.ast == nullptr || ( ast->Parent->Type != ECode::Typedef && ast->Parent->Type != ECode::Variable ) ) - result.append(";\n"); + append( result, ";\n"); } String CodeUsing::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); switch ( ast->Type ) { using namespace ECode; @@ -1214,49 +1214,49 @@ String CodeUsing::to_string() void CodeUsing::to_string( String& result ) { if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Attributes.to_string() ); + append_fmt( result, "%S ", ast->Attributes.to_string() ); if ( ast->UnderlyingType ) { - result.append_fmt( "using %S = %S", ast->Name, ast->UnderlyingType.to_string() ); + append_fmt( result, "using %S = %S", ast->Name, ast->UnderlyingType.to_string() ); if ( ast->UnderlyingType->ArrExpr ) { - result.append_fmt( "[ %S ]", ast->UnderlyingType->ArrExpr.to_string() ); + append_fmt( result, "[ %S ]", ast->UnderlyingType->ArrExpr.to_string() ); AST* next_arr_expr = ast->UnderlyingType->ArrExpr->Next; while ( next_arr_expr ) { - result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); + append_fmt( result, "[ %S ]", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } } - result.append( ";" ); + append( result, ";" ); } else - result.append_fmt( "using %S;", ast->Name ); + append_fmt( result, "using %S;", ast->Name ); if ( ast->InlineCmt ) - result.append_fmt(" %S\n", ast->InlineCmt->Content ); + append_fmt( result, " %S\n", ast->InlineCmt->Content ); else - result.append("\n"); + append( result, "\n"); } void CodeUsing::to_string_ns( String& result ) { if ( ast->InlineCmt ) - result.append_fmt( "using namespace $S; %S", ast->Name, ast->InlineCmt->Content ); + append_fmt( result, "using namespace $S; %S", ast->Name, ast->InlineCmt->Content ); else - result.append_fmt( "using namespace %s;\n", ast->Name ); + append_fmt( result, "using namespace %s;\n", ast->Name ); } String CodeVar::to_string() { - String result = String::make( GlobalAllocator, "" ); + String result = string_make( GlobalAllocator, "" ); to_string( result ); return result; } @@ -1268,18 +1268,18 @@ void CodeVar::to_string( String& result ) // Its a comma-separated variable ( a NextVar ) if ( ast->Specs ) - result.append_fmt( "%S ", ast->Specs.to_string() ); + append_fmt( result, "%S ", ast->Specs.to_string() ); - result.append( ast->Name ); + append( result, ast->Name ); if ( ast->ValueType->ArrExpr ) { - result.append_fmt( "[ %S ]", ast->ValueType->ArrExpr.to_string() ); + append_fmt( result, "[ %S ]", ast->ValueType->ArrExpr.to_string() ); AST* next_arr_expr = ast->ValueType->ArrExpr->Next; while ( next_arr_expr ) { - result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); + append_fmt( result, "[ %S ]", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } } @@ -1287,107 +1287,107 @@ void CodeVar::to_string( String& result ) if ( ast->Value ) { if ( ast->VarConstructorInit ) - result.append_fmt( "( %S ", ast->Value.to_string() ); + append_fmt( result, "( %S ", ast->Value.to_string() ); else - result.append_fmt( " = %S", ast->Value.to_string() ); + append_fmt( result, " = %S", ast->Value.to_string() ); } // Keep the chain going... if ( ast->NextVar ) - result.append_fmt( ", %S", ast->NextVar.to_string() ); + append_fmt( result, ", %S", ast->NextVar.to_string() ); if ( ast->VarConstructorInit ) - result.append( " )"); + append( result, " )"); return; } if ( bitfield_is_equal( u32, ast->ModuleFlags, ModuleFlag::Export )) - result.append( "export " ); + append( result, "export " ); if ( ast->Attributes || ast->Specs ) { if ( ast->Attributes ) - result.append_fmt( "%S ", ast->Specs.to_string() ); + append_fmt( result, "%S ", ast->Specs.to_string() ); if ( ast->Specs ) - result.append_fmt( "%S\n", ast->Specs.to_string() ); + append_fmt( result, "%S\n", ast->Specs.to_string() ); - result.append_fmt( "%S %S", ast->ValueType.to_string(), ast->Name ); + append_fmt( result, "%S %S", ast->ValueType.to_string(), ast->Name ); if ( ast->ValueType->ArrExpr ) { - result.append_fmt( "[ %S ]", ast->ValueType->ArrExpr.to_string() ); + append_fmt( result, "[ %S ]", ast->ValueType->ArrExpr.to_string() ); AST* next_arr_expr = ast->ValueType->ArrExpr->Next; while ( next_arr_expr ) { - result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); + append_fmt( result, "[ %S ]", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } } if ( ast->BitfieldSize ) - result.append_fmt( " : %S", ast->BitfieldSize.to_string() ); + append_fmt( result, " : %S", ast->BitfieldSize.to_string() ); if ( ast->Value ) { if ( ast->VarConstructorInit ) - result.append_fmt( "( %S ", ast->Value.to_string() ); + append_fmt( result, "( %S ", ast->Value.to_string() ); else - result.append_fmt( " = %S", ast->Value.to_string() ); + append_fmt( result, " = %S", ast->Value.to_string() ); } if ( ast->NextVar ) - result.append_fmt( ", %S", ast->NextVar.to_string() ); + append_fmt( result, ", %S", ast->NextVar.to_string() ); if ( ast->VarConstructorInit ) - result.append( " )"); + append( result, " )"); if ( ast->InlineCmt ) - result.append_fmt("; %S", ast->InlineCmt->Content); + append_fmt( result, "; %S", ast->InlineCmt->Content); else - result.append( ";\n" ); + append( result, ";\n" ); return; } if ( ast->BitfieldSize ) - result.append_fmt( "%S %S : %S", ast->ValueType.to_string(), ast->Name, ast->BitfieldSize.to_string() ); + append_fmt( result, "%S %S : %S", ast->ValueType.to_string(), ast->Name, ast->BitfieldSize.to_string() ); else if ( ast->ValueType->ArrExpr ) { - result.append_fmt( "%S %S[ %S ]", ast->ValueType.to_string(), ast->Name, ast->ValueType->ArrExpr.to_string() ); + append_fmt( result, "%S %S[ %S ]", ast->ValueType.to_string(), ast->Name, ast->ValueType->ArrExpr.to_string() ); AST* next_arr_expr = ast->ValueType->ArrExpr->Next; while ( next_arr_expr ) { - result.append_fmt( "[ %S ]", next_arr_expr->to_string() ); + append_fmt( result, "[ %S ]", next_arr_expr->to_string() ); next_arr_expr = next_arr_expr->Next; } } else - result.append_fmt( "%S %S", ast->ValueType.to_string(), ast->Name ); + append_fmt( result, "%S %S", ast->ValueType.to_string(), ast->Name ); if ( ast->Value ) { if ( ast->VarConstructorInit ) - result.append_fmt( "( %S ", ast->Value.to_string() ); + append_fmt( result, "( %S ", ast->Value.to_string() ); else - result.append_fmt( " = %S", ast->Value.to_string() ); + append_fmt( result, " = %S", ast->Value.to_string() ); } if ( ast->NextVar ) - result.append_fmt( ", %S", ast->NextVar.to_string() ); + append_fmt( result, ", %S", ast->NextVar.to_string() ); if ( ast->VarConstructorInit ) - result.append( " )"); + append( result, " )"); - result.append( ";" ); + append( result, ";" ); if ( ast->InlineCmt ) - result.append_fmt(" %S", ast->InlineCmt->Content); + append_fmt( result, " %S", ast->InlineCmt->Content); else - result.append("\n"); + append( result, "\n"); } diff --git a/project/components/interface.cpp b/project/components/interface.cpp index 5aadb92..2d050ce 100644 --- a/project/components/interface.cpp +++ b/project/components/interface.cpp @@ -74,26 +74,26 @@ void* Global_Allocator_Proc( void* allocator_data, AllocType type, ssize size, s internal void define_constants() { - Code::Global = make_code(); - Code::Global->Name = get_cached_string( txt("Global Code") ); - Code::Global->Content = Code::Global->Name; + Code::Global = make_code(); + scast(String, Code::Global->Name) = get_cached_string( txt("Global Code") ); + scast(String, Code::Global->Content) = Code::Global->Name; Code::Invalid = make_code(); Code::Invalid.set_global(); - t_empty = (CodeType) make_code(); - t_empty->Type = ECode::Typename; - t_empty->Name = get_cached_string( txt("") ); + t_empty = (CodeType) make_code(); + t_empty->Type = ECode::Typename; + scast(String, t_empty->Name) = get_cached_string( txt("") ); t_empty.set_global(); - access_private = make_code(); - access_private->Type = ECode::Access_Private; - access_private->Name = get_cached_string( txt("private:\n") ); + access_private = make_code(); + access_private->Type = ECode::Access_Private; + scast(String, access_private->Name) = get_cached_string( txt("private:\n") ); access_private.set_global(); - access_protected = make_code(); - access_protected->Type = ECode::Access_Protected; - access_protected->Name = get_cached_string( txt("protected:\n") ); + access_protected = make_code(); + access_protected->Type = ECode::Access_Protected; + scast(String, access_protected->Name) = get_cached_string( txt("protected:\n") ); access_protected.set_global(); access_public = make_code(); @@ -398,7 +398,7 @@ StringCached get_cached_string( StrC str ) return * result; } - String result = String::make( get_string_allocator( str.Len ), str ); + String result = string_make( get_string_allocator( str.Len ), str ); set(StringCache, key, result ); return result; diff --git a/project/components/interface.upfront.cpp b/project/components/interface.upfront.cpp index f0ca08f..104e1be 100644 --- a/project/components/interface.upfront.cpp +++ b/project/components/interface.upfront.cpp @@ -458,7 +458,7 @@ CodeComment def_comment( StrC content ) 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* scanner = content.Ptr; s32 curr = 0; @@ -474,15 +474,15 @@ CodeComment def_comment( StrC content ) 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 ); scanner += length; } while ( scanner <= end ); - if ( cmt_formatted.back() != '\n' ) - cmt_formatted.append( "\n" ); + if ( back(cmt_formatted) != '\n' ) + append( cmt_formatted, "\n" ); Code result = make_code(); @@ -490,7 +490,7 @@ CodeComment def_comment( StrC content ) result->Name = get_cached_string( cmt_formatted ); result->Content = result->Name; - cmt_formatted.free(); + free(cmt_formatted); return (CodeComment) result; } diff --git a/project/components/lexer.cpp b/project/components/lexer.cpp index fe8cc94..f2fe4d3 100644 --- a/project/components/lexer.cpp +++ b/project/components/lexer.cpp @@ -89,11 +89,11 @@ struct Token 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 ); - result.append_fmt( "Line: %d Column: %d, Type: %.*s Content: %.*s" + append_fmt( result, "Line: %d Column: %d, Type: %.*s Content: %.*s" , Line, Column , type_str.Len, type_str.Ptr , Length, Text @@ -352,7 +352,7 @@ s32 lex_preprocessor_directive( 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" , current @@ -419,8 +419,8 @@ s32 lex_preprocessor_directive( } else { - 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 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 ); log_failure( "gen::Parser::lex: Invalid escape sequence '\\%c' (%d, %d)" " in preprocessor directive '%s' (%d, %d)\n%s" @@ -586,7 +586,7 @@ TokArray lex( StrC content ) { s32 length = 0; 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++; length ++; @@ -678,7 +678,7 @@ TokArray lex( StrC content ) } 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 ); } @@ -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 ); // Skip to next whitespace since we can't know if anything else is valid until then. diff --git a/project/components/parser.cpp b/project/components/parser.cpp index 6ed1d85..b9f6a6b 100644 --- a/project/components/parser.cpp +++ b/project/components/parser.cpp @@ -45,7 +45,7 @@ struct ParseContext 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 last_valid = Tokens.Idx >= num(Tokens.Arr) ? Tokens.Arr[num(Tokens.Arr) -1] : Tokens.current(); @@ -58,18 +58,18 @@ struct ParseContext length++; } - String line = String::make( GlobalAllocator, { length, scope_start.Text } ); - result.append_fmt("\tScope : %s\n", line ); - line.free(); + String line = string_make( GlobalAllocator, { length, scope_start.Text } ); + append_fmt( result, "\tScope : %s\n", line ); + free(line); sptr dist = (sptr)last_valid.Text - (sptr)scope_start.Text + 2; 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 ) - 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 - 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; s32 level = 0; @@ -77,11 +77,11 @@ struct ParseContext { 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 { - 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; @@ -243,7 +243,7 @@ constexpr bool strip_formatting_dont_preserve_newlines = false; internal 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 ) return content; @@ -290,7 +290,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) if ( tokleft ) move_fwd(); - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } @@ -312,7 +312,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) if ( tokleft ) move_fwd(); - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } @@ -326,7 +326,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) scanner += 2; tokleft -= 2; - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } @@ -345,7 +345,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) if (tokleft) move_fwd(); - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } @@ -354,10 +354,10 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) if (scanner[0] == '\t') { if (pos > last_cut) - content.append(cut_ptr, cut_length); + append( content, cut_ptr, cut_length); - if ( content.back() != ' ' ) - content.append(' '); + if ( back( content ) != ' ' ) + append( content, ' '); move_fwd(); last_cut = sptr(scanner) - sptr(raw_text.Ptr); @@ -373,17 +373,17 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) scanner += 2; tokleft -= 2; - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } if ( pos > last_cut ) - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); // Replace with a space - if ( content.back() != ' ' ) - content.append( ' ' ); + if ( back( content ) != ' ' ) + append( content, ' ' ); scanner += 2; tokleft -= 2; @@ -400,17 +400,17 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) move_fwd(); - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); continue; } if ( pos > last_cut ) - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); // Replace with a space - if ( content.back() != ' ' ) - content.append( ' ' ); + if ( back( content ) != ' ' ) + append( content, ' ' ); move_fwd(); @@ -421,7 +421,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) // Escaped newlines if ( scanner[0] == '\\' ) { - content.append( cut_ptr, cut_length ); + append( content, cut_ptr, cut_length ); s32 amount_to_skip = 1; if ( tokleft > 1 && scanner[1] == '\n' ) @@ -448,7 +448,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) // Consectuive spaces 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 { move_fwd(); @@ -458,8 +458,8 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) last_cut = sptr( scanner ) - sptr( raw_text.Ptr ); // Preserve only 1 space of formattting - if ( content.back() != ' ' ) - content.append( ' ' ); + if ( back( content ) != ' ' ) + append( content, ' ' ); continue; } @@ -469,7 +469,7 @@ String strip_formatting( StrC raw_text, bool preserve_newlines = true ) 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 @@ -1039,8 +1039,8 @@ CodeBody parse_class_struct_body( TokType which, Token name ) if ( attributes ) { - String fused = String::make_reserve( GlobalAllocator, attributes->Content.length() + more_attributes->Content.length() ); - fused.append_fmt( "%S %S", attributes->Content, more_attributes->Content ); + String fused = string_make_reserve( GlobalAllocator, length(attributes->Content) + length(more_attributes->Content) ); + append_fmt( fused, "%S %S", attributes->Content, more_attributes->Content ); attributes->Name = get_cached_string(fused); attributes->Content = attributes->Name; @@ -1484,8 +1484,8 @@ CodeFn parse_function_after_name( using namespace ECode; String - name_stripped = String::make( GlobalAllocator, name ); - name_stripped.strip_space(); + name_stripped = string_make( GlobalAllocator, name ); + strip_space(name_stripped); CodeFn result = (CodeFn) make_code(); @@ -4114,7 +4114,7 @@ CodeOpCast parse_operator_cast( CodeSpecifiers specifiers ) Code type = parse_type(); // :: ... operator - 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_End ); diff --git a/project/dependencies/parsing.cpp b/project/dependencies/parsing.cpp index eee923e..4ab0175 100644 --- a/project/dependencies/parsing.cpp +++ b/project/dependencies/parsing.cpp @@ -1099,10 +1099,10 @@ String csv_write_string_delimiter( AllocatorInfo a, CSV_Object* obj, char delimi FileInfo tmp; file_stream_new( &tmp, a ); csv_write_delimiter( &tmp, obj, delimiter ); - + ssize 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 ); return output; } diff --git a/project/dependencies/platform.hpp b/project/dependencies/platform.hpp index e1e358f..272dadb 100644 --- a/project/dependencies/platform.hpp +++ b/project/dependencies/platform.hpp @@ -1,5 +1,3 @@ -#define GEN_SUPPORT_CPP_MEMBER_FEATURES 0 - #ifdef GEN_INTELLISENSE_DIRECTIVES # pragma once #endif diff --git a/project/dependencies/printing.cpp b/project/dependencies/printing.cpp index 09abe2c..b47fddb 100644 --- a/project/dependencies/printing.cpp +++ b/project/dependencies/printing.cpp @@ -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*) }; - info.precision = gen_str.length(); + info.precision = length(gen_str); len = _print_string( text, remaining, &info, gen_str ); } break; diff --git a/project/dependencies/strings.hpp b/project/dependencies/strings.hpp index 487ede5..07808cc 100644 --- a/project/dependencies/strings.hpp +++ b/project/dependencies/strings.hpp @@ -8,7 +8,7 @@ // Constant string with length. struct StrC { - ssize Len; + ssize Len; char const* Ptr; operator char const* () const { return Ptr; } @@ -28,10 +28,14 @@ StrC to_str( char const* str ) { // They used a header pattern // I kept it for simplicty of porting but its not necessary to keep it that way. #pragma region String -struct String; 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, StrC str); String string_make_reserve(AllocatorInfo allocator, ssize capacity); @@ -73,11 +77,33 @@ struct StringHeader { ssize Length; }; +#if ! GEN_COMPILER_C struct String { 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 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); } @@ -143,30 +169,14 @@ struct String 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 #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 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); - 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; } @@ -263,7 +273,19 @@ bool append(String& str, StrC str_to_append) { inline 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 @@ -294,7 +316,7 @@ bool are_equal(String lhs, StrC rhs) inline 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; } @@ -306,7 +328,7 @@ char& back(String& str) { inline 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) return false; @@ -326,7 +348,7 @@ bool contains(String const& str, StrC substring) inline 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) return false; @@ -345,7 +367,7 @@ bool contains(String const& str, String const& substring) inline 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; } @@ -356,7 +378,7 @@ void clear(String& str) { inline 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 @@ -376,7 +398,7 @@ StringHeader& get_header(String& str) { inline 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; } @@ -511,10 +533,10 @@ void trim_space(String& str) { inline 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. - for (char c : str) switch (c) + for (auto c : str) switch (c) { case ' ': append(result, txt("ยท")); @@ -549,10 +571,10 @@ struct String_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. -using StringTable = HashTable; +typedef HashTable StringTable; // Represents strings cached with the string table. // Should never be modified, if changed string is desired, cache_string( str ) another. -using StringCached = String const; +typedef String const StringCached; #pragma endregion Strings diff --git a/project/helpers/helper.hpp b/project/helpers/helper.hpp index fde3a3d..07ef316 100644 --- a/project/helpers/helper.hpp +++ b/project/helpers/helper.hpp @@ -20,14 +20,14 @@ CodeBody gen_ecode( char const* path ) Array enum_strs = csv_nodes.nodes[0].nodes; - String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); - String to_str_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) ); for ( ADT_Node node : enum_strs ) { char const* code = node.string; - enum_entries.append_fmt( "%s,\n", code ); - to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", code, code ); + append_fmt( enum_entries, "%s,\n", 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 { NumTypes };")); @@ -67,16 +67,16 @@ CodeBody gen_eoperator( char const* path ) Array enum_strs = csv_nodes.nodes[0].nodes; Array str_strs = csv_nodes.nodes[1].nodes; - String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); - String to_str_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) ); for (usize idx = 0; idx < num(enum_strs); idx++) { char const* enum_str = enum_strs[idx].string; char const* entry_to_str = str_strs [idx].string; - enum_entries.append_fmt( "%s,\n", enum_str ); - to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); + append_fmt( enum_entries, "%s,\n", enum_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( @@ -123,16 +123,16 @@ CodeBody gen_especifier( char const* path ) Array enum_strs = csv_nodes.nodes[0].nodes; Array str_strs = csv_nodes.nodes[1].nodes; - String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(1) ); - String to_str_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) ); for (usize idx = 0; idx < num(enum_strs); idx++) { char const* enum_str = enum_strs[idx].string; char const* entry_to_str = str_strs [idx].string; - enum_entries.append_fmt( "%s,\n", enum_str ); - to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); + append_fmt( enum_entries, "%s,\n", enum_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( @@ -237,19 +237,19 @@ CodeBody gen_etoktype( char const* etok_path, char const* attr_path ) Array attribute_strs = csv_attr_nodes.nodes[0].nodes; Array attribute_str_strs = csv_attr_nodes.nodes[1].nodes; - String enum_entries = String::make_reserve( GlobalAllocator, kilobytes(2) ); - String to_str_entries = String::make_reserve( GlobalAllocator, kilobytes(4) ); - String attribute_entries = String::make_reserve( GlobalAllocator, kilobytes(2) ); - String to_str_attributes = String::make_reserve( GlobalAllocator, kilobytes(4) ); - String attribute_define_entries = String::make_reserve( GlobalAllocator, kilobytes(4) ); + String enum_entries = string_make_reserve( GlobalAllocator, kilobytes(2) ); + String to_str_entries = string_make_reserve( GlobalAllocator, kilobytes(4) ); + String attribute_entries = string_make_reserve( GlobalAllocator, kilobytes(2) ); + String to_str_attributes = 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++) { char const* enum_str = enum_strs[idx].string; char const* entry_to_str = enum_str_strs [idx].string; - enum_entries.append_fmt( "%s,\n", enum_str ); - to_str_entries.append_fmt( "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); + append_fmt( enum_entries, "%s,\n", enum_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++ ) @@ -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* entry_to_str = attribute_str_strs [idx].string; - attribute_entries.append_fmt( "Attribute_%s,\n", attribute_str ); - to_str_attributes.append_fmt( "{ 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_entries, "Attribute_%s,\n", attribute_str ); + append_fmt( to_str_attributes, "{ sizeof(\"%s\"), \"%s\" },\n", entry_to_str, entry_to_str); + append_fmt( attribute_define_entries, "Entry( Attribute_%s, \"%s\" )", attribute_str, entry_to_str ); if ( idx < num(attribute_strs) - 1 ) - attribute_define_entries.append( " \\\n"); + append( attribute_define_entries, " \\\n"); else - attribute_define_entries.append( "\n"); + append( attribute_define_entries, "\n"); } #pragma push_macro("GEN_DEFINE_ATTRIBUTE_TOKENS")