mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 15:54:45 -08:00
Ed_
47c15e7af2
There shouldn't be much more changes design wise. Anything else is based on what needs to be done for it to work.
131 lines
2.0 KiB
C++
131 lines
2.0 KiB
C++
#define BLOAT_IMPL
|
|
#include "Bloat.hpp"
|
|
|
|
|
|
namespace Global
|
|
{
|
|
bool ShouldShowDebug = false;
|
|
}
|
|
|
|
namespace Memory
|
|
{
|
|
arena Global_Arena {};
|
|
|
|
void setup()
|
|
{
|
|
arena_init_from_allocator( & Global_Arena, heap(), Initial_Reserve );
|
|
|
|
if ( Global_Arena.total_size == 0 )
|
|
{
|
|
assert_crash( "Failed to reserve memory for Tests:: Global_Arena" );
|
|
}
|
|
}
|
|
|
|
void resize( uw new_size )
|
|
{
|
|
void* new_memory = resize( heap(), Global_Arena.physical_start, Global_Arena.total_size, new_size );
|
|
|
|
if ( new_memory == nullptr )
|
|
{
|
|
fatal("Failed to resize global arena!");
|
|
}
|
|
|
|
Global_Arena.physical_start = new_memory;
|
|
Global_Arena.total_size = new_size;
|
|
}
|
|
|
|
void cleanup()
|
|
{
|
|
arena_free( & Global_Arena);
|
|
}
|
|
}
|
|
|
|
|
|
struct TokEntry
|
|
{
|
|
char const* Str;
|
|
sw Length;
|
|
};
|
|
|
|
ZPL_TABLE( static, TokMap, tokmap_, TokEntry )
|
|
|
|
sw token_fmt_va( char* buf, uw buf_size, char const* fmt, s32 num_tokens, va_list va )
|
|
{
|
|
char const* buf_begin = buf;
|
|
sw remaining = buf_size;
|
|
|
|
TokMap tok_map;
|
|
{
|
|
tokmap_init( & tok_map, g_allocator );
|
|
|
|
s32 left = num_tokens;
|
|
|
|
while ( left-- )
|
|
{
|
|
char const* token = va_arg( va, char const* );
|
|
char const* value = va_arg( va, char const* );
|
|
|
|
TokEntry entry
|
|
{
|
|
value,
|
|
zpl_strnlen(value, (sw)128)
|
|
};
|
|
|
|
u32 key = crc32( token, zpl_strnlen(token, 32) );
|
|
|
|
tokmap_set( & tok_map, key, entry );
|
|
}
|
|
}
|
|
|
|
sw result = 0;
|
|
char current = *fmt;
|
|
|
|
while ( current )
|
|
{
|
|
sw len = 0;
|
|
|
|
while ( current && current != '{' && remaining )
|
|
{
|
|
*buf = *fmt;
|
|
buf++;
|
|
fmt++;
|
|
|
|
current = *fmt;
|
|
}
|
|
|
|
if ( current == '{' )
|
|
{
|
|
char const* scanner = fmt;
|
|
|
|
s32 tok_len = 0;
|
|
|
|
while ( *scanner != '}' )
|
|
{
|
|
tok_len++;
|
|
scanner++;
|
|
}
|
|
|
|
char const* token = fmt;
|
|
|
|
s32 key = crc32( token, tok_len );
|
|
TokEntry value = * tokmap_get( & tok_map, key );
|
|
s32 left = value.Length;
|
|
|
|
while ( left-- )
|
|
{
|
|
*buf = *value.Str;
|
|
buf++;
|
|
value.Str++;
|
|
}
|
|
|
|
scanner++;
|
|
fmt = scanner;
|
|
current = *fmt;
|
|
}
|
|
}
|
|
|
|
tokmap_clear( & tok_map );
|
|
|
|
return result;
|
|
}
|