Scripting updates, some refactors..

Made a package release script.

Did refactors based on some design considerations
Still need to make some major decisions...
This commit is contained in:
Edward R. Gonzalez 2023-08-09 18:47:59 -04:00
parent 5aff89262b
commit aa928ff446
46 changed files with 371 additions and 312 deletions

View File

@ -360,7 +360,7 @@ Code <name> = code_str( <some code without "" quotes > )
Template metaprogramming in the traditional sense becomes possible with the use of `token_fmt` and parse constructors: Template metaprogramming in the traditional sense becomes possible with the use of `token_fmt` and parse constructors:
```cpp ```cpp
StrC value = txt_StrC("Something"); StrC value = txt("Something");
char const* template_str = txt( char const* template_str = txt(
Code with <key> to replace with token_values Code with <key> to replace with token_values
@ -447,7 +447,7 @@ and have the desired specifiers assigned to them beforehand.
## Code generation and modification ## Code generation and modification
There are three provided file interfaces: There are three provided auxillary interfaces:
* Builder * Builder
* Editor * Editor
@ -462,11 +462,12 @@ Editor and Scanner are disabled by default, use `GEN_FEATURE_EDITOR` and `GEN_FE
* The code is provided via print( code ) function will be serialized to its buffer. * The code is provided via print( code ) function will be serialized to its buffer.
* When all serialization is finished, use the write() command to write the buffer to the file. * When all serialization is finished, use the write() command to write the buffer to the file.
### Editor is for editing a series of files based on a set of requests provided to it ### Editor is for editing a series of files/asts based on a set of requests provided to it
**Note: Not implemented yet** **Note: Not implemented yet**
* The purpose is to overrite a specific file, it places its contents in a buffer to scan. * The purpose is to overrite a specific file, it places its contents in a buffer to scan.
* If editing an AST it will generate a new ast as a result (ASTs are not edited).
* Requests are populated using the following interface: * Requests are populated using the following interface:
* add : Add code. * add : Add code.
* remove : Remove code. * remove : Remove code.
@ -486,7 +487,7 @@ Additionally if `GEN_FEATURE_EDITOR_REFACTOR` is defined, refactor( file_path, s
Refactor is based of the refactor library and uses its interface. Refactor is based of the refactor library and uses its interface.
It will on call add a request to the queue to run the refactor script on the file. It will on call add a request to the queue to run the refactor script on the file.
### Scanner allows the user to generate Code ASTs by reading files ### Scanner allows the user to sift through a series of files/asts based on a set of requests provided to it
**Note: Not implemented yet** **Note: Not implemented yet**
@ -495,8 +496,6 @@ It will on call add a request to the queue to run the refactor script on the fil
The file will only be read from, no writing supported. The file will only be read from, no writing supported.
One great use case is for example: generating the single-header library for gencpp!
### Additional Info (Editor and Scanner) ### Additional Info (Editor and Scanner)
When all requests have been populated, call process_requests(). When all requests have been populated, call process_requests().

View File

@ -0,0 +1 @@

View File

@ -5,13 +5,13 @@ Code scan_file( char const* path )
FileError error = file_open_mode( & file, EFileMode_READ, path ); FileError error = file_open_mode( & file, EFileMode_READ, path );
if ( error != EFileError_NONE ) if ( error != EFileError_NONE )
{ {
fatal( "scan_file: Could not open: %s", path ); GEN_FATAL( "scan_file: Could not open: %s", path );
} }
sw fsize = file_size( & file ); sw fsize = file_size( & file );
if ( fsize <= 0 ) if ( fsize <= 0 )
{ {
fatal("scan_file: %s is empty", path ); GEN_FATAL("scan_file: %s is empty", path );
} }
String str = String::make_reserve( GlobalAllocator, fsize ); String str = String::make_reserve( GlobalAllocator, fsize );
@ -36,7 +36,6 @@ struct SymbolInfo
Code Signature; Code Signature;
}; };
struct Scanner struct Scanner
{ {
struct RequestEntry struct RequestEntry

View File

@ -15,10 +15,10 @@ void* Global_Allocator_Proc( void* allocator_data, AllocType type, sw size, sw a
Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize ); Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize );
if ( bucket.PhysicalStart == nullptr ) if ( bucket.PhysicalStart == nullptr )
fatal( "Failed to create bucket for Global_AllocatorBuckets"); GEN_FATAL( "Failed to create bucket for Global_AllocatorBuckets");
if ( ! Global_AllocatorBuckets.append( bucket ) ) if ( ! Global_AllocatorBuckets.append( bucket ) )
fatal( "Failed to append bucket to Global_AllocatorBuckets"); GEN_FATAL( "Failed to append bucket to Global_AllocatorBuckets");
last = & Global_AllocatorBuckets.back(); last = & Global_AllocatorBuckets.back();
} }
@ -42,10 +42,10 @@ void* Global_Allocator_Proc( void* allocator_data, AllocType type, sw size, sw a
Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize ); Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize );
if ( bucket.PhysicalStart == nullptr ) if ( bucket.PhysicalStart == nullptr )
fatal( "Failed to create bucket for Global_AllocatorBuckets"); GEN_FATAL( "Failed to create bucket for Global_AllocatorBuckets");
if ( ! Global_AllocatorBuckets.append( bucket ) ) if ( ! Global_AllocatorBuckets.append( bucket ) )
fatal( "Failed to append bucket to Global_AllocatorBuckets"); GEN_FATAL( "Failed to append bucket to Global_AllocatorBuckets");
last = & Global_AllocatorBuckets.back(); last = & Global_AllocatorBuckets.back();
} }
@ -68,7 +68,7 @@ internal
void define_constants() void define_constants()
{ {
Code::Global = make_code(); Code::Global = make_code();
Code::Global->Name = get_cached_string( txt_StrC("Global Code") ); Code::Global->Name = get_cached_string( txt("Global Code") );
Code::Global->Content = Code::Global->Name; Code::Global->Content = Code::Global->Name;
Code::Invalid = make_code(); Code::Invalid = make_code();
@ -76,22 +76,22 @@ void define_constants()
t_empty = (CodeType) make_code(); t_empty = (CodeType) make_code();
t_empty->Type = ECode::Typename; t_empty->Type = ECode::Typename;
t_empty->Name = get_cached_string( txt_StrC("") ); t_empty->Name = get_cached_string( txt("") );
t_empty.set_global(); t_empty.set_global();
access_private = make_code(); access_private = make_code();
access_private->Type = ECode::Access_Private; access_private->Type = ECode::Access_Private;
access_private->Name = get_cached_string( txt_StrC("private:") ); access_private->Name = get_cached_string( txt("private:") );
access_private.set_global(); access_private.set_global();
access_protected = make_code(); access_protected = make_code();
access_protected->Type = ECode::Access_Protected; access_protected->Type = ECode::Access_Protected;
access_protected->Name = get_cached_string( txt_StrC("protected:") ); access_protected->Name = get_cached_string( txt("protected:") );
access_protected.set_global(); access_protected.set_global();
access_public = make_code(); access_public = make_code();
access_public->Type = ECode::Access_Public; access_public->Type = ECode::Access_Public;
access_public->Name = get_cached_string( txt_StrC("public:") ); access_public->Name = get_cached_string( txt("public:") );
access_public.set_global(); access_public.set_global();
attrib_api_export = def_attributes( code(GEN_API_Export_Code)); attrib_api_export = def_attributes( code(GEN_API_Export_Code));
@ -102,13 +102,13 @@ void define_constants()
module_global_fragment = make_code(); module_global_fragment = make_code();
module_global_fragment->Type = ECode::Untyped; module_global_fragment->Type = ECode::Untyped;
module_global_fragment->Name = get_cached_string( txt_StrC("module;") ); module_global_fragment->Name = get_cached_string( txt("module;") );
module_global_fragment->Content = module_global_fragment->Name; module_global_fragment->Content = module_global_fragment->Name;
module_global_fragment.set_global(); module_global_fragment.set_global();
module_private_fragment = make_code(); module_private_fragment = make_code();
module_private_fragment->Type = ECode::Untyped; module_private_fragment->Type = ECode::Untyped;
module_private_fragment->Name = get_cached_string( txt_StrC("module : private;") ); module_private_fragment->Name = get_cached_string( txt("module : private;") );
module_private_fragment->Content = module_private_fragment->Name; module_private_fragment->Content = module_private_fragment->Name;
module_private_fragment.set_global(); module_private_fragment.set_global();
@ -118,13 +118,13 @@ void define_constants()
pragma_once = (CodePragma) make_code(); pragma_once = (CodePragma) make_code();
pragma_once->Type = ECode::Preprocess_Pragma; pragma_once->Type = ECode::Preprocess_Pragma;
pragma_once->Name = get_cached_string( txt_StrC("once") ); pragma_once->Name = get_cached_string( txt("once") );
pragma_once->Content = pragma_once->Name; pragma_once->Content = pragma_once->Name;
pragma_once.set_global(); pragma_once.set_global();
param_varadic = (CodeType) make_code(); param_varadic = (CodeType) make_code();
param_varadic->Type = ECode::Parameters; param_varadic->Type = ECode::Parameters;
param_varadic->Name = get_cached_string( txt_StrC("...") ); param_varadic->Name = get_cached_string( txt("...") );
param_varadic->ValueType = t_empty; param_varadic->ValueType = t_empty;
param_varadic.set_global(); param_varadic.set_global();
@ -226,12 +226,12 @@ void init()
Global_AllocatorBuckets = Array<Arena>::init_reserve( heap(), 128 ); Global_AllocatorBuckets = Array<Arena>::init_reserve( heap(), 128 );
if ( Global_AllocatorBuckets == nullptr ) if ( Global_AllocatorBuckets == nullptr )
fatal( "Failed to reserve memory for Global_AllocatorBuckets"); GEN_FATAL( "Failed to reserve memory for Global_AllocatorBuckets");
Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize ); Arena bucket = Arena::init_from_allocator( heap(), Global_BucketSize );
if ( bucket.PhysicalStart == nullptr ) if ( bucket.PhysicalStart == nullptr )
fatal( "Failed to create first bucket for Global_AllocatorBuckets"); GEN_FATAL( "Failed to create first bucket for Global_AllocatorBuckets");
Global_AllocatorBuckets.append( bucket ); Global_AllocatorBuckets.append( bucket );
@ -242,12 +242,12 @@ void init()
CodePools = Array<Pool>::init_reserve( Allocator_DataArrays, InitSize_DataArrays ); CodePools = Array<Pool>::init_reserve( Allocator_DataArrays, InitSize_DataArrays );
if ( CodePools == nullptr ) if ( CodePools == nullptr )
fatal( "gen::init: Failed to initialize the CodePools array" ); GEN_FATAL( "gen::init: Failed to initialize the CodePools array" );
StringArenas = Array<Arena>::init_reserve( Allocator_DataArrays, InitSize_DataArrays ); StringArenas = Array<Arena>::init_reserve( Allocator_DataArrays, InitSize_DataArrays );
if ( StringArenas == nullptr ) if ( StringArenas == nullptr )
fatal( "gen::init: Failed to initialize the StringArenas array" ); GEN_FATAL( "gen::init: Failed to initialize the StringArenas array" );
} }
// Setup the code pool and code entries arena. // Setup the code pool and code entries arena.
@ -255,7 +255,7 @@ void init()
Pool code_pool = Pool::init( Allocator_CodePool, CodePool_NumBlocks, sizeof(AST) ); Pool code_pool = Pool::init( Allocator_CodePool, CodePool_NumBlocks, sizeof(AST) );
if ( code_pool.PhysicalStart == nullptr ) if ( code_pool.PhysicalStart == nullptr )
fatal( "gen::init: Failed to initialize the code pool" ); GEN_FATAL( "gen::init: Failed to initialize the code pool" );
CodePools.append( code_pool ); CodePools.append( code_pool );
@ -264,7 +264,7 @@ void init()
Arena string_arena = Arena::init_from_allocator( Allocator_StringArena, SizePer_StringArena ); Arena string_arena = Arena::init_from_allocator( Allocator_StringArena, SizePer_StringArena );
if ( string_arena.PhysicalStart == nullptr ) if ( string_arena.PhysicalStart == nullptr )
fatal( "gen::init: Failed to initialize the string arena" ); GEN_FATAL( "gen::init: Failed to initialize the string arena" );
StringArenas.append( string_arena ); StringArenas.append( string_arena );
} }
@ -274,7 +274,7 @@ void init()
StringCache = StringTable::init( Allocator_StringTable ); StringCache = StringTable::init( Allocator_StringTable );
if ( StringCache.Entries == nullptr ) if ( StringCache.Entries == nullptr )
fatal( "gen::init: Failed to initialize the StringCache"); GEN_FATAL( "gen::init: Failed to initialize the StringCache");
} }
define_constants(); define_constants();
@ -362,7 +362,7 @@ AllocatorInfo get_string_allocator( s32 str_length )
Arena new_arena = Arena::init_from_allocator( Allocator_StringArena, SizePer_StringArena ); Arena new_arena = Arena::init_from_allocator( Allocator_StringArena, SizePer_StringArena );
if ( ! StringArenas.append( new_arena ) ) if ( ! StringArenas.append( new_arena ) )
fatal( "gen::get_string_allocator: Failed to allocate a new string arena" ); GEN_FATAL( "gen::get_string_allocator: Failed to allocate a new string arena" );
last = & StringArenas.back(); last = & StringArenas.back();
} }
@ -397,10 +397,10 @@ Code make_code()
Pool code_pool = Pool::init( Allocator_CodePool, CodePool_NumBlocks, sizeof(AST) ); Pool code_pool = Pool::init( Allocator_CodePool, CodePool_NumBlocks, sizeof(AST) );
if ( code_pool.PhysicalStart == nullptr ) if ( code_pool.PhysicalStart == nullptr )
fatal( "gen::make_code: Failed to allocate a new code pool - CodePool allcoator returned nullptr." ); GEN_FATAL( "gen::make_code: Failed to allocate a new code pool - CodePool allcoator returned nullptr." );
if ( ! CodePools.append( code_pool ) ) if ( ! CodePools.append( code_pool ) )
fatal( "gen::make_code: Failed to allocate a new code pool - CodePools failed to append new pool." ); GEN_FATAL( "gen::make_code: Failed to allocate a new code pool - CodePools failed to append new pool." );
allocator = & CodePools.back(); allocator = & CodePools.back();
} }

View File

@ -1122,7 +1122,7 @@ if ( def.Ptr == nullptr ) \
# define check( Type_ ) ( left && currtok.Type == Type_ ) # define check( Type_ ) ( left && currtok.Type == Type_ )
# define push_scope() \ # define push_scope() \
StackNode scope { nullptr, currtok, NullToken, txt_StrC( __func__ ) }; \ StackNode scope { nullptr, currtok, NullToken, txt( __func__ ) }; \
Context.push( & scope ) Context.push( & scope )
#pragma endregion Helper Macros #pragma endregion Helper Macros
@ -1329,7 +1329,7 @@ Code parse_static_assert()
char const* result = str_fmt_buf( "%.*s\n", content.Length, content.Text ); char const* result = str_fmt_buf( "%.*s\n", content.Length, content.Text );
assert->Content = get_cached_string( to_StrC( result ) ); assert->Content = get_cached_string( to_str( result ) );
assert->Name = assert->Content; assert->Name = assert->Content;
Context.pop(); Context.pop();
@ -2264,7 +2264,7 @@ Code parse_simple_preprocess( Parser::TokType which )
char const* content = str_fmt_buf( "%.*s\n", tok.Length, tok.Text ); char const* content = str_fmt_buf( "%.*s\n", tok.Length, tok.Text );
Code result = untyped_str( to_StrC( content ) ); Code result = untyped_str( to_str( content ) );
Context.Scope->Name = tok; Context.Scope->Name = tok;
if ( str_compare( Context.Scope->Prev->ProcName.Ptr, "parse_typedef", Context.Scope->Prev->ProcName.Len ) != 0 ) if ( str_compare( Context.Scope->Prev->ProcName.Ptr, "parse_typedef", Context.Scope->Prev->ProcName.Len ) != 0 )

View File

@ -89,4 +89,5 @@ namespace ECode
# undef Define_Types # undef Define_Types
} }
using CodeT = ECode::Type; using CodeT = ECode::Type;
using ECode::to_str;

View File

@ -64,7 +64,7 @@ namespace EOperator
# define Entry( Type_, Token_ ) { sizeof(stringize(Token_)), stringize(Token_) }, # define Entry( Type_, Token_ ) { sizeof(stringize(Token_)), stringize(Token_) },
Define_Operators Define_Operators
# undef Entry # undef Entry
txt_StrC(",") txt(",")
}; };
return lookup[ op ]; return lookup[ op ];
@ -73,4 +73,5 @@ namespace EOperator
# undef Define_Operators # undef Define_Operators
} }
using OperatorT = EOperator::Type; using OperatorT = EOperator::Type;
using EOperator::to_str;

View File

@ -107,4 +107,5 @@ namespace ESpecifier
# undef Define_Specifiers # undef Define_Specifiers
} }
using SpecifierT = ESpecifier::Type; using SpecifierT = ESpecifier::Type;
using ESpecifier::to_str;

View File

@ -165,6 +165,7 @@ namespace Parser
}; };
using TokType = ETokType::Type; using TokType = ETokType::Type;
using ETokType::to_str;
} // Parser } // Parser

View File

@ -1,11 +1,11 @@
using LogFailType = sw(*)(char const*, ...); using LogFailType = sw(*)(char const*, ...);
// By default this library will either crash or exit if an error is detected while generating codes. // By default this library will either crash or exit if an error is detected while generating codes.
// Even if set to not use fatal, fatal will still be used for memory failures as the library is unusable when they occur. // Even if set to not use GEN_FATAL, GEN_FATAL will still be used for memory failures as the library is unusable when they occur.
#ifdef GEN_DONT_USE_FATAL #ifdef GEN_DONT_USE_FATAL
#define log_failure log_fmt #define log_failure log_fmt
#else #else
#define log_failure fatal #define log_failure GEN_FATAL
#endif #endif
enum class AccessSpec : u32 enum class AccessSpec : u32
@ -46,7 +46,6 @@ enum class EnumT : u8
constexpr EnumT EnumClass = EnumT::Class; constexpr EnumT EnumClass = EnumT::Class;
constexpr EnumT EnumRegular = EnumT::Regular; constexpr EnumT EnumRegular = EnumT::Regular;
enum class ModuleFlag : u32 enum class ModuleFlag : u32
{ {
None = 0, None = 0,
@ -76,50 +75,3 @@ constexpr EPreprocessCond PreprocessCond_IfDef = EPreprocessCond::IfDef;
constexpr EPreprocessCond PreprocessCond_IfNotDef = EPreprocessCond::IfNotDef; constexpr EPreprocessCond PreprocessCond_IfNotDef = EPreprocessCond::IfNotDef;
constexpr EPreprocessCond PreprocessCond_ElIf = EPreprocessCond::ElIf; constexpr EPreprocessCond PreprocessCond_ElIf = EPreprocessCond::ElIf;
/*
Predefined attributes
Used for the parser constructors to identify non-standard attributes
Override these to change the attribute to your own unique identifier convention.
The tokenizer identifies attribute defines with the GEN_DEFINE_ATTRIBUTE_TOKENS macros.
See the example below and the Define_TokType macro used in gen.cpp to know the format.
While the library can parse raw attributes, most projects use defines to wrap them for compiler
platform indendence. The token define allows support for them without having to modify the library.
*/
#if defined(GEN_SYSTEM_WINDOWS) || defined( __CYGWIN__ )
#ifndef GEN_Attribute_Keyword
# define GEN_API_Export_Code __declspec(dllexport)
# define GEN_API_Import_Code __declspec(dllimport)
# define GEN_Attribute_Keyword __declspec
#endif
constexpr char const* Attribute_Keyword = stringize( GEN_Attribute_Keyword);
#elif GEN_HAS_ATTRIBUTE( visibility ) || GEN_GCC_VERSION_CHECK( 3, 3, 0 )
#ifndef GEN_Attribute_Keyword
# define GEN_API_Export_Code __attribute__ ((visibility ("default")))
# define GEN_API_Import_Code __attribute__ ((visibility ("default")))
# define GEN_Attribute_Keyword __attribute__
#endif
constexpr char const* Attribute_Keyword = stringize( GEN_Attribute_Keyword );
#else
#ifndef GEN_Attribute_Keyword
# define GEN_API_Export_Code
# define GEN_API_Import_Code
# define GEN_Attribute_Keyword
#endif
constexpr char const* Attribute_Keyword = "";
#endif
// Implements basic string interning. Data structure is based off the ZPL Hashtable.
using StringTable = HashTable<String const>;
// Represents strings cached with the string table.
// Should never be modified, if changed string is desired, cache_string( str ) another.
using StringCached = String const;

View File

@ -34,7 +34,7 @@ s32 assert_crash( char const* condition );
void process_exit( u32 code ); void process_exit( u32 code );
#if Build_Debug #if Build_Debug
#define fatal( fmt, ... ) \ #define GEN_FATAL( fmt, ... ) \
do \ do \
{ \ { \
local_persist thread_local \ local_persist thread_local \
@ -46,7 +46,7 @@ void process_exit( u32 code );
while (0) while (0)
#else #else
# define fatal( fmt, ... ) \ # define GEN_FATAL( fmt, ... ) \
do \ do \
{ \ { \
str_fmt_out_err( fmt, __VA_ARGS__ ); \ str_fmt_out_err( fmt, __VA_ARGS__ ); \

View File

@ -100,25 +100,6 @@
#define GEN_DEF_INLINE static #define GEN_DEF_INLINE static
#define GEN_IMPL_INLINE static inline #define GEN_IMPL_INLINE static inline
#ifdef GEN_COMPILER_MSVC
# define forceinline __forceinline
# define neverinline __declspec( noinline )
#elif defined(GEN_COMPILER_GCC)
# define forceinline inline __attribute__((__always_inline__))
# define neverinline __attribute__( ( __noinline__ ) )
#elif defined(GEN_COMPILER_CLANG)
#if __has_attribute(__always_inline__)
# define forceinline inline __attribute__((__always_inline__))
# define neverinline __attribute__( ( __noinline__ ) )
#else
# define forceinline
# define neverinline
#endif
#else
# define forceinline
# define neverinline
#endif
#pragma endregion Platform Detection #pragma endregion Platform Detection
#pragma region Mandatory Includes #pragma region Mandatory Includes

View File

@ -8,6 +8,25 @@
#define internal static // Internal linkage #define internal static // Internal linkage
#define local_persist static // Local Persisting variables #define local_persist static // Local Persisting variables
#ifdef GEN_COMPILER_MSVC
# define forceinline __forceinline
# define neverinline __declspec( noinline )
#elif defined(GEN_COMPILER_GCC)
# define forceinline inline __attribute__((__always_inline__))
# define neverinline __attribute__( ( __noinline__ ) )
#elif defined(GEN_COMPILER_CLANG)
#if __has_attribute(__always_inline__)
# define forceinline inline __attribute__((__always_inline__))
# define neverinline __attribute__( ( __noinline__ ) )
#else
# define forceinline
# define neverinline
#endif
#else
# define forceinline
# define neverinline
#endif
// Bits // Bits
#define bit( Value ) ( 1 << Value ) #define bit( Value ) ( 1 << Value )
@ -125,6 +144,12 @@
#define min( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) ) #define min( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
#define size_of( x ) ( sw )( sizeof( x ) ) #define size_of( x ) ( sw )( sizeof( x ) )
#if defined( _MSC_VER ) || defined( GEN_COMPILER_TINYC )
# define offset_of( Type, element ) ( ( GEN_NS( gen_sw ) ) & ( ( ( Type* )0 )->element ) )
#else
# define offset_of( Type, element ) __builtin_offsetof( Type, element )
#endif
template< class Type > template< class Type >
void swap( Type& a, Type& b ) void swap( Type& a, Type& b )
{ {

View File

@ -221,7 +221,7 @@ void* Arena::allocator_proc( void* allocator_data, AllocType type, sw size, sw a
if ( arena->TotalUsed + total_size > (sw) arena->TotalSize ) if ( arena->TotalUsed + total_size > (sw) arena->TotalSize )
{ {
// zpl__printf_err("%s", "Arena out of memory\n"); // zpl__printf_err("%s", "Arena out of memory\n");
fatal("Arena out of memory! (Possibly could not fit for the largest size Arena!!)"); GEN_FATAL("Arena out of memory! (Possibly could not fit for the largest size Arena!!)");
return nullptr; return nullptr;
} }

View File

@ -1,4 +1,4 @@
#pragma region String #pragma region Strings
// Constant string with length. // Constant string with length.
struct StrC struct StrC
@ -12,18 +12,14 @@ struct StrC
} }
}; };
#define txt_StrC( text ) StrC { sizeof( text ) - 1, text } #define cast_to_strc( str ) * rcast( StrC*, str - sizeof(sw) )
#define txt( text ) StrC { sizeof( text ) - 1, text }
StrC to_StrC( char const* str ) StrC to_str( char const* str )
{ {
return { str_len( str ), str }; return { str_len( str ), str };
} }
sw StrC_len( char const* str )
{
return (sw) ( str - 1 );
}
// Dynamic String // Dynamic String
// This is directly based off the ZPL string api. // This is directly based off the ZPL string api.
// They used a header pattern // They used a header pattern
@ -33,8 +29,8 @@ struct String
struct Header struct Header
{ {
AllocatorInfo Allocator; AllocatorInfo Allocator;
sw Length;
sw Capacity; sw Capacity;
sw Length;
}; };
static static
@ -332,11 +328,7 @@ struct String
operator StrC() const operator StrC() const
{ {
return return { length(), Data };
{
length(),
Data
};
} }
// Used with cached strings // Used with cached strings
@ -363,19 +355,21 @@ struct String
return Data[ index ]; return Data[ index ];
} }
char* Data = nullptr; char* Data;
}; };
struct String_POD struct String_POD
{ {
char* Data; char* Data;
operator String()
{
return * rcast(String*, this);
}
}; };
static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" ); static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" );
#pragma endregion String // Implements basic string interning. Data structure is based off the ZPL Hashtable.
using StringTable = HashTable<String const>;
// Represents strings cached with the string table.
// Should never be modified, if changed string is desired, cache_string( str ) another.
using StringCached = String const;
#pragma endregion Strings

View File

@ -3,15 +3,16 @@
#define GEN_EXPOSE_BACKEND #define GEN_EXPOSE_BACKEND
#include "gen.cpp" #include "gen.cpp"
#include "helpers/push_ignores.inline.hpp"
#include "helpers/helper.hpp" #include "helpers/helper.hpp"
GEN_NS_BEGIN GEN_NS_BEGIN
#include "dependencies/parsing.cpp" #include "dependencies/parsing.cpp"
GEN_NS_END GEN_NS_END
#include "file_processors/builder.hpp" #include "auxillary/builder.hpp"
#include "file_processors/builder.cpp" #include "auxillary/builder.cpp"
#include "file_processors/scanner.hpp" #include "auxillary/scanner.hpp"
using namespace gen; using namespace gen;
@ -37,8 +38,8 @@ int gen_main()
Code printing = scan_file( "dependencies/printing.hpp" ); Code printing = scan_file( "dependencies/printing.hpp" );
Code containers = scan_file( "dependencies/containers.hpp" ); Code containers = scan_file( "dependencies/containers.hpp" );
Code hashing = scan_file( "dependencies/hashing.hpp" ); Code hashing = scan_file( "dependencies/hashing.hpp" );
Code string = scan_file( "dependencies/string.hpp" ); Code strings = scan_file( "dependencies/strings.hpp" );
Code file_handling = scan_file( "dependencies/file_handling.hpp" ); Code filesystem = scan_file( "dependencies/filesystem.hpp" );
Code timing = scan_file( "dependencies/timing.hpp" ); Code timing = scan_file( "dependencies/timing.hpp" );
Builder Builder
@ -56,8 +57,8 @@ int gen_main()
header.print( printing ); header.print( printing );
header.print( containers ); header.print( containers );
header.print( hashing ); header.print( hashing );
header.print( string ); header.print( strings );
header.print( file_handling ); header.print( filesystem );
header.print( timing ); header.print( timing );
header.print_fmt( "GEN_NS_END\n\n" ); header.print_fmt( "GEN_NS_END\n\n" );
@ -72,8 +73,8 @@ int gen_main()
Code printing = scan_file( "dependencies/printing.cpp" ); Code printing = scan_file( "dependencies/printing.cpp" );
Code memory = scan_file( "dependencies/memory.cpp" ); Code memory = scan_file( "dependencies/memory.cpp" );
Code hashing = scan_file( "dependencies/hashing.cpp" ); Code hashing = scan_file( "dependencies/hashing.cpp" );
Code string = scan_file( "dependencies/string.cpp" ); Code strings = scan_file( "dependencies/strings.cpp" );
Code file_handling = scan_file( "dependencies/file_handling.cpp" ); Code filesystem = scan_file( "dependencies/filesystem.cpp" );
Code timing = scan_file( "dependencies/timing.cpp" ); Code timing = scan_file( "dependencies/timing.cpp" );
Builder Builder
@ -88,8 +89,8 @@ int gen_main()
src.print( printing ); src.print( printing );
src.print( hashing ); src.print( hashing );
src.print( memory ); src.print( memory );
src.print( string ); src.print( strings );
src.print( file_handling ); src.print( filesystem );
src.print( timing ); src.print( timing );
src.print_fmt( "GEN_NS_END\n\n" ); src.print_fmt( "GEN_NS_END\n\n" );
@ -189,13 +190,13 @@ int gen_main()
// gen_builder.hpp // gen_builder.hpp
{ {
Code builder = scan_file( "file_processors/builder.hpp" ); Code builder = scan_file( "auxillary/builder.hpp" );
Builder Builder
header = Builder::open( "gen/gen.builder.hpp" ); header = Builder::open( "gen/gen.builder.hpp" );
header.print_fmt( generation_notice ); header.print_fmt( generation_notice );
header.print_fmt( "#pragma once\n\n" ); header.print_fmt( "#pragma once\n\n" );
header.print( def_include( txt_StrC("gen.hpp") )); header.print( def_include( txt("gen.hpp") ));
header.print_fmt( "\nGEN_NS_BEGIN\n\n" ); header.print_fmt( "\nGEN_NS_BEGIN\n\n" );
header.print( builder ); header.print( builder );
header.print_fmt( "\nGEN_NS_END\n\n" ); header.print_fmt( "\nGEN_NS_END\n\n" );
@ -204,12 +205,12 @@ int gen_main()
// gen_builder.cpp // gen_builder.cpp
{ {
Code builder = scan_file( "file_processors/builder.cpp" ); Code builder = scan_file( "auxillary/builder.cpp" );
Builder Builder
src = Builder::open( "gen/gen.builder.cpp" ); src = Builder::open( "gen/gen.builder.cpp" );
src.print_fmt( generation_notice ); src.print_fmt( generation_notice );
src.print( def_include( txt_StrC("gen.builder.hpp") ) ); src.print( def_include( txt("gen.builder.hpp") ) );
src.print_fmt( "\nGEN_NS_BEGIN\n\n" ); src.print_fmt( "\nGEN_NS_BEGIN\n\n" );
src.print( builder ); src.print( builder );
src.print_fmt( "\nGEN_NS_END\n\n" ); src.print_fmt( "\nGEN_NS_END\n\n" );
@ -219,13 +220,13 @@ int gen_main()
// gen_scanner.hpp // gen_scanner.hpp
{ {
Code parsing = scan_file( "dependencies/parsing.hpp" ); Code parsing = scan_file( "dependencies/parsing.hpp" );
Code scanner = scan_file( "file_processors/scanner.hpp" ); Code scanner = scan_file( "auxillary/scanner.hpp" );
Builder Builder
header = Builder::open( "gen/gen.scanner.hpp" ); header = Builder::open( "gen/gen.scanner.hpp" );
header.print_fmt( generation_notice ); header.print_fmt( generation_notice );
header.print_fmt( "#pragma once\n\n" ); header.print_fmt( "#pragma once\n\n" );
header.print( def_include( txt_StrC("gen.hpp") ) ); header.print( def_include( txt("gen.hpp") ) );
header.print_fmt( "\nGEN_NS_BEGIN\n\n" ); header.print_fmt( "\nGEN_NS_BEGIN\n\n" );
header.print( parsing ); header.print( parsing );
header.print( scanner ); header.print( scanner );
@ -236,15 +237,15 @@ int gen_main()
// gen_scanner.cpp // gen_scanner.cpp
{ {
Code parsing = scan_file( "dependencies/parsing.cpp" ); Code parsing = scan_file( "dependencies/parsing.cpp" );
// Code scanner = scan_file( "file_processors/scanner.cpp" ); Code scanner = scan_file( "auxillary/scanner.cpp" );
Builder Builder
src = Builder::open( "gen/gen.scanner.cpp" ); src = Builder::open( "gen/gen.scanner.cpp" );
src.print_fmt( generation_notice ); src.print_fmt( generation_notice );
src.print( def_include( txt_StrC("gen.scanner.hpp") ) ); src.print( def_include( txt("gen.scanner.hpp") ) );
src.print_fmt( "\nGEN_NS_BEGIN\n\n" ); src.print_fmt( "\nGEN_NS_BEGIN\n\n" );
src.print( parsing ); src.print( parsing );
// src.print( scanner ); src.print( scanner );
src.print_fmt( "\nGEN_NS_END\n\n" ); src.print_fmt( "\nGEN_NS_END\n\n" );
src.write(); src.write();
} }

View File

@ -10,8 +10,8 @@ GEN_NS_BEGIN
#include "dependencies/printing.cpp" #include "dependencies/printing.cpp"
#include "dependencies/memory.cpp" #include "dependencies/memory.cpp"
#include "dependencies/hashing.cpp" #include "dependencies/hashing.cpp"
#include "dependencies/string.cpp" #include "dependencies/strings.cpp"
#include "dependencies/file_handling.cpp" #include "dependencies/filesystem.cpp"
#include "dependencies/timing.cpp" #include "dependencies/timing.cpp"
GEN_NS_END GEN_NS_END

View File

@ -13,8 +13,8 @@ GEN_NS_BEGIN
#include "dependencies/printing.hpp" #include "dependencies/printing.hpp"
#include "dependencies/containers.hpp" #include "dependencies/containers.hpp"
#include "dependencies/hashing.hpp" #include "dependencies/hashing.hpp"
#include "dependencies/string.hpp" #include "dependencies/strings.hpp"
#include "dependencies/file_handling.hpp" #include "dependencies/filesystem.hpp"
#include "dependencies/timing.hpp" #include "dependencies/timing.hpp"
GEN_NS_END GEN_NS_END

View File

@ -531,7 +531,7 @@ CodeBody gen_ast_inlines()
CodeBody impl_cast_var = parse_global_body( token_fmt( "typename", StrC name(Var), cast_tmpl )); CodeBody impl_cast_var = parse_global_body( token_fmt( "typename", StrC name(Var), cast_tmpl ));
CodeBody result = def_global_body( args( CodeBody result = def_global_body( args(
def_pragma( txt_StrC("region generated code inline implementation")), def_pragma( txt("region generated code inline implementation")),
fmt_newline, fmt_newline,
impl_code, impl_code,
impl_code_body, impl_code_body,
@ -563,9 +563,9 @@ CodeBody gen_ast_inlines()
impl_code_using, impl_code_using,
impl_code_var, impl_code_var,
fmt_newline, fmt_newline,
def_pragma( txt_StrC("endregion generated code inline implementation")), def_pragma( txt("endregion generated code inline implementation")),
fmt_newline, fmt_newline,
def_pragma( txt_StrC("region generated AST/Code cast implementation")), def_pragma( txt("region generated AST/Code cast implementation")),
fmt_newline, fmt_newline,
impl_cast_body, impl_cast_body,
impl_cast_attribute, impl_cast_attribute,
@ -596,7 +596,7 @@ CodeBody gen_ast_inlines()
impl_cast_using, impl_cast_using,
impl_cast_var, impl_cast_var,
fmt_newline, fmt_newline,
def_pragma( txt_StrC("endregion generated AST/Code cast implementation")), def_pragma( txt("endregion generated AST/Code cast implementation")),
fmt_newline fmt_newline
)); ));

View File

@ -64,7 +64,7 @@
#undef stringize #undef stringize
#undef stringize #undef stringize
#undef stringize_va #undef stringize_va
#undef txt_StrC #undef txt
#undef GEN_TIME #undef GEN_TIME
#undef gen_main #undef gen_main

View File

@ -8,6 +8,20 @@ Generation, testing, and cleanup scripts for the test directory are found here a
Currently `refactor` only supports naive sort of *find and replace* feature set and will not be able to rename identifiers excluisvely to a specific context (such as only renaming member names of a specific struct, etc). Currently `refactor` only supports naive sort of *find and replace* feature set and will not be able to rename identifiers excluisvely to a specific context (such as only renaming member names of a specific struct, etc).
**Note: The following macros are used with specifiers and token parsing within the library:**
* global
* internal
* local_persist
* forceinline
* neverinline
IF they are changed the following files would need adjustment:
* `./project/enums/ESpecifier.csv`
* `./project/enums/ETokType.csv`
* `./project/helpers/helper.hpp`
## Build & Run Scripts ## Build & Run Scripts
**`clean.ps1`** **`clean.ps1`**
@ -17,7 +31,7 @@ Remove any generated content from the repository.
Generate a version of gencpp where components are inlined directly to `gen.<hpp/cpp>` and `gen. <hpp/cpp>` Generate a version of gencpp where components are inlined directly to `gen.<hpp/cpp>` and `gen. <hpp/cpp>`
Any heavily preprocessed code is not inlined and are instead generated using the code in the `helpers` directory. Any heavily preprocessed code is not inlined and are instead generated using the code in the `helpers` directory.
**`singlheader.build.ps1`** **`singleheader.ps1`**
Generate a single-header version of the library where all code that would normally good in the usual four files (see bootstrap) are inlined into a single `gen.hpp` file. Generate a single-header version of the library where all code that would normally good in the usual four files (see bootstrap) are inlined into a single `gen.hpp` file.
As with the bootstrap, any heavily preprocessed code is not inlined and instead generated with helper code. As with the bootstrap, any heavily preprocessed code is not inlined and instead generated with helper code.

View File

@ -10,6 +10,7 @@ $path_test_build = Join-Path $path_test build
$path_gen = Join-Path $path_test gen $path_gen = Join-Path $path_test gen
$path_gen_build = Join-Path $path_gen build $path_gen_build = Join-Path $path_gen build
$path_x64 = Join-Path $path_root x64 $path_x64 = Join-Path $path_root x64
$path_release = Join-Path $path_root release
if ( Test-Path $path_project_build) if ( Test-Path $path_project_build)
{ {
@ -46,22 +47,10 @@ if ( Test-Path $path_x64)
Remove-Item $path_x64 -Recurse Remove-Item $path_x64 -Recurse
} }
# [string[]] $include = 'gen.hpp', 'gen.cpp', 'gen_dep.hpp', 'gen_dep.cpp' if ( Test-Path $path_release )
# [string[]] $exclude = {
Remove-Item $path_release -Recurse
# $files = Get-ChildItem -Recurse -Path $path_project_gen -Include $include -Exclude $exclude }
# if ( $files )
# {
# Remove-Item $files
# }
# $files = Get-ChildItem -Recurse -Path $path_singleheader_gen -Include $include -Exclude $exclude
# if ( $files )
# {
# Remove-Item $files
# }
$include = '*.h', '*.hpp', '*.cpp' $include = '*.h', '*.hpp', '*.cpp'
$exclude = $exclude =

View File

@ -48,8 +48,8 @@
<DisplayString>{(Header*)((char*)Data - sizeof(Header))}</DisplayString> <DisplayString>{(Header*)((char*)Data - sizeof(Header))}</DisplayString>
<Expand> <Expand>
<Item Name="Allocator">((Header*)((char*)Data - sizeof(Header)))->Allocator</Item> <Item Name="Allocator">((Header*)((char*)Data - sizeof(Header)))->Allocator</Item>
<Item Name="Length">((Header*)((char*)Data - sizeof(Header)))->Length</Item>
<Item Name="Capacity">((Header*)((char*)Data - sizeof(Header)))->Capacity</Item> <Item Name="Capacity">((Header*)((char*)Data - sizeof(Header)))->Capacity</Item>
<Item Name="Length">((Header*)((char*)Data - sizeof(Header)))->Length</Item>
</Expand> </Expand>
</Synthetic> </Synthetic>
</Expand> </Expand>

View File

@ -21,8 +21,8 @@
// Gen Macro namespace // Gen Macro namespace
// namespace GEN_, new_namespace_ // namespace GEN_, new_namespace_
// ---------- ZPL Macros // ---------- Dependency Macros
// Platform
// word GEN_ARCH_64_BIT, new_name // word GEN_ARCH_64_BIT, new_name
// word GEN_ARCH_32_BIT, new_name // word GEN_ARCH_32_BIT, new_name
@ -43,20 +43,86 @@
// word GEN_COMPILER_MINGW, new_name // word GEN_COMPILER_MINGW, new_name
// word GEN_COMPILER_MSVC, new_name // word GEN_COMPILER_MSVC, new_name
// word forceinline, new_name // General
// word neverinline, new_name
// word zpl_cast, new_name // word zpl_cast, new_name
// word global, new_name // word global, new_name
// word internal, new_name // word internal, new_name
// word local_persist, new_name // word local_persist, new_name
// word forceinline, new_name
// word neverinline, new_name
// word bit, new_name
// word bitfield_is_equal, new_name
// word ccast, new_name
// word pcast, new_name
// word rcast, new_name
// word scast, new_name
// word num_args, new_name
// word num_args_impl, new_name
// word stringize, new_name
// word stringize_va, new_name
// word do_once, new_name
// word do_once_start, new_name
// word do_once_end, new_name
// word label_scope_start, new_name
// word label_scope_end, new_name
// word count_of, new_name
// word is_between, new_name
// word min, new_name
// word size_of, new_name
// word offset_of, new_name
// word swap, new_name
// Basic Types
// word GEN_U8_MIN, new_name
// word GEN_U8_MAX, new_name
// word GEN_I8_MIN, new_name
// word GEN_I8_MAX, new_name
// word GEN_U16_MIN, new_name
// word GEN_U16_MAX, new_name
// word GEN_I16_MIN, new_name
// word GEN_I16_MAX, new_name
// word GEN_U32_MIN, new_name
// word GEN_U32_MAX, new_name
// word GEN_I32_MIN, new_name
// word GEN_I32_MAX, new_name
// word GEN_U64_MIN, new_name
// word GEN_U64_MAX, new_name
// word GEN_I64_MIN, new_name
// word GEN_I64_MAX, new_name
// word GEN_USIZE_MIN, new_name
// word GEN_USIZE_MAX, new_name
// word GEN_ISIZE_MIN, new_name
// word GEN_ISIZE_MAX, new_name
// word GEN_F32_MIN, new_name
// word GEN_F32_MAX, new_name
// word GEN_F64_MIN, new_name
// word GEN_F64_MAX, new_name
// Debug
// word GEN_DEBUG_TRAP, new_name // word GEN_DEBUG_TRAP, new_name
// word GEN_ASSERT, new_name // word GEN_ASSERT, new_name
// word GEN_ASSERT_MSG, new_name // word GEN_ASSERT_MSG, new_name
// word GEN_ASSERT_NOT_NULL, new_name // word GEN_ASSERT_NOT_NULL, new_name
// word GEN_PANIC, new_name // word GEN_PANIC, new_name
// word GEN_FATAL, new_name
// Memory
// word kilobytes, new_name
// word megabytes, new_name
// word gigabytes, new_name
// word terabytes, new_name
// word zero_item, new_name // word zero_item, new_name
// word zero_array, new_name // word zero_array, new_name
@ -67,13 +133,11 @@
// word malloc, new_name // word malloc, new_name
// word mfree, new_name // word mfree, new_name
// word count_of, new_name // Strings
// word is_between, new_name // word txt, new_name
// word min, new_name // word cast_to_strc, new_name
// word size_of, new_name
// word swap, new_name
// ---------- ZPL Types // ---------- Dependency Types
// word b8, new_name // word b8, new_name
// word b16, new_name // word b16, new_name
@ -114,11 +178,11 @@
// word FileStandardType, new_name // word FileStandardType, new_name
// word SeekWhenceType, new_name // word SeekWhenceType, new_name
// ---------- ZPL Data // ---------- Dependency Data
// word default_file_operations, new_name // word default_file_operations, new_name
// ---------- ZPL Procedures // ---------- Dependency Procedures
// word align_forward, new_name // word align_forward, new_name
// word align_fordward_i64, new_name // word align_fordward_i64, new_name
@ -158,6 +222,7 @@
// word hex_digit_to_int, new_name // word hex_digit_to_int, new_name
// word i64_to_str, new_name // word i64_to_str, new_name
// word is_power_of_two, new_name // word is_power_of_two, new_name
// word log_fmt, new_name
// word mem_copy, new_name // word mem_copy, new_name
// word mem_move, new_name // word mem_move, new_name
// word mem_set, new_name // word mem_set, new_name
@ -189,22 +254,10 @@
// ---------- gencpp Macros // ---------- gencpp Macros
// word bit, new_name // word log_failure, new_name
// word bitfield_is_equal, new_name
// word ccast, new_name // word NoCode, new_name
// word pcast, new_name // word CodeInvalid, new_name
// word rcast, new_name
// word scast, new_name
// word do_once, new_name
// word do_once_start, new_name
// word do_once_end, new_name
// word num_args, new_name
// word num_args_impl, new_name
// word stringize, new_name
// word stringize_va, new_name
// word txt_StrC, new_name
// ------------ gencpp common // ------------ gencpp common
@ -215,16 +268,13 @@
// word StrC, new_name // word StrC, new_name
// word String, new_name // word String, new_name
// word log_fmt, new_name
// word fatal, new_name
// word to_str, new_name // word to_str, new_name
// word to_StrC, new_name // word to_str, new_name
// word to_type, new_name // word to_type, new_name
// ------------ gencpp Types & Constants // ------------ gencpp Types & Constants
// word LogFailType, new_name // word LogFailType, new_name
// word log_failure, new_name
// word AccessSpec, new_name // word AccessSpec, new_name
// word ECode, new_name // word ECode, new_name
@ -251,7 +301,6 @@
// word Code, new_name // word Code, new_name
// word Code_POD, new_name // word Code_POD, new_name
// word Keyword, new_name // word Keyword, new_name
// word NoCode, new_name
// ------------ gencpp API // ------------ gencpp API
@ -277,6 +326,9 @@
// word def_attributes, new_name // word def_attributes, new_name
// word def_comment, new_name // word def_comment, new_name
// word def_class, new_name // word def_class, new_name
// word def_constructor, new_name
// word def_destructor, new_name
// word def_define, new_name
// word def_enum, new_name // word def_enum, new_name
// word def_execution, new_name // word def_execution, new_name
// word def_extern_link, new_name // word def_extern_link, new_name
@ -286,7 +338,10 @@
// word def_module, new_name // word def_module, new_name
// word def_namespace, new_name // word def_namespace, new_name
// word def_operator, new_name // word def_operator, new_name
// word def_operator_cast, new_name
// word def_param, new_name // word def_param, new_name
// word def_pargma, new_name
// word def_preprocess_cond, new_name
// word def_specifier, new_name // word def_specifier, new_name
// word def_struct, new_name // word def_struct, new_name
// word def_template, new_name // word def_template, new_name
@ -343,21 +398,23 @@
// word untyped_fmt, new_name // word untyped_fmt, new_name
// word untyped_token_fmt, new_name // word untyped_token_fmt, new_name
// ------------ File Handling // ------------ File Ops
// word Builder, new_name // word Builder, new_name
// word Editor, new_name // word Editor, new_name
// word Scanner, new_name // word Scanner, new_name
// ------------ gencpp macros // ------------ gencpp user macros
// word gen_main, new_name // word gen_main, new_name
// word GEN_TIME, new_name // word GEN_TIME, new_name
// word __, new_name // word __, new_name
// word code, new_name
// word name, new_name // word name, new_name
// word code, new_name
// word args, new_name // word args, new_name
// word code_str, new_name
// word code_fmt, new_name
// word token_fmt, new_name // word token_fmt, new_name
// ------------ Type AST namespace // ------------ Type AST namespace

View File

@ -0,0 +1,41 @@
cls
Invoke-Expression "& $(Join-Path $PSScriptRoot 'bootstrap.ci.ps1')"
Invoke-Expression "& $(Join-Path $PSScriptRoot 'singleheader.ci.ps1')"
$path_root = git rev-parse --show-toplevel
$path_docs = Join-Path $path_root docs
$path_project = Join-Path $path_root project
$path_project_gen = Join-Path $path_project gen
$path_singleheader = Join-Path $path_root singleheader
$path_singleheader_gen = Join-Path $path_singleheader gen
$path_release = Join-Path $path_root release
$path_release_content = Join-Path $path_release content
if ( -not(Test-Path $path_release) ) {
New-Item -ItemType Directory -Path $path_release
}
if ( -not(Test-Path $path_release_content) ) {
New-Item -ItemType Directory -Path $path_release_content
}
$license = Join-Path $path_root LICENSE
$readme_root = Join-Path $path_root Readme.md
$readme_docs = Join-Path $path_docs Readme.md
$readme_parsing = Join-Path $path_docs Parsing.md
Copy-Item $license -Destination $(Join-Path $path_release_content "LICENSE")
Copy-Item $readme_root -Destination $(Join-Path $path_release_content "Readme.md")
Copy-Item $readme_docs -Destination $(Join-Path $path_release_content "Readme_Docs.md")
Copy-Item $readme_parsing -Destination $(Join-Path $path_release_content "Parsing.md")
# Singleheader
Copy-Item -Path $path_singleheader_gen\gen.hpp -Destination $path_release_content\gen.hpp
Compress-Archive -Path $path_release_content\* -DestinationPath $path_release\gencpp_singleheader.zip -Force
Remove-Item -Path $path_release_content\gen.hpp
# Segmented
Copy-Item -Path $path_project_gen\* -Destination $path_release_content
Compress-Archive -Path $path_release_content\* -DestinationPath $path_release\gencpp_segmented.zip -Force
Remove-Item -Path $path_release_content -Recurse

View File

@ -3,15 +3,16 @@
#define GEN_EXPOSE_BACKEND #define GEN_EXPOSE_BACKEND
#include "gen.cpp" #include "gen.cpp"
#include "helpers/push_ignores.inline.hpp"
#include "helpers/helper.hpp" #include "helpers/helper.hpp"
GEN_NS_BEGIN GEN_NS_BEGIN
#include "dependencies/parsing.cpp" #include "dependencies/parsing.cpp"
GEN_NS_END GEN_NS_END
#include "file_processors/builder.hpp" #include "auxillary/builder.hpp"
#include "file_processors/builder.cpp" #include "auxillary/builder.cpp"
#include "file_processors/scanner.hpp" #include "auxillary/scanner.hpp"
using namespace gen; using namespace gen;
@ -19,25 +20,25 @@ constexpr char const* generation_notice =
"// This file was generated automatially by gen.bootstrap.cpp " "// This file was generated automatially by gen.bootstrap.cpp "
"(See: https://github.com/Ed94/gencpp)\n\n"; "(See: https://github.com/Ed94/gencpp)\n\n";
constexpr StrC implementation_guard_start = txt_StrC(R"( constexpr StrC implementation_guard_start = txt(R"(
#pragma region GENCPP IMPLEMENTATION GUARD #pragma region GENCPP IMPLEMENTATION GUARD
#if defined(GEN_IMPLEMENTATION) && ! defined(GEN_IMPLEMENTED) #if defined(GEN_IMPLEMENTATION) && ! defined(GEN_IMPLEMENTED)
# define GEN_IMPLEMENTED # define GEN_IMPLEMENTED
)"); )");
constexpr StrC implementation_guard_end = txt_StrC(R"( constexpr StrC implementation_guard_end = txt(R"(
#endif #endif
#pragma endregion GENCPP IMPLEMENTATION GUARD #pragma endregion GENCPP IMPLEMENTATION GUARD
)"); )");
constexpr StrC roll_own_dependencies_guard_start = txt_StrC(R"( constexpr StrC roll_own_dependencies_guard_start = txt(R"(
//! If its desired to roll your own dependencies, define GEN_ROLL_OWN_DEPENDENCIES before including this file. //! If its desired to roll your own dependencies, define GEN_ROLL_OWN_DEPENDENCIES before including this file.
// Dependencies are derived from the c-zpl library: https://github.com/zpl-c/zpl // Dependencies are derived from the c-zpl library: https://github.com/zpl-c/zpl
#ifndef GEN_ROLL_OWN_DEPENDENCIES #ifndef GEN_ROLL_OWN_DEPENDENCIES
)"); )");
constexpr StrC roll_own_dependencies_guard_end = txt_StrC(R"( constexpr StrC roll_own_dependencies_guard_end = txt(R"(
// GEN_ROLL_OWN_DEPENDENCIES // GEN_ROLL_OWN_DEPENDENCIES
#endif #endif
)"); )");
@ -77,8 +78,8 @@ int gen_main()
Code printing = scan_file( project_dir "dependencies/printing.hpp" ); Code printing = scan_file( project_dir "dependencies/printing.hpp" );
Code containers = scan_file( project_dir "dependencies/containers.hpp" ); Code containers = scan_file( project_dir "dependencies/containers.hpp" );
Code hashing = scan_file( project_dir "dependencies/hashing.hpp" ); Code hashing = scan_file( project_dir "dependencies/hashing.hpp" );
Code string = scan_file( project_dir "dependencies/string.hpp" ); Code strings = scan_file( project_dir "dependencies/strings.hpp" );
Code file_handling = scan_file( project_dir "dependencies/file_handling.hpp" ); Code filesystem = scan_file( project_dir "dependencies/filesystem.hpp" );
Code timing = scan_file( project_dir "dependencies/timing.hpp" ); Code timing = scan_file( project_dir "dependencies/timing.hpp" );
header.print_fmt( roll_own_dependencies_guard_start ); header.print_fmt( roll_own_dependencies_guard_start );
@ -93,8 +94,8 @@ int gen_main()
header.print( printing ); header.print( printing );
header.print( containers ); header.print( containers );
header.print( hashing ); header.print( hashing );
header.print( string ); header.print( strings );
header.print( file_handling ); header.print( filesystem );
header.print( timing ); header.print( timing );
if ( generate_scanner ) if ( generate_scanner )
@ -106,6 +107,7 @@ int gen_main()
header.print_fmt( "GEN_NS_END\n" ); header.print_fmt( "GEN_NS_END\n" );
header.print_fmt( roll_own_dependencies_guard_end ); header.print_fmt( roll_own_dependencies_guard_end );
header.print( fmt_newline );
} }
Code types = scan_file( project_dir "components/types.hpp" ); Code types = scan_file( project_dir "components/types.hpp" );
@ -146,14 +148,14 @@ int gen_main()
if ( generate_builder ) if ( generate_builder )
{ {
header.print_fmt( "#pragma region Builder\n\n" ); header.print_fmt( "#pragma region Builder\n\n" );
header.print( scan_file( project_dir "file_processors/builder.hpp" ) ); header.print( scan_file( project_dir "auxillary/builder.hpp" ) );
header.print_fmt( "#pragma endregion Builder\n\n" ); header.print_fmt( "#pragma endregion Builder\n\n" );
} }
if ( generate_scanner ) if ( generate_scanner )
{ {
header.print_fmt( "#pragma region Scanner\n\n" ); header.print_fmt( "#pragma region Scanner\n\n" );
header.print( scan_file( project_dir "file_processors/scanner.hpp" ) ); header.print( scan_file( project_dir "auxillary/scanner.hpp" ) );
header.print_fmt( "#pragma endregion Scanner\n\n" ); header.print_fmt( "#pragma endregion Scanner\n\n" );
} }
@ -172,8 +174,8 @@ int gen_main()
Code printing = scan_file( project_dir "dependencies/printing.cpp" ); Code printing = scan_file( project_dir "dependencies/printing.cpp" );
Code memory = scan_file( project_dir "dependencies/memory.cpp" ); Code memory = scan_file( project_dir "dependencies/memory.cpp" );
Code hashing = scan_file( project_dir "dependencies/hashing.cpp" ); Code hashing = scan_file( project_dir "dependencies/hashing.cpp" );
Code string = scan_file( project_dir "dependencies/string.cpp" ); Code strings = scan_file( project_dir "dependencies/strings.cpp" );
Code file_handling = scan_file( project_dir "dependencies/file_handling.cpp" ); Code filesystem = scan_file( project_dir "dependencies/filesystem.cpp" );
Code timing = scan_file( project_dir "dependencies/timing.cpp" ); Code timing = scan_file( project_dir "dependencies/timing.cpp" );
header.print_fmt( roll_own_dependencies_guard_start ); header.print_fmt( roll_own_dependencies_guard_start );
@ -185,8 +187,8 @@ int gen_main()
header.print( printing ); header.print( printing );
header.print( memory ); header.print( memory );
header.print( hashing ); header.print( hashing );
header.print( string ); header.print( strings );
header.print( file_handling ); header.print( filesystem );
header.print( timing ); header.print( timing );
if ( generate_scanner ) if ( generate_scanner )
@ -232,7 +234,7 @@ int gen_main()
if ( generate_builder ) if ( generate_builder )
{ {
header.print_fmt( "#pragma region Builder\n\n" ); header.print_fmt( "#pragma region Builder\n\n" );
header.print( scan_file( project_dir "file_processors/builder.cpp" ) ); header.print( scan_file( project_dir "auxillary/builder.cpp" ) );
header.print_fmt( "#pragma endregion Builder\n\n" ); header.print_fmt( "#pragma endregion Builder\n\n" );
} }
@ -240,7 +242,7 @@ int gen_main()
if ( generate_scanner ) if ( generate_scanner )
{ {
header.print_fmt( "#pragma region Scanner\n\n" ); header.print_fmt( "#pragma region Scanner\n\n" );
header.print( scan_file( project_dir "file_processors/scanner.cpp" ) ); header.print( scan_file( project_dir "auxillary/scanner.cpp" ) );
header.print_fmt( "#pragma endregion Scanner\n\n" ); header.print_fmt( "#pragma endregion Scanner\n\n" );
} }
#endif #endif

View File

@ -33,7 +33,7 @@ Code gen_SOA( CodeStruct struct_def, s32 num_entries = 0 )
if ( struct_mem->Type == ECode::Variable ) if ( struct_mem->Type == ECode::Variable )
{ {
CodeType var_type = struct_mem.cast<CodeVar>()->ValueType; CodeType var_type = struct_mem.cast<CodeVar>()->ValueType;
StrC num_entries_str = to_StrC( str_fmt_buf( "%d", num_entries ) ); StrC num_entries_str = to_str( str_fmt_buf( "%d", num_entries ) );
CodeVar entry_arr = { nullptr }; CodeVar entry_arr = { nullptr };
if ( ! num_entries) if ( ! num_entries)
@ -124,7 +124,7 @@ void check_SOA()
soa_test.print( parse_using( code( soa_test.print( parse_using( code(
using u16 = unsigned short; using u16 = unsigned short;
))); )));
soa_test.print( def_include( txt_StrC("gen.hpp"))); soa_test.print( def_include( txt("gen.hpp")));
soa_test.print( def_using_namespace( name(gen) ) ); soa_test.print( def_using_namespace( name(gen) ) );
soa_test.print( gen_SOA( soa_test.print( gen_SOA(

View File

@ -255,7 +255,7 @@ u32 gen_array_file()
gen_array_file; gen_array_file;
gen_array_file.open( "array.Parsed.gen.hpp" ); gen_array_file.open( "array.Parsed.gen.hpp" );
Code include_gen = def_include( txt_StrC("gen.hpp") ); Code include_gen = def_include( txt("gen.hpp") );
gen_array_file.print( include_gen ); gen_array_file.print( include_gen );
gen_array_file.print( def_using_namespace( name(gen))); gen_array_file.print( def_using_namespace( name(gen)));

View File

@ -169,7 +169,7 @@ u32 gen_buffer_file()
gen_buffer_file; gen_buffer_file;
gen_buffer_file.open( "buffer.Parsed.gen.hpp" ); gen_buffer_file.open( "buffer.Parsed.gen.hpp" );
gen_buffer_file.print( def_include( txt_StrC("gen.hpp")) ); gen_buffer_file.print( def_include( txt("gen.hpp")) );
gen_buffer_file.print( def_using_namespace( name(gen))); gen_buffer_file.print( def_using_namespace( name(gen)));
gen_buffer_file.print( gen__buffer_base() ); gen_buffer_file.print( gen__buffer_base() );

View File

@ -320,9 +320,9 @@ u32 gen_hashtable_file()
gen_hashtable_file; gen_hashtable_file;
gen_hashtable_file.open( "hashtable.Parsed.gen.hpp" ); gen_hashtable_file.open( "hashtable.Parsed.gen.hpp" );
gen_hashtable_file.print( def_include( txt_StrC("gen.hpp")) ); gen_hashtable_file.print( def_include( txt("gen.hpp")) );
gen_hashtable_file.print( def_include( txt_StrC("Array.Parsed.hpp")) ); gen_hashtable_file.print( def_include( txt("Array.Parsed.hpp")) );
gen_hashtable_file.print( def_include( txt_StrC("array.Parsed.gen.hpp")) ); gen_hashtable_file.print( def_include( txt("array.Parsed.gen.hpp")) );
gen_hashtable_file.print( def_using_namespace( name(gen))); gen_hashtable_file.print( def_using_namespace( name(gen)));

View File

@ -22,7 +22,7 @@ Code gen__ring( StrC type )
name = get_cached_string({ name_len, name_str }); name = get_cached_string({ name_len, name_str });
}; };
StrC buffer_name = to_StrC( str_fmt_buf( "Buffer_%s", type.Ptr )); StrC buffer_name = to_str( str_fmt_buf( "Buffer_%s", type.Ptr ));
Code ring = parse_struct( token_fmt( "RingName", (StrC)name, "type", type, "BufferName", buffer_name, Code ring = parse_struct( token_fmt( "RingName", (StrC)name, "type", type, "BufferName", buffer_name,
stringize( stringize(
@ -138,8 +138,8 @@ u32 gen_ring_file()
gen_ring_file; gen_ring_file;
gen_ring_file.open( "ring.Parsed.gen.hpp" ); gen_ring_file.open( "ring.Parsed.gen.hpp" );
gen_ring_file.print( def_include( txt_StrC("gen.hpp")) ); gen_ring_file.print( def_include( txt("gen.hpp")) );
gen_ring_file.print( def_include( txt_StrC("buffer.Parsed.gen.hpp")) ); gen_ring_file.print( def_include( txt("buffer.Parsed.gen.hpp")) );
// gen_ring_file.print( gen__ring_base() ); // gen_ring_file.print( gen__ring_base() );
gen_ring_file.print( def_using_namespace( name(gen))); gen_ring_file.print( def_using_namespace( name(gen)));

View File

@ -14,7 +14,7 @@ u32 gen_sanity()
gen_sanity_file; gen_sanity_file;
gen_sanity_file.open("./sanity.Parsed.gen.hpp"); gen_sanity_file.open("./sanity.Parsed.gen.hpp");
gen_sanity_file.print( def_comment( txt_StrC( gen_sanity_file.print( def_comment( txt(
"The following will show a series of base cases for the gen parsed api.\n" "The following will show a series of base cases for the gen parsed api.\n"
))); )));
@ -40,7 +40,7 @@ u32 gen_sanity()
{}; {};
)); ));
empty_body->Body.append( def_comment( txt_StrC("Empty class body") ) ); empty_body->Body.append( def_comment( txt("Empty class body") ) );
gen_sanity_file.print(fwd); gen_sanity_file.print(fwd);
gen_sanity_file.print(empty_body); gen_sanity_file.print(empty_body);
@ -76,7 +76,7 @@ u32 gen_sanity()
// External Linkage // External Linkage
{ {
CodeComment empty_comment = def_comment( txt_StrC("Empty external linkage") ); CodeComment empty_comment = def_comment( txt("Empty external linkage") );
CodeExtern c_extern = parse_extern_link( code( CodeExtern c_extern = parse_extern_link( code(
extern "C" extern "C"
@ -122,7 +122,7 @@ u32 gen_sanity()
} }
)); ));
def->Body.append( def_comment( txt_StrC("Empty function body") ) ); def->Body.append( def_comment( txt("Empty function body") ) );
gen_sanity_file.print(fwd); gen_sanity_file.print(fwd);
gen_sanity_file.print(def); gen_sanity_file.print(def);
@ -138,7 +138,7 @@ u32 gen_sanity()
} }
)); ));
def->Body.append( def_comment( txt_StrC("Empty namespace body") ) ); def->Body.append( def_comment( txt("Empty namespace body") ) );
gen_sanity_file.print(def); gen_sanity_file.print(def);
} }
@ -205,7 +205,7 @@ u32 gen_sanity()
} }
)); ));
def->Body.append( def_comment( txt_StrC("Empty function body") ) ); def->Body.append( def_comment( txt("Empty function body") ) );
gen_sanity_file.print(fwd); gen_sanity_file.print(fwd);
gen_sanity_file.print(def); gen_sanity_file.print(def);
@ -241,7 +241,7 @@ u32 gen_sanity()
{}; {};
)); ));
empty_body->Body.append( def_comment( txt_StrC("Empty struct body") ) ); empty_body->Body.append( def_comment( txt("Empty struct body") ) );
gen_sanity_file.print(fwd); gen_sanity_file.print(fwd);
gen_sanity_file.print(empty_body); gen_sanity_file.print(empty_body);
@ -257,7 +257,7 @@ u32 gen_sanity()
}; };
)); ));
empty->Body.append( def_comment( txt_StrC("Empty union body") ) ); empty->Body.append( def_comment( txt("Empty union body") ) );
gen_sanity_file.print( parse_typedef( code( typedef unsigned short u16; )) ); gen_sanity_file.print( parse_typedef( code( typedef unsigned short u16; )) );
gen_sanity_file.print( parse_typedef( code( typedef unsigned long u32; )) ); gen_sanity_file.print( parse_typedef( code( typedef unsigned long u32; )) );
@ -334,7 +334,7 @@ u32 gen_sanity()
gen_sanity_file.print_fmt("\n"); gen_sanity_file.print_fmt("\n");
gen_sanity_file.print( def_comment( txt_StrC( gen_sanity_file.print( def_comment( txt(
"End of base case tests\n" "End of base case tests\n"
))); )));

View File

@ -43,7 +43,7 @@ int gen_main()
using u16 = unsigned short; using u16 = unsigned short;
))); )));
soa_test.print( def_include( txt_StrC("gen.hpp"))); soa_test.print( def_include( txt("gen.hpp")));
soa_test.print( def_using_namespace( name(gen) ) ); soa_test.print( def_using_namespace( name(gen) ) );

View File

@ -17,7 +17,7 @@ void check_sanity()
CodeType t_int_dupe = def_type( name(int) ); CodeType t_int_dupe = def_type( name(int) );
if ( t_int_dupe->Name != t_int->Name ) if ( t_int_dupe->Name != t_int->Name )
fatal("check_sanity: String caching failed!"); GEN_FATAL("check_sanity: String caching failed!");
// Purposefully uses an excessive amount of memory to make sure the the memory backend doesn't break. // Purposefully uses an excessive amount of memory to make sure the the memory backend doesn't break.

View File

@ -336,7 +336,7 @@ u32 gen_array_file()
gen_array_file; gen_array_file;
gen_array_file.open( "array.Upfront.gen.hpp" ); gen_array_file.open( "array.Upfront.gen.hpp" );
CodeInclude include_gen = def_include( txt_StrC("gen.hpp") ); CodeInclude include_gen = def_include( txt("gen.hpp") );
gen_array_file.print( include_gen ); gen_array_file.print( include_gen );
gen_array_file.print( def_using_namespace( name(gen))); gen_array_file.print( def_using_namespace( name(gen)));

View File

@ -239,7 +239,7 @@ u32 gen_buffer_file()
gen_buffer_file; gen_buffer_file;
gen_buffer_file.open( "buffer.Upfront.gen.hpp" ); gen_buffer_file.open( "buffer.Upfront.gen.hpp" );
gen_buffer_file.print( def_include( txt_StrC("gen.hpp")) ); gen_buffer_file.print( def_include( txt("gen.hpp")) );
gen_buffer_file.print( def_using_namespace( name(gen)) ); gen_buffer_file.print( def_using_namespace( name(gen)) );
gen_buffer_file.print( gen__buffer_base() ); gen_buffer_file.print( gen__buffer_base() );

View File

@ -447,9 +447,9 @@ u32 gen_hashtable_file()
gen_hashtable_file; gen_hashtable_file;
gen_hashtable_file.open( "hashtable.Upfront.gen.hpp" ); gen_hashtable_file.open( "hashtable.Upfront.gen.hpp" );
gen_hashtable_file.print( def_include( txt_StrC("gen.hpp")) ); gen_hashtable_file.print( def_include( txt("gen.hpp")) );
gen_hashtable_file.print( def_include( txt_StrC("Array.Upfront.hpp")) ); gen_hashtable_file.print( def_include( txt("Array.Upfront.hpp")) );
gen_hashtable_file.print( def_include( txt_StrC("array.Upfront.gen.hpp")) ); gen_hashtable_file.print( def_include( txt("array.Upfront.gen.hpp")) );
gen_hashtable_file.print( def_using_namespace( name(gen))); gen_hashtable_file.print( def_using_namespace( name(gen)));

View File

@ -192,8 +192,8 @@ u32 gen_ring_file()
gen_ring_file; gen_ring_file;
gen_ring_file.open( "ring.Upfront.gen.hpp" ); gen_ring_file.open( "ring.Upfront.gen.hpp" );
gen_ring_file.print( def_include( txt_StrC("gen.hpp")) ); gen_ring_file.print( def_include( txt("gen.hpp")) );
gen_ring_file.print( def_include( txt_StrC("buffer.Upfront.gen.hpp")) ); gen_ring_file.print( def_include( txt("buffer.Upfront.gen.hpp")) );
gen_ring_file.print( def_using_namespace( name(gen))); gen_ring_file.print( def_using_namespace( name(gen)));

View File

@ -11,13 +11,13 @@ u32 gen_sanity_upfront()
// Comment // Comment
{ {
CodeComment comment_test = def_comment( txt_StrC("Sanity check: def_comment test") ); CodeComment comment_test = def_comment( txt("Sanity check: def_comment test") );
gen_sanity_file.print(comment_test); gen_sanity_file.print(comment_test);
} }
gen_sanity_file.print_fmt("\n"); gen_sanity_file.print_fmt("\n");
gen_sanity_file.print( def_comment( txt_StrC( gen_sanity_file.print( def_comment( txt(
"The following will show a series of base cases for the gen api.\n" "The following will show a series of base cases for the gen api.\n"
))); )));
@ -26,7 +26,7 @@ u32 gen_sanity_upfront()
CodeClass fwd = def_class( name(TestEmptyClass) ); CodeClass fwd = def_class( name(TestEmptyClass) );
CodeClass empty_body; CodeClass empty_body;
{ {
CodeComment cmt = def_comment( txt_StrC("Empty class body") ); CodeComment cmt = def_comment( txt("Empty class body") );
CodeBody body = def_class_body( args( cmt ) ); CodeBody body = def_class_body( args( cmt ) );
empty_body = def_class( name(TestEmptyClass), body ); empty_body = def_class( name(TestEmptyClass), body );
@ -74,7 +74,7 @@ u32 gen_sanity_upfront()
// External Linkage // External Linkage
{ {
CodeBody body = def_extern_link_body( 1 CodeBody body = def_extern_link_body( 1
, def_comment( txt_StrC("Empty extern body") ) , def_comment( txt("Empty extern body") )
); );
CodeExtern c_extern = def_extern_link( name(C), body ); CodeExtern c_extern = def_extern_link( name(C), body );
@ -100,7 +100,7 @@ u32 gen_sanity_upfront()
CodeFn def; CodeFn def;
{ {
CodeBody body = def_function_body( 1 CodeBody body = def_function_body( 1
, def_comment( txt_StrC("Empty function body") ) , def_comment( txt("Empty function body") )
); );
def = def_function( name(test_function), __, __, body ); def = def_function( name(test_function), __, __, body );
@ -114,7 +114,7 @@ u32 gen_sanity_upfront()
// Include // Include
{ {
CodeInclude include = def_include( txt_StrC("../DummyInclude.hpp") ); CodeInclude include = def_include( txt("../DummyInclude.hpp") );
gen_sanity_file.print(include); gen_sanity_file.print(include);
} }
@ -142,7 +142,7 @@ u32 gen_sanity_upfront()
CodeNS namespace_def; CodeNS namespace_def;
{ {
CodeBody body = def_namespace_body( 1 CodeBody body = def_namespace_body( 1
, def_comment( txt_StrC("Empty namespace body") ) , def_comment( txt("Empty namespace body") )
); );
namespace_def = def_namespace( name(TestNamespace), body ); namespace_def = def_namespace( name(TestNamespace), body );
@ -213,7 +213,7 @@ u32 gen_sanity_upfront()
CodeFn def, def2; CodeFn def, def2;
{ {
CodeBody body = def_function_body( 1 CodeBody body = def_function_body( 1
, def_comment( txt_StrC("Empty function body") ) , def_comment( txt("Empty function body") )
); );
CodeParam params = def_params( args( CodeParam params = def_params( args(
@ -259,7 +259,7 @@ u32 gen_sanity_upfront()
CodeClass fwd = def_class( name(TestEmptyStruct) ); CodeClass fwd = def_class( name(TestEmptyStruct) );
CodeClass empty_body; CodeClass empty_body;
{ {
CodeComment cmt = def_comment( txt_StrC("Empty struct body") ); CodeComment cmt = def_comment( txt("Empty struct body") );
CodeBody body = def_class_body( args( cmt ) ); CodeBody body = def_class_body( args( cmt ) );
empty_body = def_class( name(TestEmptyStruct), body ); empty_body = def_class( name(TestEmptyStruct), body );
@ -274,7 +274,7 @@ u32 gen_sanity_upfront()
// Union // Union
{ {
CodeBody body = def_union_body( 1 CodeBody body = def_union_body( 1
, def_comment( txt_StrC("Empty union body") ) , def_comment( txt("Empty union body") )
); );
CodeUnion def = def_union( name(TestEmptyUnion), body ); CodeUnion def = def_union( name(TestEmptyUnion), body );
@ -312,7 +312,7 @@ u32 gen_sanity_upfront()
CodeTemplate tmpl = def_template( def_param( t_class, name(Type) ) CodeTemplate tmpl = def_template( def_param( t_class, name(Type) )
, def_function( name(test_template), def_param( t_Type, name(a) ), __ , def_function( name(test_template), def_param( t_Type, name(a) ), __
, def_function_body(1, def_comment( txt_StrC("Empty template function body"))) , def_function_body(1, def_comment( txt("Empty template function body")))
) )
); );
@ -321,7 +321,7 @@ u32 gen_sanity_upfront()
gen_sanity_file.print_fmt("\n"); gen_sanity_file.print_fmt("\n");
gen_sanity_file.print( def_comment( txt_StrC( gen_sanity_file.print( def_comment( txt(
"End of base case tests.\n" "End of base case tests.\n"
))); )));