mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-31 06:50:53 -07:00 
			
		
		
		
	String member definitions not longer used in the base project
This commit is contained in:
		| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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; | ||||
| 				} | ||||
|   | ||||
| @@ -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"); | ||||
|   | ||||
| @@ -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)                        \ | ||||
| 		);                                                                \ | ||||
| 	} | ||||
|  | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -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<StringCached>(StringCache, key, result ); | ||||
|  | ||||
| 	return result; | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -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. | ||||
|   | ||||
| @@ -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(); | ||||
| 	// <Specifiers> <Qualifier> :: ... operator <UnderlyingType> | ||||
|  | ||||
| 	Context.Scope->Name = { type->Name.Data, type->Name.length() }; | ||||
| 	Context.Scope->Name = { type->Name.Data, length(type->Name) }; | ||||
|  | ||||
| 	eat( TokType::Capture_Start ); | ||||
| 	eat( TokType::Capture_End ); | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
| #define GEN_SUPPORT_CPP_MEMBER_FEATURES 0 | ||||
|  | ||||
| #ifdef GEN_INTELLISENSE_DIRECTIVES | ||||
| #	pragma once | ||||
| #endif | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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<String const>; | ||||
| typedef HashTable<String const>   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 | ||||
|   | ||||
| @@ -20,14 +20,14 @@ CodeBody gen_ecode( char const* path ) | ||||
|  | ||||
| 	Array<ADT_Node> 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 { <entries> NumTypes };")); | ||||
| @@ -67,16 +67,16 @@ CodeBody gen_eoperator( char const* path ) | ||||
| 	Array<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes; | ||||
| 	Array<ADT_Node> 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<ADT_Node> enum_strs = csv_nodes.nodes[0].nodes; | ||||
| 	Array<ADT_Node> 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<ADT_Node> attribute_strs     = csv_attr_nodes.nodes[0].nodes; | ||||
| 	Array<ADT_Node> 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") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user