mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-31 06:50:53 -07:00 
			
		
		
		
	Changed zpl implemenation based on latest refactor script I use, refactored code to changes.
This commit is contained in:
		| @@ -9,7 +9,9 @@ namespace Global | |||||||
|  |  | ||||||
| namespace Memory | namespace Memory | ||||||
| { | { | ||||||
| 	arena Global_Arena {}; | 	using namespace zpl; | ||||||
|  |  | ||||||
|  | 	Arena Global_Arena {}; | ||||||
|  |  | ||||||
| 	void setup() | 	void setup() | ||||||
| 	{ | 	{ | ||||||
| @@ -68,10 +70,10 @@ sw token_fmt_va( char* buf, uw buf_size, char const* fmt, s32 num_tokens, va_lis | |||||||
| 			TokEntry entry | 			TokEntry entry | ||||||
| 			{ | 			{ | ||||||
| 				value, | 				value, | ||||||
| 				zpl_strnlen(value, (sw)128) | 				strnlen(value, (sw)128) | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
| 			u32 key = crc32( token, zpl_strnlen(token, 32) ); | 			u32 key = crc32( token, strnlen(token, 32) ); | ||||||
|  |  | ||||||
| 			tokmap_set( & tok_map, key, entry ); | 			tokmap_set( & tok_map, key, entry ); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #	define ZPL_IMPLEMENTATION | #	define ZPL_IMPLEMENTATION | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | // TODO: This will be removed when making the library have zero dependencies. | ||||||
| #pragma region 									ZPL INCLUDE | #pragma region 									ZPL INCLUDE | ||||||
| #if __clang__ | #if __clang__ | ||||||
| #	pragma clang diagnostic push | #	pragma clang diagnostic push | ||||||
| @@ -18,6 +18,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // #   define ZPL_HEAP_ANALYSIS | // #   define ZPL_HEAP_ANALYSIS | ||||||
|  | #	define ZPL_WRAP_IN_NAMESPACE | ||||||
| #	define ZPL_NO_MATH_H | #	define ZPL_NO_MATH_H | ||||||
| #	define ZPL_CUSTOM_MODULES | #	define ZPL_CUSTOM_MODULES | ||||||
| #		define ZPL_MODULE_ESSENTIALS | #		define ZPL_MODULE_ESSENTIALS | ||||||
| @@ -35,6 +36,48 @@ | |||||||
| // #		define ZPL_MODULE_PARSER | // #		define ZPL_MODULE_PARSER | ||||||
| #include "zpl.h" | #include "zpl.h" | ||||||
|  |  | ||||||
|  | using zpl::s8; | ||||||
|  | using zpl::s16; | ||||||
|  | using zpl::s32; | ||||||
|  | using zpl::s64; | ||||||
|  | using zpl::u8; | ||||||
|  | using zpl::u32; | ||||||
|  | using zpl::u64; | ||||||
|  | using zpl::uw; | ||||||
|  | using zpl::sw; | ||||||
|  |  | ||||||
|  | using zpl::Arena; | ||||||
|  | using zpl::AllocatorInfo; | ||||||
|  | using zpl::ArrayHeader; | ||||||
|  | using zpl::FileInfo; | ||||||
|  | using zpl::FileError; | ||||||
|  | using zpl::Pool; | ||||||
|  | using zpl::String; | ||||||
|  | // using zpl::StringHeader; | ||||||
|  |  | ||||||
|  | using zpl::EFileMode_WRITE; | ||||||
|  | using zpl::EFileError_NONE; | ||||||
|  |  | ||||||
|  | using zpl::arena_allocator; | ||||||
|  | using zpl::arena_init_from_memory; | ||||||
|  | using zpl::arena_free; | ||||||
|  | using zpl::char_is_alpha; | ||||||
|  | using zpl::char_is_space; | ||||||
|  | using zpl::crc32; | ||||||
|  | using zpl::memset; | ||||||
|  | using zpl::pool_free; | ||||||
|  | using zpl::printf_va; | ||||||
|  | using zpl::printf_err_va; | ||||||
|  | using zpl::snprintf_va; | ||||||
|  | using zpl::string_appendc; | ||||||
|  | using zpl::string_append_fmt; | ||||||
|  | using zpl::string_append_length; | ||||||
|  | using zpl::string_length; | ||||||
|  | using zpl::string_make; | ||||||
|  | using zpl::strnlen; | ||||||
|  | // using zpl:: | ||||||
|  |  | ||||||
|  |  | ||||||
| #if __clang__ | #if __clang__ | ||||||
| #	pragma clang diagnostic pop | #	pragma clang diagnostic pop | ||||||
| #endif | #endif | ||||||
| @@ -135,7 +178,7 @@ namespace Memory | |||||||
| { | { | ||||||
| 	ct uw Initial_Reserve = megabytes(10); | 	ct uw Initial_Reserve = megabytes(10); | ||||||
|  |  | ||||||
| 	extern arena Global_Arena; | 	extern Arena Global_Arena; | ||||||
| 	// #define g_allocator arena_allocator( & Memory::Global_Arena) | 	// #define g_allocator arena_allocator( & Memory::Global_Arena) | ||||||
|  |  | ||||||
| 	// Heap allocator is being used for now to isolate errors from being memory related (tech debt till ready to address) | 	// Heap allocator is being used for now to isolate errors from being memory related (tech debt till ready to address) | ||||||
| @@ -172,7 +215,7 @@ sw log_fmt(char const *fmt, ...) | |||||||
| 	va_list va; | 	va_list va; | ||||||
|  |  | ||||||
| 	va_start(va, fmt); | 	va_start(va, fmt); | ||||||
| 	res = zpl_printf_va(fmt, va); | 	res = printf_va(fmt, va); | ||||||
| 	va_end(va); | 	va_end(va); | ||||||
|  |  | ||||||
| 	return res; | 	return res; | ||||||
| @@ -188,17 +231,17 @@ sw fatal(char const *fmt, ...) | |||||||
|  |  | ||||||
| #if Build_Debug | #if Build_Debug | ||||||
| 	va_start(va, fmt); | 	va_start(va, fmt); | ||||||
| 	zpl_snprintf_va(buf, ZPL_PRINTF_MAXLEN, fmt, va); | 	zpl::snprintf_va(buf, ZPL_PRINTF_MAXLEN, fmt, va); | ||||||
| 	va_end(va); | 	va_end(va); | ||||||
|  |  | ||||||
| 	assert_crash(buf); | 	assert_crash(buf); | ||||||
| 	return -1; | 	return -1; | ||||||
| #else | #else | ||||||
| 	va_start(va, fmt); | 	va_start(va, fmt); | ||||||
| 	zpl_printf_err_va( fmt, va); | 	printf_err_va( fmt, va); | ||||||
| 	va_end(va); | 	va_end(va); | ||||||
|  |  | ||||||
| 	zpl_exit(1); | 	exit(1); | ||||||
| 	return -1; | 	return -1; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										498
									
								
								project/gen.cpp
									
									
									
									
									
								
							
							
						
						
									
										498
									
								
								project/gen.cpp
									
									
									
									
									
								
							| @@ -4,14 +4,14 @@ | |||||||
| #ifdef gen_time | #ifdef gen_time | ||||||
| namespace gen | namespace gen | ||||||
| { | { | ||||||
| 	ZPL_TABLE_DEFINE( StringTable, str_tbl_,   string ); | 	ZPL_TABLE_DEFINE( StringTable, str_tbl_,   String ); | ||||||
| 	ZPL_TABLE_DEFINE( TypeTable,   type_tbl_ , Code   ); | 	ZPL_TABLE_DEFINE( TypeTable,   type_tbl_ , Code   ); | ||||||
|  |  | ||||||
| 	namespace StaticData | 	namespace StaticData | ||||||
| 	{ | 	{ | ||||||
| 	#ifndef GEN_CODE_USE_SOA | 	#ifndef GEN_CODE_USE_SOA | ||||||
| 		static array(pool) CodePools; | 		static Array(Pool) CodePools; | ||||||
| 		static array(pool) CodeEntriesPools; | 		static Array(Pool) CodeEntriesPools; | ||||||
|  |  | ||||||
| 	#else | 	#else | ||||||
| 		using DataUnion = union | 		using DataUnion = union | ||||||
| @@ -67,7 +67,7 @@ namespace gen | |||||||
| 		} | 		} | ||||||
| 	#endif | 	#endif | ||||||
|  |  | ||||||
| 		static array(arena) StringArenas =  nullptr; | 		static Array(Arena) StringArenas =  nullptr; | ||||||
|  |  | ||||||
| 		static StringTable StringMap; | 		static StringTable StringMap; | ||||||
| 		static TypeTable   TypeMap; | 		static TypeTable   TypeMap; | ||||||
| @@ -80,11 +80,11 @@ namespace gen | |||||||
|  |  | ||||||
| 		static sw SizePer_StringArena          = megabytes(32); | 		static sw SizePer_StringArena          = megabytes(32); | ||||||
|  |  | ||||||
| 		static allocator Allocator_CodePool        = heap(); | 		static AllocatorInfo Allocator_CodePool        = heap(); | ||||||
| 		static allocator Allocator_CodeEntriesPool = heap(); | 		static AllocatorInfo Allocator_CodeEntriesPool = heap(); | ||||||
| 		static allocator Allocator_StringArena     = heap(); | 		static AllocatorInfo Allocator_StringArena     = heap(); | ||||||
| 		static allocator Allocator_StringTable     = heap(); | 		static AllocatorInfo Allocator_StringTable     = heap(); | ||||||
| 		static allocator Allocator_TypeTable       = heap(); | 		static AllocatorInfo Allocator_TypeTable       = heap(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #pragma region CONSTANTS | #pragma region CONSTANTS | ||||||
| @@ -126,6 +126,21 @@ namespace gen | |||||||
| 			case Untyped: | 			case Untyped: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_FwdDecl: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_Body: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_Class: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_Class_FwdDecl: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
| 			case Global_Body: | 			case Global_Body: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -177,7 +192,58 @@ namespace gen | |||||||
|  |  | ||||||
| 	bool AST::check() | 	bool AST::check() | ||||||
| 	{ | 	{ | ||||||
|  | 		switch ( Type ) | ||||||
|  | 		{ | ||||||
|  | 			using namespace ECode; | ||||||
|  |  | ||||||
|  | 			case Untyped: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Global_Body: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Function: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Function_Body: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Function_FwdDecl: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Namespace: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Namespace_Body: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Parameters: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Specifiers: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Struct: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Struct_Body: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Variable: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Typedef: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Typename: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Using: | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		return true; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	AST* AST::duplicate() | 	AST* AST::duplicate() | ||||||
| @@ -244,9 +310,9 @@ namespace gen | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	string AST::to_string() const | 	String AST::to_string() const | ||||||
| 	{ | 	{ | ||||||
| 		string result = string_make( g_allocator, "" ); | 		String result = string_make( g_allocator, "" ); | ||||||
|  |  | ||||||
| 		if ( Comment ) | 		if ( Comment ) | ||||||
| 			result = string_append_fmt( result, "// %s\n", Comment ); | 			result = string_append_fmt( result, "// %s\n", Comment ); | ||||||
| @@ -256,44 +322,44 @@ namespace gen | |||||||
| 			using namespace ECode; | 			using namespace ECode; | ||||||
|  |  | ||||||
| 			case Invalid: | 			case Invalid: | ||||||
| 				fatal("Attempted to serialize invalid code! - %s", Name); | 				log_failure("Attempted to serialize invalid code! - %s", Name); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Untyped: | 			case Untyped: | ||||||
| 				result = string_append_length( result, Content, string_length(Content) ); | 				result = string_append_length( result, Content, string_length( ccast(String, Content)) ); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Function_FwdDecl: | 			case Access_Public: | ||||||
| 			{ | 			case Access_Protected: | ||||||
| 				u32 index = 0; | 			case Access_Private: | ||||||
| 				u32 left  = array_count( Entries ); | 				result = string_append_length( result, Name, string_length( ccast(String, Name)) ) ; | ||||||
|  | 			break; | ||||||
|  |  | ||||||
| 				if ( left <= 0 ) | 			case Class: | ||||||
| 					fatal( "Code::to_string - Name: %s Type: %s, expected definition", Name, Type ); | 			break; | ||||||
|  |  | ||||||
| 				if ( Entries[index]->Type == Specifiers ) | 			case Class_FwdDecl: | ||||||
| 				{ | 			break; | ||||||
| 					result = string_append_fmt( result, "%s\n", Entries[index]->to_string() ); |  | ||||||
| 					index++; |  | ||||||
| 					left--; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				if ( left <= 0 ) | 			case Class_Body: | ||||||
| 					fatal( "Code::to_string - Name: %s Type: %s, expected return type", Name, Type ); | 			break; | ||||||
|  |  | ||||||
| 				result = string_append_fmt( result, "\n%s %s(", Entries[index]->to_string(), Name ); | 			case Enum: | ||||||
| 				index++; | 			break; | ||||||
| 				left--; |  | ||||||
|  |  | ||||||
| 				if ( left && Entries[index]->Type == Parameters ) | 			case Enum_FwdDecl: | ||||||
| 				{ | 			break; | ||||||
| 					result = string_append_fmt( result, "%s", Entries[index]->to_string() ); |  | ||||||
| 					index++; |  | ||||||
| 					left--; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				result = string_appendc( result, ");\n" ); | 			case Enum_Body: | ||||||
| 			} | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_Class: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Enum_Class_FwdDecl: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Friend: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Function: | 			case Function: | ||||||
| @@ -302,7 +368,7 @@ namespace gen | |||||||
| 				u32 left  = array_count( Entries ); | 				u32 left  = array_count( Entries ); | ||||||
|  |  | ||||||
| 				if ( left <= 0 ) | 				if ( left <= 0 ) | ||||||
| 					fatal( "Code::to_string - Name: %s Type: %s, expected definition", Name, Type ); | 					log_failure( "Code::to_string - Name: %s Type: %s, expected definition", Name, Type ); | ||||||
|  |  | ||||||
| 				if ( Entries[index]->Type == Specifiers ) | 				if ( Entries[index]->Type == Specifiers ) | ||||||
| 				{ | 				{ | ||||||
| @@ -312,7 +378,7 @@ namespace gen | |||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if ( left <= 0 ) | 				if ( left <= 0 ) | ||||||
| 					fatal( "Code::to_string - Name: %s Type: %s, expected return type", Name, Type ); | 					log_failure( "Code::to_string - Name: %s Type: %s, expected return type", Name, Type ); | ||||||
|  |  | ||||||
| 				result = string_append_fmt( result, "\n%s %s(", Entries[index]->to_string(), Name ); | 				result = string_append_fmt( result, "\n%s %s(", Entries[index]->to_string(), Name ); | ||||||
| 				index++; | 				index++; | ||||||
| @@ -329,16 +395,58 @@ namespace gen | |||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
|  | 			case Function_FwdDecl: | ||||||
|  | 			{ | ||||||
|  | 				u32 index = 0; | ||||||
|  | 				u32 left  = array_count( Entries ); | ||||||
|  |  | ||||||
|  | 				if ( left <= 0 ) | ||||||
|  | 					log_failure( "Code::to_string - Name: %s Type: %s, expected definition", Name, Type ); | ||||||
|  |  | ||||||
|  | 				if ( Entries[index]->Type == Specifiers ) | ||||||
|  | 				{ | ||||||
|  | 					result = string_append_fmt( result, "%s\n", Entries[index]->to_string() ); | ||||||
|  | 					index++; | ||||||
|  | 					left--; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if ( left <= 0 ) | ||||||
|  | 					log_failure( "Code::to_string - Name: %s Type: %s, expected return type", Name, Type ); | ||||||
|  |  | ||||||
|  | 				result = string_append_fmt( result, "\n%s %s(", Entries[index]->to_string(), Name ); | ||||||
|  | 				index++; | ||||||
|  | 				left--; | ||||||
|  |  | ||||||
|  | 				if ( left && Entries[index]->Type == Parameters ) | ||||||
|  | 				{ | ||||||
|  | 					result = string_append_fmt( result, "%s", Entries[index]->to_string() ); | ||||||
|  | 					index++; | ||||||
|  | 					left--; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				result = string_appendc( result, ");\n" ); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  |  | ||||||
| 			case Function_Body: | 			case Function_Body: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Global_Body: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Namespace: | 			case Namespace: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Namespace_Body: | 			case Namespace_Body: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Operator: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Operator_FwdDecl: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Parameters: | 			case Parameters: | ||||||
| @@ -361,19 +469,22 @@ namespace gen | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Struct: | 			case Struct: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			case Struct_FwdDecl: | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Struct_Body: | 			case Struct_Body: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Variable: | 			case Variable: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Typedef: | 			case Typedef: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Typename: | 			case Typename: | ||||||
| @@ -381,7 +492,7 @@ namespace gen | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 			case Using: | 			case Using: | ||||||
| 				fatal("NOT SUPPORTED YET"); | 				log_failure("NOT SUPPORTED YET"); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -394,10 +505,10 @@ namespace gen | |||||||
| #pragma region Gen Interface | #pragma region Gen Interface | ||||||
| 	void init() | 	void init() | ||||||
| 	{ | 	{ | ||||||
| 		array_init( StaticData::CodePool, StaticData::Allocator_CodePool ); | 		array_init( StaticData::CodePools, StaticData::Allocator_CodePool ); | ||||||
| 		array_init( StaticData::StringArenas, heap() ); | 		array_init( StaticData::StringArenas, heap() ); | ||||||
|  |  | ||||||
| 		arena string_arena; | 		Arena string_arena; | ||||||
| 		arena_init_from_allocator( & string_arena, StaticData::Allocator_StringArena, StaticData::SizePer_StringArena ); | 		arena_init_from_allocator( & string_arena, StaticData::Allocator_StringArena, StaticData::SizePer_StringArena ); | ||||||
|  |  | ||||||
| 		str_tbl_init(  & StaticData::StringMap, StaticData::Allocator_StringTable ); | 		str_tbl_init(  & StaticData::StringMap, StaticData::Allocator_StringTable ); | ||||||
| @@ -443,8 +554,8 @@ namespace gen | |||||||
| 		spec_constexpr_write = ccast( Code, spec_constexpr ); | 		spec_constexpr_write = ccast( Code, spec_constexpr ); | ||||||
| 		spec_constexpr_write = def_specifiers( 1, ESpecifier::Constexpr ); | 		spec_constexpr_write = def_specifiers( 1, ESpecifier::Constexpr ); | ||||||
|  |  | ||||||
| 	#	define def_constant_spec( Type_, ... )                              \ | 	#	define def_constant_spec( Type_, ... )                                    \ | ||||||
| 		Code&                                                               \ | 		Code&                                                                     \ | ||||||
| 		spec_##Type_ = def_specifiers( macro_num_args(__VA_ARGS__), __VA_ARGS__); \ | 		spec_##Type_ = def_specifiers( macro_num_args(__VA_ARGS__), __VA_ARGS__); \ | ||||||
| 		spec_##Type_.lock(); | 		spec_##Type_.lock(); | ||||||
|  |  | ||||||
| @@ -461,7 +572,7 @@ namespace gen | |||||||
| 			s32 left = 0; | 			s32 left = 0; | ||||||
| 			while (( left-- )) | 			while (( left-- )) | ||||||
| 			{ | 			{ | ||||||
| 				pool* code_pool = & StaticData::CodePools[index]; | 				Pool* code_pool = & StaticData::CodePools[index]; | ||||||
| 				pool_free( code_pool ); | 				pool_free( code_pool ); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @@ -474,7 +585,7 @@ namespace gen | |||||||
| 			s32 left = 0; | 			s32 left = 0; | ||||||
| 			while (( left-- )) | 			while (( left-- )) | ||||||
| 			{ | 			{ | ||||||
| 				pool* code_entries_pool = & StaticData::CodeEntriesPools[index]; | 				Pool* code_entries_pool = & StaticData::CodeEntriesPools[index]; | ||||||
| 				pool_free( code_entries_pool ); | 				pool_free( code_entries_pool ); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @@ -482,13 +593,13 @@ namespace gen | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	allocator get_string_allocator( s32 str_length ) | 	AllocatorInfo get_string_allocator( s32 str_length ) | ||||||
| 	{ | 	{ | ||||||
| 		using namespace StaticData; | 		using namespace StaticData; | ||||||
|  |  | ||||||
| 		if ( StringArenas->total_allocated + str_length > StringArenas->total_size ) | 		if ( StringArenas->total_allocated + str_length > StringArenas->total_size ) | ||||||
| 		{ | 		{ | ||||||
| 			arena new_arena; | 			Arena new_arena; | ||||||
| 			arena_init_from_allocator( & new_arena, Allocator_StringArena, SizePer_StringArena ); | 			arena_init_from_allocator( & new_arena, Allocator_StringArena, SizePer_StringArena ); | ||||||
|  |  | ||||||
| 			array_append( StringArenas, new_arena ); | 			array_append( StringArenas, new_arena ); | ||||||
| @@ -506,7 +617,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		u32 key = crc32( cstr, hash_length ); | 		u32 key = crc32( cstr, hash_length ); | ||||||
|  |  | ||||||
| 		string* result = str_tbl_get( & StaticData::StringMap, key ); | 		String* result = str_tbl_get( & StaticData::StringMap, key ); | ||||||
|  |  | ||||||
| 		if ( result ) | 		if ( result ) | ||||||
| 		{ | 		{ | ||||||
| @@ -532,11 +643,6 @@ namespace gen | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		array_append( CodePool, Invalid ); |  | ||||||
|  |  | ||||||
| 		return pcast( Code, array_back( CodePool )); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #	else | #	else | ||||||
|  |  | ||||||
| 		array_append( CodePool::Type, ECode::Invalid ); | 		array_append( CodePool::Type, ECode::Invalid ); | ||||||
| @@ -551,7 +657,7 @@ namespace gen | |||||||
| #	endif | #	endif | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	array(AST*) make_code_entries() | 	Array(AST*) make_code_entries() | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| @@ -561,16 +667,26 @@ namespace gen | |||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	void set_allocator_code_pool( AllocatorInfo pool_allocator ) | ||||||
|  | 	{ | ||||||
|  | 		StaticData::Allocator_CodePool = pool_allocator; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void set_allocator_string_arena( AllocatorInfo string_allocator ) | ||||||
|  | 	{ | ||||||
|  | 		StaticData::Allocator_StringArena = string_allocator; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void set_allocator_string_table( AllocatorInfo string_allocator ) | ||||||
|  | 	{ | ||||||
|  | 		StaticData::Allocator_StringArena = string_allocator; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	void set_init_reserve_code_pool( sw size ) | 	void set_init_reserve_code_pool( sw size ) | ||||||
| 	{ | 	{ | ||||||
| 		StaticData::InitSize_CodePool = size; | 		StaticData::InitSize_CodePool = size; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void set_init_reserve_string_arena( sw size ) |  | ||||||
| 	{ |  | ||||||
| 		StaticData::InitSize_StringArena = size; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	void set_init_reserve_string_table( sw size ) | 	void set_init_reserve_string_table( sw size ) | ||||||
| 	{ | 	{ | ||||||
| 		StaticData::InitSize_StringTable = size; | 		StaticData::InitSize_StringTable = size; | ||||||
| @@ -581,42 +697,44 @@ namespace gen | |||||||
| 		StaticData::InitSize_TypeTable = size; | 		StaticData::InitSize_TypeTable = size; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void set_allocator_code_pool( allocator pool_allocator ) | 	void set_allocator_type_table( AllocatorInfo type_reg_allocator ) | ||||||
| 	{ |  | ||||||
| 		StaticData::Allocator_CodePool = pool_allocator; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	void set_allocator_string_arena( allocator string_allocator ) |  | ||||||
| 	{ |  | ||||||
| 		StaticData::Allocator_StringArena = string_allocator; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	void set_allocator_string_table( allocator string_allocator ) |  | ||||||
| 	{ |  | ||||||
| 		StaticData::Allocator_StringArena = string_allocator; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	void set_allocator_type_table( allocator type_reg_allocator ) |  | ||||||
| 	{ | 	{ | ||||||
| 		StaticData::Allocator_TypeTable = type_reg_allocator; | 		StaticData::Allocator_TypeTable = type_reg_allocator; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	void set_size_string_arena( sw size ) | ||||||
|  | 	{ | ||||||
|  | 		StaticData::SizePer_StringArena = size; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | #	pragma region Helper Functions | ||||||
|  | 	// This snippet is required in nearly all the functions. | ||||||
|  | #	define name_check( Context_, Length_, Name_ )                                           \ | ||||||
|  | 	do                                                                                      \ | ||||||
|  | 	{                                                                                       \ | ||||||
|  | 		if ( Length_ <= 0 )                                                                 \ | ||||||
|  | 		{                                                                                   \ | ||||||
|  | 			log_failure( "gen::%s: Invalid name length provided - %d", #Context_, length ); \ | ||||||
|  | 			return Code::Invalid;                                                           \ | ||||||
|  | 		}                                                                                   \ | ||||||
|  |                                                                                             \ | ||||||
|  | 		if ( Name_ == nullptr )                                                             \ | ||||||
|  | 		{                                                                                   \ | ||||||
|  | 			log_failure( "gen::%s: name is null", #Context_);                               \ | ||||||
|  | 			return Code::Invalid;                                                           \ | ||||||
|  | 		}                                                                                   \ | ||||||
|  | 	}                                                                                       \ | ||||||
|  | 	while (0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #	pragma endregion Helper Functions | ||||||
|  |  | ||||||
| #	pragma region Upfront Constructors | #	pragma region Upfront Constructors | ||||||
| 	Code def_class( s32 length, char const* name, Code parent, Code specifiers, Code body ) | 	Code def_class( s32 length, char const* name, Code parent, Code specifiers, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		if ( length <= 0 ) | 		name_check( def_class, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_class: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_class: name is null"); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( parent && parent->Type != Class || parent->Type != Struct ) | 		if ( parent && parent->Type != Class || parent->Type != Struct ) | ||||||
| 		{ | 		{ | ||||||
| @@ -634,8 +752,6 @@ namespace gen | |||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| 		result->Name = cached_string( name, length ); | 		result->Name = cached_string( name, length ); | ||||||
|  |  | ||||||
| 		array_init( result->Entries, StaticData::Allocator_CodePool ); |  | ||||||
|  |  | ||||||
| 		if ( body ) | 		if ( body ) | ||||||
| 		{ | 		{ | ||||||
| 			switch ( body->Type ) | 			switch ( body->Type ) | ||||||
| @@ -649,7 +765,8 @@ namespace gen | |||||||
| 					return Code::Invalid; | 					return Code::Invalid; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			result->Type = Class; | 			result->Type    = Class; | ||||||
|  | 			result->Entries = make_code_entries(); | ||||||
| 			result->add_entry( body ); | 			result->add_entry( body ); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| @@ -671,17 +788,7 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		if ( length <= 0 ) | 		name_check( def_enum, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_enum: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_class: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( type && type->Type != Typename ) | 		if ( type && type->Type != Typename ) | ||||||
| 		{ | 		{ | ||||||
| @@ -709,6 +816,7 @@ namespace gen | |||||||
| 			result->Type = specifier == EnumClass ? | 			result->Type = specifier == EnumClass ? | ||||||
| 				Enum_Class : Enum; | 				Enum_Class : Enum; | ||||||
|  |  | ||||||
|  | 			result->Entries = make_code_entries(); | ||||||
| 			result->add_entry( body ); | 			result->add_entry( body ); | ||||||
| 		} | 		} | ||||||
| 		else if ( specifier == EnumClass ) | 		else if ( specifier == EnumClass ) | ||||||
| @@ -726,6 +834,37 @@ namespace gen | |||||||
| 		return result; | 		return result; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	Code def_friend( Code symbol ) | ||||||
|  | 	{ | ||||||
|  | 		using namespace ECode; | ||||||
|  |  | ||||||
|  | 		if ( ! symbol ) | ||||||
|  | 		{ | ||||||
|  | 			log_failure( "gen::def_friend: symbol provided is null!" ); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ( symbol == Code::Invalid ) | ||||||
|  | 		{ | ||||||
|  | 			log_failure("gen::def_friend: symbol provided is invalid!" ); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		switch ( symbol->Type ) | ||||||
|  | 		{ | ||||||
|  | 			case Class_FwdDecl: | ||||||
|  | 			case Function_FwdDecl: | ||||||
|  | 			case Operator_FwdDecl: | ||||||
|  | 			case Struct_FwdDecl: | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 			default: | ||||||
|  | 				log_failure("gen::def_friend: symbol cannot be used with friend, must be a forward declare - %s", symbol->debug_str()); | ||||||
|  | 				return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	Code def_function( s32 length, char const* name | 	Code def_function( s32 length, char const* name | ||||||
| 		, Code specifiers | 		, Code specifiers | ||||||
| 		, Code params | 		, Code params | ||||||
| @@ -735,17 +874,7 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		if ( length <= 0 ) | 		name_check( def_function, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( specifiers && specifiers->Type != Specifiers ) | 		if ( specifiers && specifiers->Type != Specifiers ) | ||||||
| 		{ | 		{ | ||||||
| @@ -817,17 +946,7 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		if ( length <= 0 ) | 		name_check( def_namespace, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_namespace: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_namespace: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| @@ -881,17 +1000,7 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
| 		if ( length <= 0 ) | 		name_check( def_struct, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( specifiers && specifiers->Type != Specifiers ) | 		if ( specifiers && specifiers->Type != Specifiers ) | ||||||
| 		{ | 		{ | ||||||
| @@ -912,11 +1021,10 @@ namespace gen | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		result       = make_code(); | 		result          = make_code(); | ||||||
| 		result->Type = Struct; | 		result->Type    = Struct; | ||||||
| 		result->Name = cached_string( name, length ); | 		result->Name    = cached_string( name, length ); | ||||||
|  | 		result->Entries = make_code_entries(); | ||||||
| 		array_init( result->Entries, g_allocator ); |  | ||||||
|  |  | ||||||
| 		if ( body ) | 		if ( body ) | ||||||
| 			result->add_entry( body ); | 			result->add_entry( body ); | ||||||
| @@ -932,17 +1040,7 @@ namespace gen | |||||||
|  |  | ||||||
| 	Code def_variable( Code type, u32 length, char const* name, Code value, Code specifiers ) | 	Code def_variable( Code type, u32 length, char const* name, Code value, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		if ( length <= 0 ) | 		name_check( def_variable, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( specifiers && specifiers->Type != ECode::Specifiers ) | 		if ( specifiers && specifiers->Type != ECode::Specifiers ) | ||||||
| 		{ | 		{ | ||||||
| @@ -963,11 +1061,10 @@ namespace gen | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		result       = make_code(); | 		result          = make_code(); | ||||||
| 		result->Name = cached_string( name, length ); | 		result->Name    = cached_string( name, length ); | ||||||
| 		result->Type = ECode::Variable; | 		result->Type    = ECode::Variable; | ||||||
|  | 		result->Entries = make_code_entries(); | ||||||
| 		array_init( result->Entries, g_allocator ); |  | ||||||
|  |  | ||||||
| 		if ( specifiers ) | 		if ( specifiers ) | ||||||
| 			result->add_entry( specifiers ); | 			result->add_entry( specifiers ); | ||||||
| @@ -982,17 +1079,7 @@ namespace gen | |||||||
|  |  | ||||||
| 	Code def_type( u32 length, char const* name,  Code specifiers ) | 	Code def_type( u32 length, char const* name,  Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		if ( length <= 0 ) | 		name_check( def_type, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| @@ -1004,17 +1091,7 @@ namespace gen | |||||||
|  |  | ||||||
| 	Code def_using( u32 length, char const* name, Code type, UsingT specifier ) | 	Code def_using( u32 length, char const* name, Code type, UsingT specifier ) | ||||||
| 	{ | 	{ | ||||||
| 		if ( length <= 0 ) | 		name_check( def_using, length, name ); | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: Invalid name length provided - %d", length ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( name == nullptr ) |  | ||||||
| 		{ |  | ||||||
| 			log_failure( "gen::def_function: name is null" ); |  | ||||||
| 			return Code::Invalid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		result       = make_code(); | 		result       = make_code(); | ||||||
| @@ -1259,7 +1336,7 @@ namespace gen | |||||||
| 		Code type = va_arg(va, Code); | 		Code type = va_arg(va, Code); | ||||||
|  |  | ||||||
| 		char const* name        = va_arg(va, char const*); | 		char const* name        = va_arg(va, char const*); | ||||||
| 		s32         name_length = zpl_strnlen(name, MaxNameLength); | 		s32         name_length = strnlen(name, MaxNameLength); | ||||||
|  |  | ||||||
| 		result->Name = cached_string( name, name_length ); | 		result->Name = cached_string( name, name_length ); | ||||||
|  |  | ||||||
| @@ -1278,7 +1355,7 @@ namespace gen | |||||||
| 			type = va_arg(va, Code); | 			type = va_arg(va, Code); | ||||||
|  |  | ||||||
| 			name        = va_arg(va, char const*); | 			name        = va_arg(va, char const*); | ||||||
| 			name_length = zpl_strnlen(name, MaxNameLength); | 			name_length = strnlen(name, MaxNameLength); | ||||||
|  |  | ||||||
| 			Code | 			Code | ||||||
| 			param       = make_code(); | 			param       = make_code(); | ||||||
| @@ -1312,12 +1389,12 @@ namespace gen | |||||||
| 	Code def_specifiers( s32 num, ... ) | 	Code def_specifiers( s32 num, ... ) | ||||||
| 	{ | 	{ | ||||||
| 		if ( num <= 0 ) | 		if ( num <= 0 ) | ||||||
| 			fatal("gen::make_specifier: num cannot be zero or less"); | 			log_failure("gen::make_specifier: num cannot be zero or less"); | ||||||
|  |  | ||||||
| 		// This should be more than enough... | 		// This should be more than enough... | ||||||
| 		static u8 FixedSizedBuffer[kilobytes(1024)]; | 		static u8 FixedSizedBuffer[kilobytes(1024)]; | ||||||
|  |  | ||||||
| 		static arena str_arena; | 		static Arena str_arena; | ||||||
| 		do_once_start | 		do_once_start | ||||||
| 			arena_init_from_memory( & str_arena, FixedSizedBuffer, kilobytes(1024) ); | 			arena_init_from_memory( & str_arena, FixedSizedBuffer, kilobytes(1024) ); | ||||||
| 		do_once_end | 		do_once_end | ||||||
| @@ -1326,7 +1403,7 @@ namespace gen | |||||||
| 		result          = make_code(); | 		result          = make_code(); | ||||||
| 		result->Type    = ECode::Specifiers; | 		result->Type    = ECode::Specifiers; | ||||||
|  |  | ||||||
| 		string crafted = string_make( arena_allocator( & str_arena ), "" ); | 		String crafted = string_make( arena_allocator( & str_arena ), "" ); | ||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, num); | 		va_start(va, num); | ||||||
| @@ -1337,13 +1414,13 @@ namespace gen | |||||||
| 			switch ( type ) | 			switch ( type ) | ||||||
| 			{ | 			{ | ||||||
| 				case ESpecifier::Alignas: | 				case ESpecifier::Alignas: | ||||||
| 					crafted = string_append_fmt( result->Content, "%s(%d)", ESpecifier::to_str(type), va_arg(va, u32) ); | 					crafted = string_append_fmt( (String)result->Content, "%s(%d)", ESpecifier::to_str(type), va_arg(va, u32) ); | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 				default: | 				default: | ||||||
| 					const char* str = ESpecifier::to_str(type); | 					const char* str = ESpecifier::to_str(type); | ||||||
|  |  | ||||||
| 					crafted = string_append_fmt( result->Content, "%s", str ); | 					crafted = string_append_fmt( (String)result->Content, "%s", str ); | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| @@ -1429,6 +1506,8 @@ namespace gen | |||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
|  | 		name_check( make_function, length, name ); | ||||||
|  |  | ||||||
| 		if ( specifiers && specifiers->Type != Specifiers ) | 		if ( specifiers && specifiers->Type != Specifiers ) | ||||||
| 		{ | 		{ | ||||||
| 			log_failure( "gen::def_function: specifiers was not a `Specifiers` type" ); | 			log_failure( "gen::def_function: specifiers was not a `Specifiers` type" ); | ||||||
| @@ -1472,14 +1551,15 @@ namespace gen | |||||||
| 		return result; | 		return result; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Code make_global_body( char const* name = "", s32 num = 0, ... ) | 	Code make_global_body( s32 length, char const* name, s32 num, ... ) | ||||||
| 	{ | 	{ | ||||||
| 		Code | 		name_check( make_global_body, length, name ); | ||||||
| 		result = make_code(); |  | ||||||
| 		result->Type = ECode::Global_Body; |  | ||||||
| 		result->Name = string_make( g_allocator, ""); |  | ||||||
|  |  | ||||||
| 		array_init( result->Entries, g_allocator ); | 		Code | ||||||
|  | 		result          = make_code(); | ||||||
|  | 		result->Type    = ECode::Global_Body; | ||||||
|  | 		result->Name    = cached_string( name, length ); | ||||||
|  | 		result->Entries = make_code_entries(); | ||||||
|  |  | ||||||
| 		// Making body at entry 0; | 		// Making body at entry 0; | ||||||
| 		result->add_entry( make_code() ); | 		result->add_entry( make_code() ); | ||||||
| @@ -1507,10 +1587,12 @@ namespace gen | |||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Code make_struct( char const* name, Code parent, Code specifiers ) | 	Code make_struct( s32 length, char const* name, Code parent, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		using namespace ECode; | 		using namespace ECode; | ||||||
|  |  | ||||||
|  | 		name_check( make_struct, length, name ); | ||||||
|  |  | ||||||
| 		if ( specifiers && specifiers->Type != Specifiers ) | 		if ( specifiers && specifiers->Type != Specifiers ) | ||||||
| 		{ | 		{ | ||||||
| 			log_failure( "gen::def_struct: specifiers was not a `Specifiers` type" ); | 			log_failure( "gen::def_struct: specifiers was not a `Specifiers` type" ); | ||||||
| @@ -1527,7 +1609,7 @@ namespace gen | |||||||
| 		result          = make_code(); | 		result          = make_code(); | ||||||
| 		result->Type    = Struct; | 		result->Type    = Struct; | ||||||
| 		result->Name    = string_make( g_allocator, name ); | 		result->Name    = string_make( g_allocator, name ); | ||||||
| 		result->Entires = make_code_entries(); | 		result->Entries = make_code_entries(); | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| 		body          = make_code(); | 		body          = make_code(); | ||||||
| @@ -1575,7 +1657,7 @@ namespace gen | |||||||
| 			return Code::Invalid; | 			return Code::Invalid; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		arena mem; | 		Arena mem; | ||||||
| 		do_once_start | 		do_once_start | ||||||
| 		{ | 		{ | ||||||
| 			arena_init_from_allocator( & mem, heap(), kilobytes( 10 ) ); | 			arena_init_from_allocator( & mem, heap(), kilobytes( 10 ) ); | ||||||
| @@ -1600,7 +1682,7 @@ namespace gen | |||||||
| 		Param Params[ 64 ] { 0 }; | 		Param Params[ 64 ] { 0 }; | ||||||
|  |  | ||||||
| 		// Zero out params before a run of this func. | 		// Zero out params before a run of this func. | ||||||
| 		zpl_memset( Params, 0, sizeof( Params )); | 		memset( Params, 0, sizeof( Params )); | ||||||
|  |  | ||||||
| 		char const* name; | 		char const* name; | ||||||
| 		s32         name_length = 0; | 		s32         name_length = 0; | ||||||
| @@ -1741,7 +1823,7 @@ namespace gen | |||||||
|  |  | ||||||
| 	Code parse_struct( s32 length, char const* def ) | 	Code parse_struct( s32 length, char const* def ) | ||||||
| 	{ | 	{ | ||||||
| 		arena mem; | 		Arena mem; | ||||||
| 		do_once_start | 		do_once_start | ||||||
| 			arena_init_from_allocator( & mem, heap(), kilobytes( 10 ) ); | 			arena_init_from_allocator( & mem, heap(), kilobytes( 10 ) ); | ||||||
| 		do_once_end | 		do_once_end | ||||||
| @@ -1848,7 +1930,7 @@ namespace gen | |||||||
|  |  | ||||||
| 		va_list va; | 		va_list va; | ||||||
| 		va_start(va, fmt); | 		va_start(va, fmt); | ||||||
| 		zpl_snprintf_va(buf, ZPL_PRINTF_MAXLEN, fmt, va); | 		snprintf_va(buf, ZPL_PRINTF_MAXLEN, fmt, va); | ||||||
| 		va_end(va); | 		va_end(va); | ||||||
|  |  | ||||||
| 		Code | 		Code | ||||||
| @@ -1892,11 +1974,11 @@ namespace gen | |||||||
|  |  | ||||||
| 	bool Builder::open( char const* path ) | 	bool Builder::open( char const* path ) | ||||||
| 	{ | 	{ | ||||||
| 		file_error error = file_open_mode( & File, ZPL_FILE_MODE_WRITE, path ); | 		FileError error = file_open_mode( & File, EFileMode_WRITE, path ); | ||||||
|  |  | ||||||
| 		if ( error != ZPL_FILE_ERROR_NONE ) | 		if ( error != EFileError_NONE ) | ||||||
| 		{ | 		{ | ||||||
| 			fatal( "gen::File::open - Could not open file: %s", path); | 			log_failure( "gen::File::open - Could not open file: %s", path); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -1910,7 +1992,7 @@ namespace gen | |||||||
| 		bool result = file_write( & File, Buffer, string_length(Buffer) ); | 		bool result = file_write( & File, Buffer, string_length(Buffer) ); | ||||||
|  |  | ||||||
| 		if ( result == false ) | 		if ( result == false ) | ||||||
| 			fatal("gen::File::write - Failed to write to file: %s", file_name( & File ) ); | 			log_failure("gen::File::write - Failed to write to file: %s", file_name( & File ) ); | ||||||
|  |  | ||||||
| 		// file_seek( & File, 0 ); | 		// file_seek( & File, 0 ); | ||||||
| 		file_close( & File ); | 		file_close( & File ); | ||||||
|   | |||||||
							
								
								
									
										116
									
								
								project/gen.hpp
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								project/gen.hpp
									
									
									
									
									
								
							| @@ -368,7 +368,7 @@ namespace gen | |||||||
| 		Entry( Namespace )          \ | 		Entry( Namespace )          \ | ||||||
| 		Entry( Namespace_Body )     \ | 		Entry( Namespace_Body )     \ | ||||||
| 		Entry( Operator )           \ | 		Entry( Operator )           \ | ||||||
| 		Entry( Operator_Fwd )       \ | 		Entry( Operator_FwdDecl )   \ | ||||||
| 		Entry( Parameters )         \ | 		Entry( Parameters )         \ | ||||||
| 		Entry( Specifiers )         \ | 		Entry( Specifiers )         \ | ||||||
| 		Entry( Struct )             \ | 		Entry( Struct )             \ | ||||||
| @@ -580,7 +580,7 @@ namespace gen | |||||||
| 				{ | 				{ | ||||||
| 					char const* enum_str = to_str( (Type)index ); | 					char const* enum_str = to_str( (Type)index ); | ||||||
|  |  | ||||||
| 					keymap[index] = crc32( enum_str, zpl_strnlen(enum_str, 42) ); | 					keymap[index] = crc32( enum_str, strnlen(enum_str, 42) ); | ||||||
| 				} | 				} | ||||||
| 			do_once_end | 			do_once_end | ||||||
|  |  | ||||||
| @@ -684,7 +684,7 @@ namespace gen | |||||||
| 			// Thus if its desired to keep the debug str | 			// Thus if its desired to keep the debug str | ||||||
| 			// for multiple calls to bprintf, | 			// for multiple calls to bprintf, | ||||||
| 			// allocate this to proper string. | 			// allocate this to proper string. | ||||||
| 			return bprintf( fmt | 			return zpl::bprintf( fmt | ||||||
| 			,	type_str() | 			,	type_str() | ||||||
| 			,	Readonly ? "true"       : "false" | 			,	Readonly ? "true"       : "false" | ||||||
| 			,	Parent   ? Parent->Name : "" | 			,	Parent   ? Parent->Name : "" | ||||||
| @@ -699,7 +699,7 @@ namespace gen | |||||||
| 			return ECode::str( Type ); | 			return ECode::str( Type ); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		string to_string() const; | 		String to_string() const; | ||||||
| #	pragma endregion Member Functions | #	pragma endregion Member Functions | ||||||
|  |  | ||||||
| #		define Using_Code_POD            \ | #		define Using_Code_POD            \ | ||||||
| @@ -707,7 +707,7 @@ namespace gen | |||||||
| 		string_const      Name;          \ | 		string_const      Name;          \ | ||||||
| 		string_const      Comment;       \ | 		string_const      Comment;       \ | ||||||
| 		union {                          \ | 		union {                          \ | ||||||
| 			array(AST*)   Entries;       \ | 			Array(AST*)   Entries;       \ | ||||||
| 			string_const  Content;       \ | 			string_const  Content;       \ | ||||||
| 		};                               \ | 		};                               \ | ||||||
| 		CodeT             Type;          \ | 		CodeT             Type;          \ | ||||||
| @@ -851,7 +851,7 @@ namespace gen | |||||||
| 	/* | 	/* | ||||||
| 		Implements basic string interning. Data structure is based off the ZPL Hashtable. | 		Implements basic string interning. Data structure is based off the ZPL Hashtable. | ||||||
| 	*/ | 	*/ | ||||||
| 	ZPL_TABLE_DECLARE( ZPL_EXTERN, StringTable, str_tbl_, string ); | 	ZPL_TABLE_DECLARE( ZPL_EXTERN, StringTable, str_tbl_, String ); | ||||||
|  |  | ||||||
| 	// Represents strings cached with the string table. | 	// Represents strings cached with the string table. | ||||||
| 	// Should never be modified, if changed string is desired, cache_string( str ) another. | 	// Should never be modified, if changed string is desired, cache_string( str ) another. | ||||||
| @@ -895,20 +895,21 @@ namespace gen | |||||||
| 		This provides a fresh Code AST array for the entries field of the AST. | 		This provides a fresh Code AST array for the entries field of the AST. | ||||||
| 		This is done separately from the regular CodePool allocator. | 		This is done separately from the regular CodePool allocator. | ||||||
| 	*/ | 	*/ | ||||||
| 	array(AST*) make_code_entries(); | 	Array(AST*) make_code_entries(); | ||||||
|  |  | ||||||
| 	// Set these before calling gen's init() procedure. | 	// Set these before calling gen's init() procedure. | ||||||
|  |  | ||||||
|  | 	void set_allocator_code_pool   ( AllocatorInfo pool_allocator ); | ||||||
|  | 	void set_allocator_string_arena( AllocatorInfo string_allocator ); | ||||||
|  | 	void set_allocator_string_table( AllocatorInfo string_allocator ); | ||||||
|  | 	void set_allocator_type_table  ( AllocatorInfo type_reg_allocator ); | ||||||
|  |  | ||||||
| 	void set_init_reserve_code_pool        ( sw size ); | 	void set_init_reserve_code_pool        ( sw size ); | ||||||
| 	void set_init_reserve_code_entries_pool( sw size ); | 	void set_init_reserve_code_entries_pool( sw size ); | ||||||
| 	void set_init_reserve_string_arena     ( sw size ); |  | ||||||
| 	void set_init_reserve_string_table     ( sw size ); | 	void set_init_reserve_string_table     ( sw size ); | ||||||
| 	void set_init_reserve_type_table       ( sw size ); | 	void set_init_reserve_type_table       ( sw size ); | ||||||
|  |  | ||||||
| 	void set_allocator_code_pool   ( allocator pool_allocator ); | 	void set_size_string_arena( sw size ); | ||||||
| 	void set_allocator_string_arena( allocator string_allocator ); |  | ||||||
| 	void set_allocator_string_table( allocator string_allocator ); |  | ||||||
| 	void set_allocator_type_table  ( allocator type_reg_allocator ); |  | ||||||
|  |  | ||||||
| #	pragma region Upfront | #	pragma region Upfront | ||||||
| 	Code def_class          (             char const* name, Code parent = NoCode,                         Code specifiers = NoCode, Code body = NoCode ); | 	Code def_class          (             char const* name, Code parent = NoCode,                         Code specifiers = NoCode, Code body = NoCode ); | ||||||
| @@ -945,7 +946,6 @@ namespace gen | |||||||
| 	Code def_function_body  ( s32 num, Code* codes ); | 	Code def_function_body  ( s32 num, Code* codes ); | ||||||
| 	Code def_namespace_body ( s32 num, ... ); | 	Code def_namespace_body ( s32 num, ... ); | ||||||
| 	Code def_params         ( s32 num, ... ); | 	Code def_params         ( s32 num, ... ); | ||||||
| 	Code def_params_macro   ( s32 num, ... ); |  | ||||||
| 	Code def_params         ( s32 num, Code* params ); | 	Code def_params         ( s32 num, Code* params ); | ||||||
| 	Code def_specifiers     ( s32 num , ... ); | 	Code def_specifiers     ( s32 num , ... ); | ||||||
| 	Code def_specifiers     ( s32 num, SpecifierT* specs ); | 	Code def_specifiers     ( s32 num, SpecifierT* specs ); | ||||||
| @@ -954,21 +954,21 @@ namespace gen | |||||||
| #	pragma endregion Upfront | #	pragma endregion Upfront | ||||||
|  |  | ||||||
| #	pragma region Incremental | #	pragma region Incremental | ||||||
| 	Code make_class       (             char const* name, Code parent = NoCode,                                Code specifiers = NoCode ); | 	Code make_class       (                 char const* name, Code parent = NoCode,                                Code specifiers = NoCode ); | ||||||
| 	Code make_class       ( s32 length, char const* name, Code parent = NoCode,                                Code specifiers = NoCode ); | 	Code make_class       ( s32 length,     char const* name, Code parent = NoCode,                                Code specifiers = NoCode ); | ||||||
| 	Code make_enum        (             char const* name, Code type   = NoCode, EnumT specifier = EnumRegular ); | 	Code make_enum        (                 char const* name, Code type   = NoCode, EnumT specifier = EnumRegular ); | ||||||
| 	Code make_enum        ( s32 length, char const* name, Code type   = NoCode, EnumT specifier = EnumRegular ); | 	Code make_enum        ( s32 length,     char const* name, Code type   = NoCode, EnumT specifier = EnumRegular ); | ||||||
| 	Code make_function    (             char const* name, Code params = NoCode, Code ret_type   = NoCode,      Code specifiers = NoCode ); | 	Code make_function    (                 char const* name, Code params = NoCode, Code ret_type   = NoCode,      Code specifiers = NoCode ); | ||||||
| 	Code make_function    ( s32 length, char const* name, Code params = NoCode, Code ret_type   = NoCode,      Code specifiers = NoCode ); | 	Code make_function    ( s32 length,     char const* name, Code params = NoCode, Code ret_type   = NoCode,      Code specifiers = NoCode ); | ||||||
| 	Code make_global_body (             char const* name = "", s32 num = 0, ... ); | 	Code make_global_body (                 char const* name = "", s32 num = 0, ... ); | ||||||
| 	Code make_global_body ( s32 length, char const* name = "", s32 num = 0, ... ); | 	Code make_global_body ( s32 length = 1, char const* name = "", s32 num = 0, ... ); | ||||||
| 	Code make_namespace   (             char const* name ); | 	Code make_namespace   (                 char const* name ); | ||||||
| 	Code make_namespace   ( s32 length, char const* name ); | 	Code make_namespace   ( s32 length,     char const* name ); | ||||||
| 	Code make_operator    (              OperatorT   op,  Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode ); | 	Code make_operator    (                 OperatorT   op,  Code params = NoCode, Code ret_type = NoCode, Code specifiers = NoCode ); | ||||||
| 	Code make_params      (); | 	Code make_params      (); | ||||||
| 	Code make_specifiers  (); | 	Code make_specifiers  (); | ||||||
| 	Code make_struct      (             char const* name, Code parent = NoCode,                         Code specifiers = NoCode ); | 	Code make_struct      (                 char const* name, Code parent = NoCode,                         Code specifiers = NoCode ); | ||||||
| 	Code make_struct      ( s32 length, char const* name, Code parent = NoCode,                         Code specifiers = NoCode ); | 	Code make_struct      ( s32 length,     char const* name, Code parent = NoCode,                         Code specifiers = NoCode ); | ||||||
| #	pragma endregion Incremental | #	pragma endregion Incremental | ||||||
|  |  | ||||||
| #	pragma region Parsing | #	pragma region Parsing | ||||||
| @@ -1006,8 +1006,8 @@ namespace gen | |||||||
|  |  | ||||||
| 	struct Builder | 	struct Builder | ||||||
| 	{ | 	{ | ||||||
| 		zpl_file File; | 		FileInfo File; | ||||||
| 		string   Buffer; | 		String   Buffer; | ||||||
|  |  | ||||||
| 		void print( Code ); | 		void print( Code ); | ||||||
|  |  | ||||||
| @@ -1054,7 +1054,7 @@ namespace gen | |||||||
| 		{ | 		{ | ||||||
| 			union { | 			union { | ||||||
| 				SymbolData Symbol; | 				SymbolData Symbol; | ||||||
| 				string     Specification; | 				String     Specification; | ||||||
| 			}; | 			}; | ||||||
| 			RequestType    Type; | 			RequestType    Type; | ||||||
| 		}; | 		}; | ||||||
| @@ -1067,13 +1067,13 @@ namespace gen | |||||||
| 			bool         Result; | 			bool         Result; | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		static allocator Allocator; | 		static AllocatorInfo Allocator; | ||||||
|  |  | ||||||
| 		static void set_allocator( allocator mem_allocator ); | 		static void set_allocator( AllocatorInfo  allocator ); | ||||||
|  |  | ||||||
| 		array(zpl_file)     Files; | 		Array(FileInfo)     Files; | ||||||
| 		string              Buffer; | 		String              Buffer; | ||||||
| 		array(RequestEntry) Requests; | 		Array(RequestEntry) Requests; | ||||||
|  |  | ||||||
| 		void add_files( s32 num, char const** files ); | 		void add_files( s32 num, char const** files ); | ||||||
|  |  | ||||||
| @@ -1085,7 +1085,7 @@ namespace gen | |||||||
| 		void refactor( char const* file_path, char const* specification_path ); | 		void refactor( char const* file_path, char const* specification_path ); | ||||||
| #	endif | #	endif | ||||||
|  |  | ||||||
| 		bool process_requests( array(Receipt) out_receipts ); | 		bool process_requests( Array(Receipt) out_receipts ); | ||||||
| 	}; | 	}; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -1104,19 +1104,19 @@ namespace gen | |||||||
| 			bool         Result; | 			bool         Result; | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 		allocator Allocator; | 		AllocatorInfo MemAlloc; | ||||||
|  |  | ||||||
| 		static void set_allocator( allocator mem_allocator ); | 		static void set_allocator( AllocatorInfo allocator ); | ||||||
|  |  | ||||||
| 		array(zpl_file)     Files; | 		Array(FileInfo)     Files; | ||||||
| 		string              Buffer; | 		String              Buffer; | ||||||
| 		array(RequestEntry) Requests; | 		Array(RequestEntry) Requests; | ||||||
|  |  | ||||||
| 		void add_files( s32 num, char const** files ); | 		void add_files( s32 num, char const** files ); | ||||||
|  |  | ||||||
| 		void add( SymbolInfo signature, Policy policy ); | 		void add( SymbolInfo signature, Policy policy ); | ||||||
|  |  | ||||||
| 		bool process_requests( array(Receipt) out_receipts ); | 		bool process_requests( Array(Receipt) out_receipts ); | ||||||
| 	}; | 	}; | ||||||
| #endif | #endif | ||||||
| #pragma endregion Gen Interface | #pragma endregion Gen Interface | ||||||
| @@ -1175,8 +1175,8 @@ namespace gen | |||||||
| #	define macrofn_chooser(_f0, _f1, _f2, _f3, _f4, _f5, _f6, _f7, _f8, _f9, _f10, _f11, _f12, _f13, _f14, _f15, _f16, ...) _f16 | #	define macrofn_chooser(_f0, _f1, _f2, _f3, _f4, _f5, _f6, _f7, _f8, _f9, _f10, _f11, _f12, _f13, _f14, _f15, _f16, ...) _f16 | ||||||
| #	define macrofn_recomposer(ArgsWithParentheses_) macrofn_chooser ArgsWithParentheses_ | #	define macrofn_recomposer(ArgsWithParentheses_) macrofn_chooser ArgsWithParentheses_ | ||||||
| #	define macrofn_chose_from_arg_num(F, ...)       macrofn_recomposer((__VA_ARGS__, F##_16, F##_15, F##_14, F##_13, F##_12, F##_11, F##_10, F##_9, F##_8, F##_7, F##_6, F##_5, F##_4, F##_3, F##_2, F##_1, )) | #	define macrofn_chose_from_arg_num(F, ...)       macrofn_recomposer((__VA_ARGS__, F##_16, F##_15, F##_14, F##_13, F##_12, F##_11, F##_10, F##_9, F##_8, F##_7, F##_6, F##_5, F##_4, F##_3, F##_2, F##_1, )) | ||||||
| #	define marcofn_no_arg_expander(Func)            ,,,,,,,,,,,,,,,,Func_ ## _0 | #	define marcofn_no_arg_expander(Func_)           ,,,,,,,,,,,,,,,,Func_ ## _0 | ||||||
| #	define macrofn_finder(Func_, ...)               macrofn_chose_from_arg_num(Func_, tbc_marcofn_no_arg_expander __VA_ARGS__ (Func_)) | #	define macrofn_finder(Func_, ...)               macrofn_chose_from_arg_num(Func_, marcofn_no_arg_expander __VA_ARGS__ (Func_)) | ||||||
| #	define macrofn_polymorphic(Func_, ...)          macrofn_finder(Func_, __VA_ARGS__)(__VA_ARGS__) | #	define macrofn_polymorphic(Func_, ...)          macrofn_finder(Func_, __VA_ARGS__)(__VA_ARGS__) | ||||||
|  |  | ||||||
| #	define function_5( Name_, Params_, RetType_, Specifiers_, Body_ ) gen::def_function( txt_n_len( Name_ ), macro_expand( Params_ ), type_ns(RetType_), Specifiers_, Body_ ) | #	define function_5( Name_, Params_, RetType_, Specifiers_, Body_ ) gen::def_function( txt_n_len( Name_ ), macro_expand( Params_ ), type_ns(RetType_), Specifiers_, Body_ ) | ||||||
| @@ -1306,91 +1306,91 @@ namespace gen | |||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_class( char const* name, Code parent, Code specifiers, Code body ) | 	Code def_class( char const* name, Code parent, Code specifiers, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_class( zpl_strnlen( name, MaxNameLength ), name, parent, specifiers, body ); | 		return def_class( strnlen( name, MaxNameLength ), name, parent, specifiers, body ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_enum( char const* name, Code type, EnumT specifier, Code body ) | 	Code def_enum( char const* name, Code type, EnumT specifier, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_enum( zpl_strnlen( name, MaxNameLength ), name, type, specifier, body ); | 		return def_enum( strnlen( name, MaxNameLength ), name, type, specifier, body ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_function( char const* name, Code params, Code ret_type, Code specifiers, Code body ) | 	Code def_function( char const* name, Code params, Code ret_type, Code specifiers, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_function( zpl_strnlen( name, MaxNameLength), name, params, ret_type, specifiers, body ); | 		return def_function( strnlen( name, MaxNameLength), name, params, ret_type, specifiers, body ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_namespace( char const* name, Code body ) | 	Code def_namespace( char const* name, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_namespace( zpl_strnlen( name, MaxNameLength), name, body ); | 		return def_namespace( strnlen( name, MaxNameLength), name, body ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_param( Code type, char const* name ) | 	Code def_param( Code type, char const* name ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_param( type, zpl_strnlen( name, MaxNameLength ), name ); | 		return def_param( type, strnlen( name, MaxNameLength ), name ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_struct( char const* name, Code parent, Code specifiers, Code body ) | 	Code def_struct( char const* name, Code parent, Code specifiers, Code body ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_struct( zpl_strnlen( name, MaxNameLength), name, parent, specifiers, body ); | 		return def_struct( strnlen( name, MaxNameLength), name, parent, specifiers, body ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_type( char const* name, Code specifiers ) | 	Code def_type( char const* name, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_type( zpl_strnlen( name, MaxNameLength ), name, specifiers ); | 		return def_type( strnlen( name, MaxNameLength ), name, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_using( char const* name, Code type, UsingT specifier ) | 	Code def_using( char const* name, Code type, UsingT specifier ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_using( zpl_strnlen( name, MaxNameLength ), name, type, specifier ); | 		return def_using( strnlen( name, MaxNameLength ), name, type, specifier ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code def_variable( Code type, char const* name, Code value, Code specifiers ) | 	Code def_variable( Code type, char const* name, Code value, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return def_variable( type, zpl_strnlen(name, MaxNameLength ), name, value, specifiers ); | 		return def_variable( type, strnlen(name, MaxNameLength ), name, value, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code make_class( char const* name, Code parent, Code specifiers ) | 	Code make_class( char const* name, Code parent, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return make_class( zpl_strnlen(name, MaxNameLength), name, parent, specifiers ); | 		return make_class( strnlen(name, MaxNameLength), name, parent, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code make_enum( char const* name, Code type, Code specifiers ) | 	Code make_enum( char const* name, Code type, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return make_struct( zpl_strnlen(name, MaxNameLength), name, type, specifiers ); | 		return make_struct( strnlen(name, MaxNameLength), name, type, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code make_function( char const* name, Code params, Code ret_type, Code specifiers ) | 	Code make_function( char const* name, Code params, Code ret_type, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return make_function( zpl_strnlen(name, MaxNameLength), name, params, ret_type, specifiers ); | 		return make_function( strnlen(name, MaxNameLength), name, params, ret_type, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code make_namespace( char const* name ) | 	Code make_namespace( char const* name ) | ||||||
| 	{ | 	{ | ||||||
| 		return make_namespace( zpl_strnlen( name, MaxNameLength ), name ); | 		return make_namespace( strnlen( name, MaxNameLength ), name ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code make_struct( char const* name, Code parent, Code specifiers ) | 	Code make_struct( char const* name, Code parent, Code specifiers ) | ||||||
| 	{ | 	{ | ||||||
| 		return make_struct( zpl_strnlen(name, MaxNameLength), name, parent, specifiers ); | 		return make_struct( strnlen(name, MaxNameLength), name, parent, specifiers ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	forceinline | 	forceinline | ||||||
| 	Code untyped_str( char const* str ) | 	Code untyped_str( char const* str ) | ||||||
| 	{ | 	{ | ||||||
| 		return untyped_str( zpl_strnlen( str, MaxUntypedStrLength ), str ); | 		return untyped_str( strnlen( str, MaxUntypedStrLength ), str ); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| #pragma endregion Gen Interface Inlines | #pragma endregion Gen Interface Inlines | ||||||
|   | |||||||
							
								
								
									
										39145
									
								
								thirdparty/zpl.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39145
									
								
								thirdparty/zpl.h
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user