diff --git a/Single_Header/dn_single_header.cpp b/Single_Header/dn_single_header.cpp index 4d5603b..9db193c 100644 --- a/Single_Header/dn_single_header.cpp +++ b/Single_Header/dn_single_header.cpp @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-08-02 22:07:04 +// Generated by the DN single header generator 2025-09-03 22:49:07 #define DN_BASE_INC_CPP @@ -1461,7 +1461,7 @@ DN_DSMap DN_DSMap_Init(DN_Arena *arena, DN_U32 size, DN_DSMapFlags flags) if (!DN_Check(arena)) return result; result.arena = arena; - result.pool = DN_Pool_Init(arena, DN_POOL_DEFAULT_ALIGN); + result.pool = DN_Pool_FromArena(arena, DN_POOL_DEFAULT_ALIGN); result.hash_to_slot = DN_Arena_NewArray(result.arena, DN_U32, size, DN_ZeroMem_Yes); result.slots = DN_Arena_NewArray(result.arena, DN_DSMapSlot, size, DN_ZeroMem_Yes); result.occupied = 1; // For sentinel @@ -2248,6 +2248,34 @@ DN_API bool operator==(DN_DSMapKey lhs, DN_DSMapKey rhs) // DN: Single header generator inlined this file => #include "Base/dn_base_convert.cpp" #define DN_CONVERT_CPP +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" + +DN_API DN_NibbleFromU8Result DN_CVT_NibbleFromU8(DN_U8 u8) +{ + static char const *table = "0123456789abcdef"; + DN_U8 lhs = (u8 >> 0) & 0xF; + DN_U8 rhs = (u8 >> 4) & 0xF; + DN_NibbleFromU8Result result = {}; + result.nibble0 = table[rhs]; + result.nibble1 = table[lhs]; + return result; +} + +DN_API DN_U8 DN_CVT_U8FromHexNibble(char hex) +{ + bool digit = hex >= '0' && hex <= '9'; + bool upper = hex >= 'A' && hex <= 'F'; + bool lower = hex >= 'a' && hex <= 'f'; + DN_U8 result = 0xFF; + if (digit) + result = hex - '0'; + if (upper) + result = hex - 'A' + 10; + if (lower) + result = hex - 'a' + 10; + return result; +} + DN_API int DN_CVT_FmtBuffer3DotTruncate(char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...) { va_list args; @@ -2262,7 +2290,7 @@ DN_API int DN_CVT_FmtBuffer3DotTruncate(char *buffer, int size, DN_FMT_ATTRIB ch return result; } -DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8(DN_U64 val, char separator) +DN_API DN_CVTU64Str8 DN_CVT_Str8FromU64(DN_U64 val, char separator) { DN_CVTU64Str8 result = {}; if (val == 0) { @@ -2295,7 +2323,7 @@ DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8(DN_U64 val, char separator) return result; } -DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes(DN_U64 bytes, DN_CVTBytesType type) +DN_API DN_CVTU64Bytes DN_CVT_BytesFromU64(DN_U64 bytes, DN_CVTBytesType type) { DN_Assert(type != DN_CVTBytesType_Count); DN_CVTU64Bytes result = {}; @@ -2312,10 +2340,10 @@ DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes(DN_U64 bytes, DN_CVTBytesType type) return result; } -DN_API DN_Str8 DN_CVT_U64ToBytesStr8(DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType desired_type) +DN_API DN_Str8 DN_CVT_BytesStr8FromU64(DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType desired_type) { - DN_CVTU64Bytes byte_size = DN_CVT_U64ToBytes(bytes, desired_type); - DN_Str8 result = DN_Str8_InitF(arena, "%.2f%.*s", byte_size.bytes, DN_STR_FMT(byte_size.suffix)); + DN_CVTU64Bytes byte_size = DN_CVT_BytesFromU64(bytes, desired_type); + DN_Str8 result = DN_Str8_FromF(arena, "%.2f%.*s", byte_size.bytes, DN_STR_FMT(byte_size.suffix)); return result; } @@ -2334,15 +2362,15 @@ DN_API DN_Str8 DN_CVT_BytesTypeToStr8(DN_CVTBytesType type) return result; } -DN_API DN_Str8 DN_CVT_U64ToAge(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit) +DN_API DN_Str8 DN_CVT_AgeFromU64(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit) { DN_Str8 result = {}; if (!arena) return result; char buffer[512]; - DN_Arena stack_arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); - DN_Str8Builder builder = DN_Str8Builder_Init(&stack_arena); + DN_Arena stack_arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&stack_arena); DN_U64 remainder = age_s; if (unit & DN_CVTU64AgeUnit_Year) { @@ -2390,15 +2418,15 @@ DN_API DN_Str8 DN_CVT_U64ToAge(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit u return result; } -DN_API DN_Str8 DN_CVT_F64ToAge(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit) +DN_API DN_Str8 DN_CVT_AgeFromF64(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit) { DN_Str8 result = {}; if (!arena) return result; char buffer[256]; - DN_Arena stack_arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); - DN_Str8Builder builder = DN_Str8Builder_Init(&stack_arena); + DN_Arena stack_arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&stack_arena); DN_F64 remainder = age_s; if (unit & DN_CVTU64AgeUnit_Year) { @@ -2450,7 +2478,7 @@ DN_API DN_Str8 DN_CVT_F64ToAge(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit u return result; } -DN_API DN_U64 DN_CVT_HexToU64(DN_Str8 hex) +DN_API DN_U64 DN_CVT_U64FromHex(DN_Str8 hex) { DN_Str8 real_hex = DN_Str8_TrimPrefix(DN_Str8_TrimPrefix(hex, DN_STR8("0x")), DN_STR8("0X")); DN_USize max_hex_size = sizeof(DN_U64) * 2 /*hex chars per byte*/; @@ -2459,16 +2487,16 @@ DN_API DN_U64 DN_CVT_HexToU64(DN_Str8 hex) DN_USize size = DN_Min(max_hex_size, real_hex.size); DN_U64 result = 0; for (DN_USize index = 0; index < size; index++) { - char ch = real_hex.data[index]; - DN_CharHexToU8 val = DN_Char_HexToU8(ch); - if (!val.success) + char ch = real_hex.data[index]; + DN_U8 val = DN_CVT_U8FromHexNibble(ch); + if (val == 0xFF) break; - result = (result << 4) | val.value; + result = (result << 4) | val; } return result; } -DN_API DN_Str8 DN_CVT_U64ToHex(DN_Arena *arena, DN_U64 number, uint32_t flags) +DN_API DN_Str8 DN_CVT_HexFromU64(DN_Arena *arena, DN_U64 number, uint32_t flags) { DN_Str8 prefix = {}; if ((flags & DN_CVTU64HexStrFlags_0xPrefix)) @@ -2486,7 +2514,7 @@ DN_API DN_Str8 DN_CVT_U64ToHex(DN_Arena *arena, DN_U64 number, uint32_t flags) return result; } -DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr8(DN_U64 number, DN_CVTU64HexStrFlags flags) +DN_API DN_CVTU64HexStr DN_CVT_HexFromU64Str8(DN_U64 number, DN_CVTU64HexStrFlags flags) { DN_Str8 prefix = {}; if (flags & DN_CVTU64HexStrFlags_0xPrefix) @@ -2508,7 +2536,7 @@ DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr8(DN_U64 number, DN_CVTU64HexStrFlags f return result; } -DN_API bool DN_CVT_BytesToHexPtr(void const *src, DN_USize src_size, char *dest, DN_USize dest_size) +DN_API bool DN_CVT_HexFromBytesPtr(void const *src, DN_USize src_size, char *dest, DN_USize dest_size) { if (!src || !dest) return false; @@ -2529,7 +2557,7 @@ DN_API bool DN_CVT_BytesToHexPtr(void const *src, DN_USize src_size, char *dest, return true; } -DN_API DN_Str8 DN_CVT_BytesToHex(DN_Arena *arena, void const *src, DN_USize size) +DN_API DN_Str8 DN_CVT_HexFromBytes(DN_Arena *arena, void const *src, DN_USize size) { DN_Str8 result = {}; if (!src || size <= 0) @@ -2537,12 +2565,12 @@ DN_API DN_Str8 DN_CVT_BytesToHex(DN_Arena *arena, void const *src, DN_USize size result = DN_Str8_Alloc(arena, size * 2, DN_ZeroMem_No); result.data[result.size] = 0; - bool converted = DN_CVT_BytesToHexPtr(src, size, result.data, result.size); + bool converted = DN_CVT_HexFromBytesPtr(src, size, result.data, result.size); DN_Assert(converted); return result; } -DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize dest_size) +DN_API DN_USize DN_CVT_BytesFromHexPtrUnchecked(DN_Str8 hex, void *dest, DN_USize dest_size) { DN_USize result = 0; unsigned char *dest_u8 = DN_CAST(unsigned char *) dest; @@ -2550,8 +2578,8 @@ DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize for (DN_USize hex_index = 0; hex_index < hex.size; hex_index += 2, result += 1) { char hex01 = hex.data[hex_index]; char hex02 = (hex_index + 1 < hex.size) ? hex.data[hex_index + 1] : 0; - char bit4_01 = DN_Char_HexToU8(hex01).value; - char bit4_02 = DN_Char_HexToU8(hex02).value; + char bit4_01 = DN_CVT_U8FromHexNibble(hex01); + char bit4_02 = DN_CVT_U8FromHexNibble(hex02); char byte = (bit4_01 << 4) | (bit4_02 << 0); dest_u8[result] = byte; } @@ -2560,7 +2588,7 @@ DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize return result; } -DN_API DN_USize DN_CVT_HexToBytesPtr(DN_Str8 hex, void *dest, DN_USize dest_size) +DN_API DN_USize DN_CVT_BytesFromHexPtr(DN_Str8 hex, void *dest, DN_USize dest_size) { hex = DN_Str8_TrimPrefix(hex, DN_STR8("0x")); hex = DN_Str8_TrimPrefix(hex, DN_STR8("0X")); @@ -2577,22 +2605,22 @@ DN_API DN_USize DN_CVT_HexToBytesPtr(DN_Str8 hex, void *dest, DN_USize dest_size if (hex.size <= 0 || !DN_Check(dest_size >= min_buffer_size)) return result; - result = DN_CVT_HexToBytesPtrUnchecked(hex, dest, dest_size); + result = DN_CVT_BytesFromHexPtrUnchecked(hex, dest, dest_size); return result; } -DN_API DN_Str8 DN_CVT_HexToBytesUnchecked(DN_Arena *arena, DN_Str8 hex) +DN_API DN_Str8 DN_CVT_BytesFromHexUnchecked(DN_Arena *arena, DN_Str8 hex) { DN_USize hex_size_rounded_up = hex.size + (hex.size % 2); DN_Str8 result = DN_Str8_Alloc(arena, (hex_size_rounded_up / 2), DN_ZeroMem_No); if (result.data) { - DN_USize bytes_written = DN_CVT_HexToBytesPtr(hex, result.data, result.size); + DN_USize bytes_written = DN_CVT_BytesFromHexPtr(hex, result.data, result.size); DN_Assert(bytes_written == result.size); } return result; } -DN_API DN_Str8 DN_CVT_HexToBytes(DN_Arena *arena, DN_Str8 hex) +DN_API DN_Str8 DN_CVT_BytesFromHex(DN_Arena *arena, DN_Str8 hex) { hex = DN_Str8_TrimPrefix(hex, DN_STR8("0x")); hex = DN_Str8_TrimPrefix(hex, DN_STR8("0X")); @@ -2604,13 +2632,15 @@ DN_API DN_Str8 DN_CVT_HexToBytes(DN_Arena *arena, DN_Str8 hex) if (!DN_Check(DN_Str8_IsAll(hex, DN_Str8IsAll_Hex))) return result; - result = DN_CVT_HexToBytesUnchecked(arena, hex); + result = DN_CVT_BytesFromHexUnchecked(arena, hex); return result; } // DN: Single header generator inlined this file => #include "Base/dn_base_mem.cpp" #define DN_BASE_MEM_CPP -static DN_ArenaBlock *DN_Arena_BlockInitFromMemFuncs_(DN_U64 reserve, DN_U64 commit, bool track_alloc, bool alloc_can_leak, DN_ArenaMemFuncs mem_funcs) +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" + +static DN_ArenaBlock *DN_Arena_BlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit, bool track_alloc, bool alloc_can_leak, DN_ArenaMemFuncs mem_funcs) { DN_ArenaBlock *result = nullptr; switch (mem_funcs.type) { @@ -2661,11 +2691,11 @@ static DN_ArenaBlock *DN_Arena_BlockInitFromMemFuncs_(DN_U64 reserve, DN_U64 com return result; } -static DN_ArenaBlock *DN_Arena_BlockInitFlagsFromMemFuncs_(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) +static DN_ArenaBlock *DN_Arena_BlockFlagsFromMemFuncs_(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) { bool track_alloc = (flags & DN_ArenaFlags_NoAllocTrack) == 0; bool alloc_can_leak = flags & DN_ArenaFlags_AllocCanLeak; - DN_ArenaBlock *result = DN_Arena_BlockInitFromMemFuncs_(reserve, commit, track_alloc, alloc_can_leak, mem_funcs); + DN_ArenaBlock *result = DN_Arena_BlockFromMemFuncs_(reserve, commit, track_alloc, alloc_can_leak, mem_funcs); if (result && ((flags & DN_ArenaFlags_NoPoison) == 0)) DN_ASanPoisonMemoryRegion(DN_CAST(char *) result + DN_ARENA_HEADER_SIZE, result->commit - DN_ARENA_HEADER_SIZE); return result; @@ -2687,7 +2717,7 @@ static void DN_Arena_UpdateStatsOnNewBlock_(DN_Arena *arena, DN_ArenaBlock const } } -DN_API DN_Arena DN_Arena_InitFromBuffer(void *buffer, DN_USize size, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromBuffer(void *buffer, DN_USize size, DN_ArenaFlags flags) { DN_Assert(buffer); DN_AssertF(DN_ARENA_HEADER_SIZE < size, "Buffer (%zu bytes) too small, need atleast %zu bytes to store arena metadata", size, DN_ARENA_HEADER_SIZE); @@ -2708,13 +2738,13 @@ DN_API DN_Arena DN_Arena_InitFromBuffer(void *buffer, DN_USize size, DN_ArenaFla return result; } -DN_API DN_Arena DN_Arena_InitFromMemFuncs(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) +DN_API DN_Arena DN_Arena_FromMemFuncs(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) { DN_Arena result = {}; result.flags = flags; result.mem_funcs = mem_funcs; result.flags |= DN_ArenaFlags_MemFuncs; - result.curr = DN_Arena_BlockInitFlagsFromMemFuncs_(reserve, commit, flags, mem_funcs); + result.curr = DN_Arena_BlockFlagsFromMemFuncs_(reserve, commit, flags, mem_funcs); DN_Arena_UpdateStatsOnNewBlock_(&result, result.curr); return result; } @@ -2787,7 +2817,7 @@ DN_API bool DN_Arena_Grow(DN_Arena *arena, DN_U64 reserve, DN_U64 commit) return false; bool result = false; - DN_ArenaBlock *new_block = DN_Arena_BlockInitFlagsFromMemFuncs_(reserve, commit, arena->flags, arena->mem_funcs); + DN_ArenaBlock *new_block = DN_Arena_BlockFlagsFromMemFuncs_(reserve, commit, arena->flags, arena->mem_funcs); if (new_block) { result = true; new_block->prev = arena->curr; @@ -2804,7 +2834,7 @@ DN_API void *DN_Arena_Alloc(DN_Arena *arena, DN_U64 size, uint8_t align, DN_Zero return nullptr; if (!arena->curr) { - arena->curr = DN_Arena_BlockInitFlagsFromMemFuncs_(DN_ARENA_RESERVE_SIZE, DN_ARENA_COMMIT_SIZE, arena->flags, arena->mem_funcs); + arena->curr = DN_Arena_BlockFlagsFromMemFuncs_(DN_ARENA_RESERVE_SIZE, DN_ARENA_COMMIT_SIZE, arena->flags, arena->mem_funcs); DN_Arena_UpdateStatsOnNewBlock_(arena, arena->curr); } @@ -3004,7 +3034,7 @@ DN_ArenaTempMemScope::~DN_ArenaTempMemScope() } // NOTE: DN_Pool /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Pool DN_Pool_Init(DN_Arena *arena, uint8_t align) +DN_API DN_Pool DN_Pool_FromArena(DN_Arena *arena, uint8_t align) { DN_Pool result = {}; if (arena) { @@ -3163,6 +3193,8 @@ DN_API void *DN_Pool_Copy(DN_Pool *pool, void const *data, DN_U64 size, uint8_t // DN: Single header generator inlined this file => #include "Base/dn_base_string.cpp" #define DN_STRING_CPP +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" + // NOTE: DN_CStr8 ////////////////////////////////////////////////////////////////////////////////// DN_API DN_USize DN_CStr8_FSize(DN_FMT_ATTRIB char const *fmt, ...) { @@ -3219,13 +3251,47 @@ DN_API bool operator!=(DN_Str16 const &lhs, DN_Str16 const &rhs) } // NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8 DN_Str8_InitCStr8(char const *src) +DN_API DN_Str8 DN_Str8_Alloc(DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem) +{ + DN_Str8 result = {}; + result.data = DN_Arena_NewArray(arena, char, size + 1, zero_mem); + if (result.data) + result.size = size; + result.data[result.size] = 0; + return result; +} + +DN_API DN_Str8 DN_Str8_FromCStr8(char const *src) { DN_USize size = DN_CStr8_Size(src); DN_Str8 result = DN_Str8_Init(src, size); return result; } +DN_API DN_Str8 DN_Str8_FromF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) +{ + va_list va; + va_start(va, fmt); + DN_Str8 result = DN_Str8_FromFV(arena, fmt, va); + va_end(va); + return result; +} + +DN_API DN_Str8 DN_Str8_FromFV(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = {}; + if (!fmt) + return result; + + DN_USize size = DN_CStr8_FVSize(fmt, args); + if (size) { + result = DN_Str8_Alloc(arena, size, DN_ZeroMem_No); + if (DN_Str8_HasData(result)) + DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); + } + return result; +} + DN_API bool DN_Str8_IsAll(DN_Str8 string, DN_Str8IsAll is_all) { bool result = DN_Str8_HasData(string); @@ -3277,13 +3343,13 @@ DN_API DN_Str8 DN_Str8_Advance(DN_Str8 string, DN_USize amount) DN_API DN_Str8 DN_Str8_NextLine(DN_Str8 string) { - DN_Str8 result = DN_Str8_BinarySplit(string, DN_STR8("\n")).rhs; + DN_Str8 result = DN_Str8_BSplit(string, DN_STR8("\n")).rhs; return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) +DN_API DN_Str8BSplitResult DN_Str8_BSplitArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; if (!DN_Str8_HasData(string) || !find || find_size == 0) return result; @@ -3304,15 +3370,15 @@ DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray(DN_Str8 string, DN_Str8 return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplit(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_Str8_BSplit(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = DN_Str8_BinarySplitArray(string, &find, 1); + DN_Str8BSplitResult result = DN_Str8_BSplitArray(string, &find, 1); return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) +DN_API DN_Str8BSplitResult DN_Str8_BSplitLastArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; if (!DN_Str8_HasData(string) || !find || find_size == 0) return result; @@ -3333,9 +3399,9 @@ DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray(DN_Str8 string, DN_ return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLast(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_Str8_BSplitLast(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = DN_Str8_BinarySplitLastArray(string, &find, 1); + DN_Str8BSplitResult result = DN_Str8_BSplitLastArray(string, &find, 1); return result; } @@ -3345,10 +3411,10 @@ DN_API DN_USize DN_Str8_Split(DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits if (!DN_Str8_HasData(string) || !DN_Str8_HasData(delimiter) || delimiter.size <= 0) return result; - DN_Str8BinarySplitResult split = {}; + DN_Str8BSplitResult split = {}; DN_Str8 first = string; do { - split = DN_Str8_BinarySplit(first, delimiter); + split = DN_Str8_BSplit(first, delimiter); if (split.lhs.size || mode == DN_Str8SplitIncludeEmptyStrings_Yes) { if (splits && result < splits_count) splits[result] = split.lhs; @@ -3375,9 +3441,6 @@ DN_API DN_Slice DN_Str8_SplitAlloc(DN_Arena *arena, DN_Str8 string, DN_ DN_API DN_Str8FindResult DN_Str8_FindStr8Array(DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case) { DN_Str8FindResult result = {}; - if (!DN_Str8_HasData(string) || !find || find_size == 0) - return result; - for (DN_USize index = 0; !result.found && index < string.size; index++) { for (DN_USize find_index = 0; find_index < find_size; find_index++) { DN_Str8 find_item = find[find_index]; @@ -3424,7 +3487,7 @@ DN_API DN_Str8FindResult DN_Str8_Find(DN_Str8 string, uint32_t flags) DN_API DN_Str8 DN_Str8_Segment(DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char) { if (!segment_size || !DN_Str8_HasData(src)) { - DN_Str8 result = DN_Str8_Copy(arena, src); + DN_Str8 result = DN_Str8_FromStr8(arena, src); return result; } @@ -3451,7 +3514,7 @@ DN_API DN_Str8 DN_Str8_Segment(DN_Arena *arena, DN_Str8 src, DN_USize segment_si DN_API DN_Str8 DN_Str8_ReverseSegment(DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char) { if (!segment_size || !DN_Str8_HasData(src)) { - DN_Str8 result = DN_Str8_Copy(arena, src); + DN_Str8 result = DN_Str8_FromStr8(arena, src); return result; } @@ -3636,7 +3699,7 @@ DN_API DN_Str8 DN_Str8_TrimByteOrderMark(DN_Str8 string) DN_API DN_Str8 DN_Str8_FileNameFromPath(DN_Str8 path) { DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(path, separators, DN_ArrayCountU(separators)); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(path, separators, DN_ArrayCountU(separators)); DN_Str8 result = DN_Str8_HasData(split.rhs) ? split.rhs : split.lhs; return result; } @@ -3650,14 +3713,14 @@ DN_API DN_Str8 DN_Str8_FileNameNoExtension(DN_Str8 path) DN_API DN_Str8 DN_Str8_FilePathNoExtension(DN_Str8 path) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLast(path, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplitLast(path, DN_STR8(".")); DN_Str8 result = split.lhs; return result; } DN_API DN_Str8 DN_Str8_FileExtension(DN_Str8 path) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLast(path, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplitLast(path, DN_STR8(".")); DN_Str8 result = split.rhs; return result; } @@ -3665,7 +3728,7 @@ DN_API DN_Str8 DN_Str8_FileExtension(DN_Str8 path) DN_API DN_Str8 DN_Str8_FileDirectoryFromPath(DN_Str8 path) { DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(path, separators, DN_ArrayCountU(separators)); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(path, separators, DN_ArrayCountU(separators)); DN_Str8 result = split.lhs; return result; } @@ -3774,7 +3837,7 @@ DN_API DN_Str8 DN_Str8_AppendF(DN_Arena *arena, DN_Str8 string, char const *fmt, DN_API DN_Str8 DN_Str8_AppendFV(DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args) { // TODO: Calculate size and write into one buffer instead of 2 appends - DN_Str8 append = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 append = DN_Str8_FromFV(arena, fmt, args); DN_Str8 result = DN_Str8_Alloc(arena, string.size + append.size, DN_ZeroMem_No); DN_Memcpy(result.data, string.data, string.size); DN_Memcpy(result.data + string.size, append.data, append.size); @@ -3792,7 +3855,7 @@ DN_API DN_Str8 DN_Str8_FillF(DN_Arena *arena, DN_USize count, char const *fmt, . DN_API DN_Str8 DN_Str8_FillFV(DN_Arena *arena, DN_USize count, char const *fmt, va_list args) { - DN_Str8 fill = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 fill = DN_Str8_FromFV(arena, fmt, args); DN_Str8 result = DN_Str8_Alloc(arena, count * fill.size, DN_ZeroMem_No); for (DN_USize index = 0; index < count; index++) { void *dest = result.data + (index * fill.size); @@ -3818,15 +3881,15 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle(DN_Arena *arena, DN_St { DN_Str8DotTruncateResult result = {}; if (str8.size <= (side_size * 2)) { - result.str8 = DN_Str8_Copy(arena, str8); + result.str8 = DN_Str8_FromStr8(arena, str8); return result; } DN_Str8 head = DN_Str8_Slice(str8, 0, side_size); DN_Str8 tail = DN_Str8_Slice(str8, str8.size - side_size, side_size); DN_MSVC_WARNING_PUSH - DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8_InitF' Actual type: 'struct DN_Str8' - result.str8 = DN_Str8_InitF(arena, "%S%S%S", head, truncator, tail); + DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8_FromF' Actual type: 'struct DN_Str8' + result.str8 = DN_Str8_FromF(arena, "%S%S%S", head, truncator, tail); DN_MSVC_WARNING_POP result.truncated = true; return result; @@ -3834,7 +3897,7 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle(DN_Arena *arena, DN_St DN_API DN_Str8 DN_Str8_Lower(DN_Arena *arena, DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(arena, string); + DN_Str8 result = DN_Str8_FromStr8(arena, string); for (DN_ForIndexU(index, result.size)) result.data[index] = DN_Char_ToLower(result.data[index]); return result; @@ -3842,7 +3905,7 @@ DN_API DN_Str8 DN_Str8_Lower(DN_Arena *arena, DN_Str8 string) DN_API DN_Str8 DN_Str8_Upper(DN_Arena *arena, DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(arena, string); + DN_Str8 result = DN_Str8_FromStr8(arena, string); for (DN_ForIndexU(index, result.size)) result.data[index] = DN_Char_ToUpper(result.data[index]); return result; @@ -3862,41 +3925,7 @@ DN_API bool operator!=(DN_Str8 const &lhs, DN_Str8 const &rhs) } #endif -DN_API DN_Str8 DN_Str8_InitF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) -{ - va_list va; - va_start(va, fmt); - DN_Str8 result = DN_Str8_InitFV(arena, fmt, va); - va_end(va); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFV(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = {}; - if (!fmt) - return result; - - DN_USize size = DN_CStr8_FVSize(fmt, args); - if (size) { - result = DN_Str8_Alloc(arena, size, DN_ZeroMem_No); - if (DN_Str8_HasData(result)) - DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); - } - return result; -} - -DN_API DN_Str8 DN_Str8_Alloc(DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem) -{ - DN_Str8 result = {}; - result.data = DN_Arena_NewArray(arena, char, size + 1, zero_mem); - if (result.data) - result.size = size; - result.data[result.size] = 0; - return result; -} - -DN_API DN_Str8 DN_Str8_Copy(DN_Arena *arena, DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8(DN_Arena *arena, DN_Str8 string) { DN_Str8 result = DN_Str8_Alloc(arena, string.size, DN_ZeroMem_No); if (DN_Str8_HasData(result)) { @@ -3907,31 +3936,35 @@ DN_API DN_Str8 DN_Str8_Copy(DN_Arena *arena, DN_Str8 string) } // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_Init(DN_Arena *arena) +DN_API DN_Str8Builder DN_Str8Builder_FromArena(DN_Arena *arena) { DN_Str8Builder result = {}; result.arena = arena; return result; } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRef(DN_Arena *arena, - DN_Str8 const *strings, - DN_USize size) +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRef(DN_Arena *arena, DN_Str8 const *strings, DN_USize size) { - DN_Str8Builder result = DN_Str8Builder_Init(arena); + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); DN_Str8Builder_AppendArrayRef(&result, strings, size); return result; } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopy(DN_Arena *arena, - DN_Str8 const *strings, - DN_USize size) +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopy(DN_Arena *arena, DN_Str8 const *strings, DN_USize size) { - DN_Str8Builder result = DN_Str8Builder_Init(arena); + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); DN_Str8Builder_AppendArrayCopy(&result, strings, size); return result; } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilder(DN_Arena *arena, DN_Str8Builder const *builder) +{ + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); + DN_Str8Builder_AppendBuilderCopy(&result, builder); + return result; +} + + DN_API bool DN_Str8Builder_AddArrayRef(DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add) { if (!builder) @@ -3993,7 +4026,7 @@ DN_API bool DN_Str8Builder_AddArrayCopy(DN_Str8Builder *builder, DN_Str8 const * bool result = true; DN_Str8 *strings_copy = DN_Arena_NewArray(builder->arena, DN_Str8, size, DN_ZeroMem_No); for (DN_ForIndexU(index, size)) { - strings_copy[index] = DN_Str8_Copy(builder->arena, strings[index]); + strings_copy[index] = DN_Str8_FromStr8(builder->arena, strings[index]); if (strings_copy[index].size != strings[index].size) { result = false; break; @@ -4011,7 +4044,7 @@ DN_API bool DN_Str8Builder_AddArrayCopy(DN_Str8Builder *builder, DN_Str8 const * DN_API bool DN_Str8Builder_AddFV(DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args) { - DN_Str8 string = DN_Str8_InitFV(builder->arena, fmt, args); + DN_Str8 string = DN_Str8_FromFV(builder->arena, fmt, args); DN_ArenaTempMem temp_mem = DN_Arena_TempMemBegin(builder->arena); bool result = DN_Str8Builder_AddArrayRef(builder, &string, 1, add); if (!result) @@ -4076,7 +4109,7 @@ static bool DN_Str8Builder_AppendBuilder_(DN_Str8Builder *dest, DN_Str8Builder c link->string = it->string; if (copy) { - link->string = DN_Str8_Copy(dest->arena, it->string); + link->string = DN_Str8_FromStr8(dest->arena, it->string); if (link->string.size != it->string.size) { result = false; break; @@ -4148,13 +4181,6 @@ DN_API bool DN_Str8Builder_Erase(DN_Str8Builder *builder, DN_Str8 string) return false; } -DN_API DN_Str8Builder DN_Str8Builder_Copy(DN_Arena *arena, DN_Str8Builder const *builder) -{ - DN_Str8Builder result = DN_Str8Builder_Init(arena); - DN_Str8Builder_AppendBuilderCopy(&result, builder); - return result; -} - DN_API DN_Str8 DN_Str8Builder_Build(DN_Str8Builder const *builder, DN_Arena *arena) { DN_Str8 result = DN_Str8Builder_BuildDelimited(builder, DN_STR8(""), arena); @@ -4201,12 +4227,22 @@ DN_API DN_Slice DN_Str8Builder_BuildSlice(DN_Str8Builder const *builder DN_USize slice_index = 0; for (DN_Str8Link *link = builder->head; link; link = link->next) - result.data[slice_index++] = DN_Str8_Copy(arena, link->string); + result.data[slice_index++] = DN_Str8_FromStr8(arena, link->string); DN_Assert(slice_index == builder->count); return result; } +DN_API DN_Str8 DN_LStr8_AppendF(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + *buf_size += DN_VSNPrintF(buf + *buf_size, DN_CAST(int)(buf_max - *buf_size), fmt, args); + va_end(args); + DN_Str8 result = DN_Str8_Init(buf, *buf_size); + return result; +} + // NOTE: DN_Char /////////////////////////////////////////////////////////////////////////////////// DN_API bool DN_Char_IsAlphabet(char ch) { @@ -4238,37 +4274,6 @@ DN_API bool DN_Char_IsHex(char ch) return result; } -DN_API DN_CharHexToU8 DN_Char_HexToU8(char ch) -{ - DN_CharHexToU8 result = {}; - result.success = true; - if (ch >= 'a' && ch <= 'f') - result.value = ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') - result.value = ch - 'A' + 10; - else if (ch >= '0' && ch <= '9') - result.value = ch - '0'; - else - result.success = false; - return result; -} - -static char constexpr DN_HEX_LUT[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - -DN_API char DN_Char_ToHex(char ch) -{ - char result = DN_CAST(char) - 1; - if (ch < 16) - result = DN_HEX_LUT[DN_CAST(uint8_t) ch]; - return result; -} - -DN_API char DN_Char_ToHexUnchecked(char ch) -{ - char result = DN_HEX_LUT[DN_CAST(uint8_t) ch]; - return result; -} - DN_API char DN_Char_ToLower(char ch) { char result = ch; @@ -4523,8 +4528,8 @@ DN_API void DN_OS_TLSInit(DN_OSTLS *tls, DN_OSTLSInitArgs args) for (DN_ForItCArray(it, DN_Arena, tls->arenas)) { DN_Arena *arena = it.data; switch (DN_CAST(DN_OSTLSArena) it.index) { - default: *arena = DN_Arena_InitFromOSVMem(reserve, commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; - case DN_OSTLSArena_ErrorSink: *arena = DN_Arena_InitFromOSVMem(err_sink_reserve, err_sink_commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; + default: *arena = DN_Arena_FromVMem(reserve, commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; + case DN_OSTLSArena_ErrorSink: *arena = DN_Arena_FromVMem(err_sink_reserve, err_sink_commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; case DN_OSTLSArena_Count: DN_InvalidCodePath; break; } } @@ -4651,7 +4656,7 @@ DN_API DN_OSErrSink *DN_OS_ErrSinkBegin_(DN_OSErrSinkMode mode, DN_CallSite call DN_USize arena_pos = DN_Arena_Pos(result->arena); if (tls->err_sink.stack_size == DN_ArrayCountU(err->stack)) { - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); DN_USize counter = 0; for (DN_ForItSize(it, DN_OSErrSinkNode, err->stack, err->stack_size)) { DN_MSVC_WARNING_PUSH @@ -4707,9 +4712,9 @@ DN_API DN_OSErrSinkMsg *DN_OS_ErrSinkEnd(DN_Arena *arena, DN_OSErrSink *err) DN_OSErrSinkMsg *prev = nullptr; for (DN_OSErrSinkMsg *it = node->msg_sentinel->next; it != node->msg_sentinel; it = it->next) { DN_OSErrSinkMsg *entry = DN_Arena_New(arena, DN_OSErrSinkMsg, DN_ZeroMem_Yes); - entry->msg = DN_Str8_Copy(arena, it->msg); - entry->call_site = it->call_site; - entry->error_code = it->error_code; + entry->msg = DN_Str8_FromStr8(arena, it->msg); + entry->call_site = it->call_site; + entry->error_code = it->error_code; if (!result) result = entry; // Assign first entry if we haven't yet if (prev) @@ -4765,7 +4770,7 @@ DN_API DN_Str8 DN_OS_ErrSinkEndStr8(DN_Arena *arena, DN_OSErrSink *err) // NOTE: Walk the list and allocate it onto the user's arena DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); DN_OSErrSinkNode *node = err->stack + (err->stack_size - 1); DN_OS_ErrSinkAddMsgToStr8Builder_(&builder, node->msg_sentinel->next, node->msg_sentinel); @@ -4795,7 +4800,7 @@ DN_API bool DN_OS_ErrSinkEndAndLogError_(DN_OSErrSink *err, DN_CallSite call_sit if (!msg) return false; - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); if (DN_Str8_HasData(err_msg)) { DN_Str8Builder_AppendRef(&builder, err_msg); DN_Str8Builder_AppendRef(&builder, DN_STR8(":")); @@ -4818,7 +4823,7 @@ DN_API bool DN_OS_ErrSinkEndAndLogError_(DN_OSErrSink *err, DN_CallSite call_sit DN_API bool DN_OS_ErrSinkEndAndLogErrorFV_(DN_OSErrSink *err, DN_CallSite call_site, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 log = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 log = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); return result; } @@ -4828,8 +4833,8 @@ DN_API bool DN_OS_ErrSinkEndAndLogErrorF_(DN_OSErrSink *err, DN_CallSite call_si va_list args; va_start(args, fmt); DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 log = DN_Str8_InitFV(tmem.arena, fmt, args); - bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); + DN_Str8 log = DN_Str8_FromFV(tmem.arena, fmt, args); + bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); va_end(args); return result; } @@ -4860,7 +4865,7 @@ DN_API void DN_OS_ErrSinkAppendFV_(DN_OSErrSink *err, DN_U32 error_code, DN_FMT_ DN_OSErrSinkMsg *msg = DN_Arena_New(err->arena, DN_OSErrSinkMsg, DN_ZeroMem_Yes); if (DN_Check(msg)) { - msg->msg = DN_Str8_InitFV(err->arena, fmt, args); + msg->msg = DN_Str8_FromFV(err->arena, fmt, args); msg->error_code = error_code; msg->call_site = DN_OS_TLSGet()->call_site; DN_DLList_Prepend(node->msg_sentinel, msg); @@ -4994,9 +4999,9 @@ DN_API void DN_OS_Init(DN_OSCore *os, DN_OSInitArgs *args) { #if defined(DN_PLATFORM_EMSCRIPTEN) - os->arena = DN_Arena_InitFromOSHeap(DN_Megabytes(1), DN_ArenaFlags_NoAllocTrack); + os->arena = DN_Arena_FromHeap(DN_Megabytes(1), DN_ArenaFlags_NoAllocTrack); #else - os->arena = DN_Arena_InitFromOSVMem(DN_Megabytes(1), DN_Kilobytes(4), DN_ArenaFlags_NoAllocTrack); + os->arena = DN_Arena_FromVMem(DN_Megabytes(1), DN_Kilobytes(4), DN_ArenaFlags_NoAllocTrack); #endif #if defined(DN_PLATFORM_WIN32) @@ -5181,8 +5186,8 @@ DN_API DN_Str8 DN_OS_EXEDir(DN_Arena *arena) DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); DN_Str8 exe_path = DN_OS_EXEPath(tmem.arena); DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(exe_path, separators, DN_ArrayCountU(separators)); - result = DN_Str8_Copy(arena, split.lhs); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(exe_path, separators, DN_ArrayCountU(separators)); + result = DN_Str8_FromStr8(arena, split.lhs); return result; } @@ -5346,7 +5351,7 @@ DN_API DN_Str8 DN_OS_ReadAll(DN_Arena *arena, DN_Str8 path, DN_OSErrSink *error) result = DN_Str8_Alloc(arena, path_info.size, DN_ZeroMem_No); if (!DN_Str8_HasData(result)) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(path_info.size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(path_info.size); DN_OS_ErrSinkAppendF(error, 1 /*error_code*/, "Failed to allocate %.*s for reading file '%.*s'", DN_STR_FMT(buffer_size_str8), DN_STR_FMT(path)); DN_Arena_TempMemEnd(temp_mem); result = {}; @@ -5376,7 +5381,7 @@ DN_API bool DN_OS_WriteAll(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error) DN_API bool DN_OS_WriteAllFV(DN_Str8 file_path, DN_OSErrSink *error, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 buffer = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_WriteAll(file_path, buffer, error); return result; } @@ -5393,7 +5398,7 @@ DN_API bool DN_OS_WriteAllF(DN_Str8 file_path, DN_OSErrSink *error, DN_FMT_ATTRI DN_API bool DN_OS_WriteAllSafe(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 tmp_path = DN_Str8_InitF(tmem.arena, "%.*s.tmp", DN_STR_FMT(path)); + DN_Str8 tmp_path = DN_Str8_FromF(tmem.arena, "%.*s.tmp", DN_STR_FMT(path)); if (!DN_OS_WriteAll(tmp_path, buffer, error)) return false; if (!DN_OS_CopyFile(tmp_path, path, true /*overwrite*/, error)) @@ -5406,7 +5411,7 @@ DN_API bool DN_OS_WriteAllSafe(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error DN_API bool DN_OS_WriteAllSafeFV(DN_Str8 path, DN_OSErrSink *error, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 buffer = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_WriteAllSafe(path, buffer, error); return result; } @@ -5437,8 +5442,8 @@ DN_API bool DN_OS_PathAddRef(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) fs_path->has_prefix_path_separator = (path.data[0] == '/'); for (;;) { - DN_Str8BinarySplitResult delimiter = DN_Str8_BinarySplitArray(path, delimiter_array, DN_ArrayCountU(delimiter_array)); - for (; delimiter.lhs.data; delimiter = DN_Str8_BinarySplitArray(delimiter.rhs, delimiter_array, DN_ArrayCountU(delimiter_array))) { + DN_Str8BSplitResult delimiter = DN_Str8_BSplitArray(path, delimiter_array, DN_ArrayCountU(delimiter_array)); + for (; delimiter.lhs.data; delimiter = DN_Str8_BSplitArray(delimiter.rhs, delimiter_array, DN_ArrayCountU(delimiter_array))) { if (delimiter.lhs.size <= 0) continue; @@ -5466,7 +5471,7 @@ DN_API bool DN_OS_PathAddRef(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) DN_API bool DN_OS_PathAdd(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) { - DN_Str8 copy = DN_Str8_Copy(arena, path); + DN_Str8 copy = DN_Str8_FromStr8(arena, path); bool result = DN_Str8_HasData(copy) ? true : DN_OS_PathAddRef(arena, fs_path, copy); return result; } @@ -5475,7 +5480,7 @@ DN_API bool DN_OS_PathAddF(DN_Arena *arena, DN_OSPath *fs_path, DN_FMT_ATTRIB ch { va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(arena, fmt, args); va_end(args); bool result = DN_OS_PathAddRef(arena, fs_path, path); return result; @@ -5515,7 +5520,7 @@ DN_API DN_Str8 DN_OS_PathToF(DN_Arena *arena, DN_Str8 path_separator, DN_FMT_ATT DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(tmem.arena, fmt, args); va_end(args); DN_Str8 result = DN_OS_PathTo(arena, path, path_separator); return result; @@ -5532,7 +5537,7 @@ DN_API DN_Str8 DN_OS_PathF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(tmem.arena, fmt, args); va_end(args); DN_Str8 result = DN_OS_Path(arena, path); return result; @@ -5639,23 +5644,26 @@ DN_API DN_OSHttpResponse DN_OS_HttpRequest(DN_Arena *arena, DN_Str8 host, DN_Str // DN: Single header generator inlined this file => #include "OS/dn_os_allocator.cpp" #define DN_OS_ALLOCATOR_CPP +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" +// DN: Single header generator commented out this header => #include "../dn_os_inc.h" + static void *DN_Arena_BasicAllocFromOSHeap(DN_USize size) { void *result = DN_OS_MemAlloc(size, DN_ZeroMem_Yes); return result; } -DN_API DN_Arena DN_Arena_InitFromOSHeap(DN_U64 size, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromHeap(DN_U64 size, DN_ArenaFlags flags) { DN_ArenaMemFuncs mem_funcs = {}; mem_funcs.type = DN_ArenaMemFuncType_Basic; mem_funcs.basic_alloc = DN_Arena_BasicAllocFromOSHeap; mem_funcs.basic_dealloc = DN_OS_MemDealloc; - DN_Arena result = DN_Arena_InitFromMemFuncs(size, size, flags, mem_funcs); + DN_Arena result = DN_Arena_FromMemFuncs(size, size, flags, mem_funcs); return result; } -DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags) { DN_ArenaMemFuncs mem_funcs = {}; mem_funcs.type = DN_ArenaMemFuncType_VMem; @@ -5663,7 +5671,7 @@ DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaF mem_funcs.vmem_reserve = DN_OS_MemReserve; mem_funcs.vmem_commit = DN_OS_MemCommit; mem_funcs.vmem_release = DN_OS_MemRelease; - DN_Arena result = DN_Arena_InitFromMemFuncs(reserve, commit, flags, mem_funcs); + DN_Arena result = DN_Arena_FromMemFuncs(reserve, commit, flags, mem_funcs); return result; } @@ -6044,18 +6052,32 @@ DN_API void DN_OS_PrintLnFVStyle(DN_OSPrintDest dest, DN_LOGStyle style, DN_FMT_ // DN: Single header generator inlined this file => #include "OS/dn_os_string.cpp" #define DN_OS_STRING_CPP -// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" +// DN: Single header generator commented out this header => #include "../dn_os_inc.h" -DN_API DN_Str8 DN_Str8_InitFFromFrame(DN_FMT_ATTRIB char const *fmt, ...) +// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// +DN_API DN_Str8 DN_Str8_FromFrameF(DN_FMT_ATTRIB char const *fmt, ...) { va_list args; va_start(args, fmt); - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSGet()->frame_arena, fmt, args); + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSGet()->frame_arena, fmt, args); va_end(args); return result; } -DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) +DN_API DN_Str8 DN_Str8_FromFrameFV(DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSGet()->frame_arena, fmt, args); + return result; +} + +DN_API DN_Str8 DN_Str8_FromFrame(DN_USize size, DN_ZeroMem zero_mem) +{ + DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSGet()->frame_arena, size, zero_mem); + return result; +} + +DN_API DN_Str8 DN_Str8_FromHeapF(DN_FMT_ATTRIB char const *fmt, ...) { va_list args; va_start(args, fmt); @@ -6063,7 +6085,7 @@ DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) DN_Str8 result = {}; DN_USize size = DN_CStr8_FVSize(fmt, args); if (size) { - result = DN_Str8_AllocFromOSHeap(size, DN_ZeroMem_No); + result = DN_Str8_FromHeap(size, DN_ZeroMem_No); if (DN_Str8_HasData(result)) DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); } @@ -6072,34 +6094,7 @@ DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) return result; } -DN_API DN_Str8 DN_Str8_InitFFromTLS(DN_FMT_ATTRIB char const *fmt, ...) -{ - va_list args; - va_start(args, fmt); - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSTopArena(), fmt, args); - va_end(args); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFVFromFrame(DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSGet()->frame_arena, fmt, args); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFVFromTLS(DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSTopArena(), fmt, args); - return result; -} - -DN_API DN_Str8 DN_Str8_AllocFromFrame(DN_USize size, DN_ZeroMem zero_mem) -{ - DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSGet()->frame_arena, size, zero_mem); - return result; -} - -DN_API DN_Str8 DN_Str8_AllocFromOSHeap(DN_USize size, DN_ZeroMem zero_mem) +DN_API DN_Str8 DN_Str8_FromHeap(DN_USize size, DN_ZeroMem zero_mem) { DN_Str8 result = {}; result.data = DN_CAST(char *)DN_OS_MemAlloc(size + 1, zero_mem); @@ -6109,31 +6104,47 @@ DN_API DN_Str8 DN_Str8_AllocFromOSHeap(DN_USize size, DN_ZeroMem zero_mem) return result; } -DN_API DN_Str8 DN_Str8_AllocFromTLS(DN_USize size, DN_ZeroMem zero_mem) +DN_API DN_Str8 DN_Str8_FromTLSFV(DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSTopArena(), fmt, args); + return result; +} + + +DN_API DN_Str8 DN_Str8_FromTLSF(DN_FMT_ATTRIB char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSTopArena(), fmt, args); + va_end(args); + return result; +} + +DN_API DN_Str8 DN_Str8_FromTLS(DN_USize size, DN_ZeroMem zero_mem) { DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSTopArena(), size, zero_mem); return result; } -DN_API DN_Str8 DN_Str8_CopyFromFrame(DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8Frame(DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(DN_OS_TLSGet()->frame_arena, string); + DN_Str8 result = DN_Str8_FromStr8(DN_OS_TLSGet()->frame_arena, string); return result; } -DN_API DN_Str8 DN_Str8_CopyFromTLS(DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8TLS(DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(DN_OS_TLSTopArena(), string); + DN_Str8 result = DN_Str8_FromStr8(DN_OS_TLSTopArena(), string); return result; } -DN_API DN_Slice DN_Str8_SplitAllocFromFrame(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) +DN_API DN_Slice DN_Str8_SplitFromFrame(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) { DN_Slice result = DN_Str8_SplitAlloc(DN_OS_TLSGet()->frame_arena, string, delimiter, mode); return result; } -DN_API DN_Slice DN_Str8_SplitAllocFromTLS(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) +DN_API DN_Slice DN_Str8_SplitFromTLS(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) { DN_Slice result = DN_Str8_SplitAlloc(DN_OS_TLSTopArena(), string, delimiter, mode); return result; @@ -6215,14 +6226,14 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddleFromTLS(DN_Str8 str8, u DN_API DN_Str8 DN_Str8_PadNewLines(DN_Arena *arena, DN_Str8 src, DN_Str8 pad) { // TODO: Implement this without requiring TLS so it can go into base strings - DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(src, DN_STR8("\n")); + DN_Str8BSplitResult split = DN_Str8_BSplit(src, DN_STR8("\n")); while (split.lhs.size) { DN_Str8Builder_AppendRef(&builder, pad); DN_Str8Builder_AppendRef(&builder, split.lhs); - split = DN_Str8_BinarySplit(split.rhs, DN_STR8("\n")); + split = DN_Str8_BSplit(split.rhs, DN_STR8("\n")); if (split.lhs.size) DN_Str8Builder_AppendRef(&builder, DN_STR8("\n")); } @@ -6277,12 +6288,12 @@ DN_API DN_Str8 DN_Str8_Replace(DN_Str8 string, // TODO: Implement this without requiring TLS so it can go into base strings DN_Str8 result = {}; if (!DN_Str8_HasData(string) || !DN_Str8_HasData(find) || find.size > string.size || find.size == 0 || string.size == 0) { - result = DN_Str8_Copy(arena, string); + result = DN_Str8_FromStr8(arena, string); return result; } - DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); - DN_Str8Builder string_builder = DN_Str8Builder_Init(tmem.arena); + DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); + DN_Str8Builder string_builder = DN_Str8Builder_FromArena(tmem.arena); DN_USize max = string.size - find.size; DN_USize head = start_index; @@ -6309,7 +6320,7 @@ DN_API DN_Str8 DN_Str8_Replace(DN_Str8 string, if (string_builder.string_size == 0) { // NOTE: No replacement possible, so we just do a full-copy - result = DN_Str8_Copy(arena, string); + result = DN_Str8_FromStr8(arena, string); } else { DN_Str8 remainder = DN_Str8_Init(string.data + head, string.size - head); DN_Str8Builder_AppendRef(&string_builder, remainder); @@ -6326,7 +6337,6 @@ DN_API DN_Str8 DN_Str8_ReplaceInsensitive(DN_Str8 string, DN_Str8 find, DN_Str8 } // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// - DN_API DN_Str8 DN_Str8Builder_BuildFromOSHeap(DN_Str8Builder const *builder) { DN_Str8 result = DN_ZeroInit; @@ -6750,8 +6760,8 @@ DN_API bool DN_OS_CopyFile(DN_Str8 src, DN_Str8 dest, bool overwrite, DN_OSErrSi if (!result) { int error_code = errno; DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 file_size_str8 = DN_CVT_U64ToBytesStr8(tmem.arena, stat_existing.st_size, DN_CVTBytesType_Auto); - DN_Str8 bytes_written_str8 = DN_CVT_U64ToBytesStr8(tmem.arena, bytes_written, DN_CVTBytesType_Auto); + DN_Str8 file_size_str8 = DN_CVT_BytesStr8FromU64(tmem.arena, stat_existing.st_size, DN_CVTBytesType_Auto); + DN_Str8 bytes_written_str8 = DN_CVT_BytesStr8FromU64(tmem.arena, bytes_written, DN_CVTBytesType_Auto); DN_OS_ErrSinkAppendF(error, error_code, "Failed to copy file '%.*s' to '%.*s', we copied %.*s but the file " @@ -6981,7 +6991,7 @@ DN_API DN_OSFileRead DN_OS_FileRead(DN_OSFile *file, void *buffer, DN_USize size result.bytes_read = fread(buffer, 1, size, DN_CAST(FILE *) file->handle); if (feof(DN_CAST(FILE*)file->handle)) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, 1, "Failed to read %S from file", buffer_size_str8); return result; } @@ -6999,7 +7009,7 @@ DN_API bool DN_OS_FileWritePtr(DN_OSFile *file, void const *buffer, DN_USize siz 1 /*count*/; if (!result) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, 1, "Failed to write buffer (%s) to file handle", DN_STR_FMT(buffer_size_str8)); } return result; @@ -7112,7 +7122,7 @@ DN_API DN_OSExecResult DN_OS_ExecWait(DN_OSExecAsyncHandle handle, DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); if (arena && handle.stdout_read) { char buffer[4096]; - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); for (;;) { ssize_t bytes_read = read(stdout_pipe[DN_OSPipeType__Read], buffer, sizeof(buffer)); @@ -7126,7 +7136,7 @@ DN_API DN_OSExecResult DN_OS_ExecWait(DN_OSExecAsyncHandle handle, if (arena && handle.stderr_read) { char buffer[4096]; - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); for (;;) { ssize_t bytes_read = read(stderr_pipe[DN_OSPipeType__Read], buffer, sizeof(buffer)); @@ -7686,7 +7696,7 @@ DN_API DN_POSIXProcSelfStatus DN_Posix_ProcSelfStatus() DN_Str8 const VM_PEAK = DN_STR8("VmPeak:"); DN_Str8 const VM_SIZE = DN_STR8("VmSize:"); DN_Str8 status_buf = DN_Str8Builder_BuildFromTLS(&builder); - DN_Slice lines = DN_Str8_SplitAllocFromTLS(status_buf, DN_STR8("\n"), DN_Str8SplitIncludeEmptyStrings_No); + DN_Slice lines = DN_Str8_SplitFromTLS(status_buf, DN_STR8("\n"), DN_Str8SplitIncludeEmptyStrings_No); for (DN_ForIt(line_it, DN_Str8, &lines)) { DN_Str8 line = DN_Str8_TrimWhitespaceAround(*line_it.data); @@ -7702,14 +7712,14 @@ DN_API DN_POSIXProcSelfStatus DN_Posix_ProcSelfStatus() } else if (DN_Str8_StartsWith(line, VM_SIZE, DN_Str8EqCase_Insensitive)) { DN_Str8 size_with_kb = DN_Str8_TrimWhitespaceAround(DN_Str8_Slice(line, VM_SIZE.size, line.size)); DN_Assert(DN_Str8_EndsWith(size_with_kb, DN_STR8("kB"))); - DN_Str8 vm_size = DN_Str8_BinarySplit(size_with_kb, DN_STR8(" ")).lhs; + DN_Str8 vm_size = DN_Str8_BSplit(size_with_kb, DN_STR8(" ")).lhs; DN_Str8ToU64Result to_u64 = DN_Str8_ToU64(vm_size, 0); result.vm_size = DN_Kilobytes(to_u64.value); DN_Assert(to_u64.success); } else if (DN_Str8_StartsWith(line, VM_PEAK, DN_Str8EqCase_Insensitive)) { DN_Str8 size_with_kb = DN_Str8_TrimWhitespaceAround(DN_Str8_Slice(line, VM_PEAK.size, line.size)); DN_Assert(DN_Str8_EndsWith(size_with_kb, DN_STR8("kB"))); - DN_Str8 vm_size = DN_Str8_BinarySplit(size_with_kb, DN_STR8(" ")).lhs; + DN_Str8 vm_size = DN_Str8_BSplit(size_with_kb, DN_STR8(" ")).lhs; DN_Str8ToU64Result to_u64 = DN_Str8_ToU64(vm_size, 0); result.vm_peak = DN_Kilobytes(to_u64.value); DN_Assert(to_u64.success); @@ -7822,7 +7832,7 @@ DN_API void DN_OS_HttpRequestAsync(DN_OSHttpResponse *response, if (method.size >= sizeof(fetch_attribs.requestMethod)) { response->error_msg = - DN_Str8_InitF(arena, + DN_Str8_FromF(arena, "Request method in EM has a size limit of 31 characters, method was " "'%.*s' which is %zu characters long", DN_STR_FMT(method), @@ -7844,7 +7854,7 @@ DN_API void DN_OS_HttpRequestAsync(DN_OSHttpResponse *response, fetch_attribs.onerror = DN_OS_HttpRequestEMFetchOnErrorCallback; fetch_attribs.userData = response; - DN_Str8 url = DN_Str8_InitF(tmem, "%.*s%.*s", DN_STR_FMT(host), DN_STR_FMT(path)); + DN_Str8 url = DN_Str8_FromF(tmem, "%.*s%.*s", DN_STR_FMT(host), DN_STR_FMT(path)); DN_LOG_InfoF("Initiating HTTP '%s' request to '%.*s' with payload '%.*s'", fetch_attribs.requestMethod, DN_STR_FMT(url), @@ -8470,7 +8480,7 @@ DN_API DN_OSFileRead DN_OS_FileRead(DN_OSFile *file, void *buffer, DN_USize size DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); if (!DN_Check(size <= (unsigned long)-1)) { - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF( err, 1 /*error_code*/, @@ -8526,7 +8536,7 @@ DN_API bool DN_OS_FileWritePtr(DN_OSFile *file, void const *buffer, DN_USize siz if (!result) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_W32Error win_error = DN_W32_LastError(tmem.arena); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, win_error.code, "Failed to write buffer (%.*s) to file handle: %.*s", DN_STR_FMT(buffer_size_str8), DN_STR_FMT(win_error.msg)); } return result; @@ -8729,7 +8739,7 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Slice cmd_line, DN_OSExe DN_Str16 cmd16 = DN_W32_Str8ToStr16(tmem.arena, cmd_rendered); DN_Str16 working_dir16 = DN_W32_Str8ToStr16(tmem.arena, args->working_dir); - DN_Str8Builder env_builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder env_builder = DN_Str8Builder_FromTLS(); DN_Str8Builder_AppendArrayRef(&env_builder, args->environment.data, args->environment.size); if (env_builder.string_size) DN_Str8Builder_AppendRef(&env_builder, DN_STR8("\0")); @@ -9151,7 +9161,7 @@ DN_API void DN_W32_ThreadSetName(DN_Str8 name) #pragma pack(pop) - DN_Str8 copy = DN_Str8_Copy(tmem.arena, name); + DN_Str8 copy = DN_Str8_FromStr8(tmem.arena, name); DN_W32ThreadNameInfo info = {}; info.dwType = 0x1000; info.szName = (char *)copy.data; @@ -9559,7 +9569,7 @@ DN_API DN_Str8 DN_W32_Str16ToStr8FromHeap(DN_Str16 src) // NOTE: Str8 allocate ensures there's one extra byte for // null-termination already so no-need to +1 the required size - DN_Str8 buffer = DN_Str8_AllocFromOSHeap(required_size, DN_ZeroMem_No); + DN_Str8 buffer = DN_Str8_FromHeap(required_size, DN_ZeroMem_No); if (!DN_Str8_HasData(buffer)) return result; @@ -9730,13 +9740,13 @@ DN_API void DN_Core_Init(DN_Core *core, DN_CoreOnInit on_init) #if defined(DN_LEAK_TRACKING) // NOTE: Setup the allocation table with allocation tracking turned off on // the arena we're using to initialise the table. - core->alloc_table_arena = DN_Arena_InitFromOSVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); + core->alloc_table_arena = DN_Arena_FromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); core->alloc_table = DN_DSMap_Init(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); #endif // NOTE: Print out init features /////////////////////////////////////////////////////////////// DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); if (on_init & DN_CoreOnInit_LogLibFeatures) { DN_Str8Builder_AppendRef(&builder, DN_STR8("DN initialised:\n")); @@ -9918,7 +9928,7 @@ DN_API DN_Str8 DN_StackTrace_WalkResultToStr8(DN_Arena *arena, DN_StackTraceWalk return result; DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); DN_StackTrace_AddWalkToStr8Builder_(walk, &builder, skip); result = DN_Str8Builder_Build(&builder, arena); return result; @@ -9936,8 +9946,8 @@ DN_API DN_Str8 DN_StackTrace_WalkStr8FromHeap(uint16_t limit, uint16_t skip) { // NOTE: We don't use WalkResultToStr8 because that uses the TLS arenas which // does not use the OS heap. - DN_Arena arena = DN_Arena_InitFromOSHeap(DN_Kilobytes(64), DN_ArenaFlags_NoAllocTrack); - DN_Str8Builder builder = DN_Str8Builder_Init(&arena); + DN_Arena arena = DN_Arena_FromHeap(DN_Kilobytes(64), DN_ArenaFlags_NoAllocTrack); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&arena); DN_StackTraceWalkResult walk = DN_StackTrace_Walk(&arena, limit); DN_StackTrace_AddWalkToStr8Builder_(&walk, &builder, skip); DN_Str8 result = DN_Str8Builder_BuildFromOSHeap(&builder); @@ -10050,8 +10060,8 @@ DN_API void DN_DBGTrackAlloc(void *ptr, DN_USize size, bool leak_permitted) DN_DebugAlloc *alloc = alloc_entry.value; if (alloc_entry.found) { if ((alloc->flags & DN_DebugAllocFlag_Freed) == 0) { - DN_Str8 alloc_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, alloc->size); - DN_Str8 new_alloc_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, size); + DN_Str8 alloc_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, alloc->size); + DN_Str8 new_alloc_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, size); DN_HardAssertF( alloc->flags & DN_DebugAllocFlag_Freed, "This pointer is already in the leak tracker, however it has not been freed yet. This " @@ -10108,7 +10118,7 @@ DN_API void DN_DBGTrackDealloc(void *ptr) DN_DebugAlloc *alloc = alloc_entry.value; if (alloc->flags & DN_DebugAllocFlag_Freed) { - DN_Str8 freed_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, alloc->freed_size); + DN_Str8 freed_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, alloc->freed_size); DN_HardAssertF((alloc->flags & DN_DebugAllocFlag_Freed) == 0, "Double free detected, pointer to free was already marked " "as freed. Either the pointer was reallocated but not " @@ -10150,7 +10160,7 @@ DN_API void DN_DBGDumpLeaks() if (alloc_leaked && !leak_permitted) { leaked_bytes += alloc->size; leak_count++; - DN_Str8 alloc_size = DN_CVT_U64ToBytesStr8Auto(g_dn_core->alloc_table.arena, alloc->size); + DN_Str8 alloc_size = DN_CVT_BytesStr8FromU64Auto(g_dn_core->alloc_table.arena, alloc->size); DN_LOG_WarningF("Pointer (0x%p) leaked %.*s at:\n" "%.*s", alloc->ptr, DN_STR_FMT(alloc_size), @@ -10160,8 +10170,8 @@ DN_API void DN_DBGDumpLeaks() if (leak_count) { char buffer[512]; - DN_Arena arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_Nil); - DN_Str8 leak_size = DN_CVT_U64ToBytesStr8Auto(&arena, leaked_bytes); + DN_Arena arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_Nil); + DN_Str8 leak_size = DN_CVT_BytesStr8FromU64Auto(&arena, leaked_bytes); DN_LOG_WarningF("There were %I64u leaked allocations totalling %.*s", leak_count, DN_STR_FMT(leak_size)); } } @@ -10319,11 +10329,11 @@ void DN_Docs_Demo() } } - // NOTE: DN_CVT_BytesToHex //////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_HexFromBytes //////////////////////////////////////////////////////////////////////// { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); unsigned char bytes[2] = {0xFA, 0xCE}; - DN_Str8 hex = DN_CVT_BytesToHex(tmem.arena, bytes, sizeof(bytes)); + DN_Str8 hex = DN_CVT_HexFromBytes(tmem.arena, bytes, sizeof(bytes)); DN_Assert(hex == DN_STR8("face")); // NOTE: Guaranteed to be null-terminated } @@ -10419,7 +10429,7 @@ void DN_Docs_Demo() // // A 'Deinit' of the map will similarly deallocate the passed in arena (as // the map takes ownership of the arena). - DN_Arena arena = DN_Arena_InitFromOSVMem(0, 0, DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(0, 0, DN_ArenaFlags_Nil); DN_DSMap map = DN_DSMap_Init(&arena, /*size*/ 1024, DN_DSMapFlags_Nil); // Size must be PoT! DN_Assert(DN_DSMap_IsValid(&map)); // Valid if no initialisation failure (e.g. mem alloc failure) @@ -10596,21 +10606,10 @@ void DN_Docs_Demo() } } - // NOTE: DN_FStr8_Max ///////////////////////////////////////////////////////////////////////// - // - // Return the maximum capacity of the string, e.g. the 'N' template - // parameter of FStr8 - - // NOTE: DN_FStr8_ToStr8 ////////////////////////////////////////////////////////////////////// - // - // Create a slice of the string into a pointer and length string (DN_Str8). - // The lifetime of the slice is bound to the lifetime of the FStr8 and is - // invalidated when the FStr8 is. - - // NOTE: DN_CVT_HexToBytes //////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_BytesFromHex //////////////////////////////////////////////////////////////////////// { unsigned char bytes[2]; - DN_USize bytes_written = DN_CVT_HexToBytesPtr(DN_STR8("0xFACE"), bytes, sizeof(bytes)); + DN_USize bytes_written = DN_CVT_BytesFromHexPtr(DN_STR8("0xFACE"), bytes, sizeof(bytes)); DN_Assert(bytes_written == 2); DN_Assert(bytes[0] == 0xFA); DN_Assert(bytes[1] == 0xCE); @@ -11041,21 +11040,21 @@ void DN_Docs_Demo() DN_Assert(string.data[string.size] == 0); // It is null-terminated! } - // NOTE: DN_Str8_BinarySplit ////////////////////////////////////////////////////////////////// + // NOTE: DN_Str8_BSplit ////////////////////////////////////////////////////////////////// // // Splits a string into 2 substrings occuring prior and after the first // occurence of the delimiter. Neither strings include the matched // delimiter. If no delimiter is found, the 'rhs' of the split will be // empty. { - DN_Str8BinarySplitResult dot_split = DN_Str8_BinarySplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8(".")); - DN_Str8BinarySplitResult slash_split = DN_Str8_BinarySplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8("/")); + DN_Str8BSplitResult dot_split = DN_Str8_BSplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8(".")); + DN_Str8BSplitResult slash_split = DN_Str8_BSplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8("/")); DN_Assert(dot_split.lhs == DN_STR8("abc") && dot_split.rhs == DN_STR8("def.ghi")); DN_Assert(slash_split.lhs == DN_STR8("abc.def.ghi") && slash_split.rhs == DN_STR8("")); // Loop that walks the string and produces ("abc", "def", "ghi") for (DN_Str8 it = DN_STR8("abc.def.ghi"); it.size;) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(it, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplit(it, DN_STR8(".")); DN_Str8 chunk = split.lhs; // "abc", "def", ... it = split.rhs; (void)chunk; @@ -11317,17 +11316,17 @@ void DN_Docs_Demo() // @param[in] conflict_arena A pointer to the arena currently being used in the // function - // NOTE: DN_CVT_U64ToStr8 ///////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_Str8FromU64 ///////////////////////////////////////////////////////////////////////// { - DN_CVTU64Str8 string = DN_CVT_U64ToStr8(123123, ','); + DN_CVTU64Str8 string = DN_CVT_Str8FromU64(123123, ','); if (0) // Prints "123,123" printf("%.*s", DN_STR_FMT(string)); } - // NOTE: DN_CVT_U64ToAge ////////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_AgeFromU64 ////////////////////////////////////////////////////////////////////////// { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 string = DN_CVT_U64ToAge(tmem.arena, DN_HoursToSec(2) + DN_MinutesToSec(30), DN_CVTU64AgeUnit_All); + DN_Str8 string = DN_CVT_AgeFromU64(tmem.arena, DN_HoursToSec(2) + DN_MinutesToSec(30), DN_CVTU64AgeUnit_All); DN_Assert(DN_Str8_Eq(string, DN_STR8("2h 30m"))); } @@ -11524,55 +11523,55 @@ DN_API bool operator>(DN_V2I32 lhs, DN_V2I32 rhs) DN_API DN_V2I32 operator-(DN_V2I32 lhs, DN_V2I32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x - rhs.x, lhs.y - rhs.y); + DN_V2I32 result = DN_V2I32_From2N(lhs.x - rhs.x, lhs.y - rhs.y); return result; } DN_API DN_V2I32 operator-(DN_V2I32 lhs) { - DN_V2I32 result = DN_V2I32_Init2N(-lhs.x, -lhs.y); + DN_V2I32 result = DN_V2I32_From2N(-lhs.x, -lhs.y); return result; } DN_API DN_V2I32 operator+(DN_V2I32 lhs, DN_V2I32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x + rhs.x, lhs.y + rhs.y); + DN_V2I32 result = DN_V2I32_From2N(lhs.x + rhs.x, lhs.y + rhs.y); return result; } DN_API DN_V2I32 operator*(DN_V2I32 lhs, DN_V2I32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x * rhs.x, lhs.y * rhs.y); + DN_V2I32 result = DN_V2I32_From2N(lhs.x * rhs.x, lhs.y * rhs.y); return result; } DN_API DN_V2I32 operator*(DN_V2I32 lhs, DN_F32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2I32 result = DN_V2I32_From2N(lhs.x * rhs, lhs.y * rhs); return result; } DN_API DN_V2I32 operator*(DN_V2I32 lhs, int32_t rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2I32 result = DN_V2I32_From2N(lhs.x * rhs, lhs.y * rhs); return result; } DN_API DN_V2I32 operator/(DN_V2I32 lhs, DN_V2I32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x / rhs.x, lhs.y / rhs.y); + DN_V2I32 result = DN_V2I32_From2N(lhs.x / rhs.x, lhs.y / rhs.y); return result; } DN_API DN_V2I32 operator/(DN_V2I32 lhs, DN_F32 rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2I32 result = DN_V2I32_From2N(lhs.x / rhs, lhs.y / rhs); return result; } DN_API DN_V2I32 operator/(DN_V2I32 lhs, int32_t rhs) { - DN_V2I32 result = DN_V2I32_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2I32 result = DN_V2I32_From2N(lhs.x / rhs, lhs.y / rhs); return result; } @@ -11626,19 +11625,19 @@ DN_API DN_V2I32 &operator+=(DN_V2I32 &lhs, DN_V2I32 rhs) DN_API DN_V2I32 DN_V2I32_Min(DN_V2I32 a, DN_V2I32 b) { - DN_V2I32 result = DN_V2I32_Init2N(DN_Min(a.x, b.x), DN_Min(a.y, b.y)); + DN_V2I32 result = DN_V2I32_From2N(DN_Min(a.x, b.x), DN_Min(a.y, b.y)); return result; } DN_API DN_V2I32 DN_V2I32_Max(DN_V2I32 a, DN_V2I32 b) { - DN_V2I32 result = DN_V2I32_Init2N(DN_Max(a.x, b.x), DN_Max(a.y, b.y)); + DN_V2I32 result = DN_V2I32_From2N(DN_Max(a.x, b.x), DN_Max(a.y, b.y)); return result; } DN_API DN_V2I32 DN_V2I32_Abs(DN_V2I32 a) { - DN_V2I32 result = DN_V2I32_Init2N(DN_Abs(a.x), DN_Abs(a.y)); + DN_V2I32 result = DN_V2I32_From2N(DN_Abs(a.x), DN_Abs(a.y)); return result; } @@ -11681,49 +11680,49 @@ DN_API bool operator>(DN_V2U16 lhs, DN_V2U16 rhs) DN_API DN_V2U16 operator-(DN_V2U16 lhs, DN_V2U16 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x - rhs.x, lhs.y - rhs.y); + DN_V2U16 result = DN_V2U16_From2N(lhs.x - rhs.x, lhs.y - rhs.y); return result; } DN_API DN_V2U16 operator+(DN_V2U16 lhs, DN_V2U16 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x + rhs.x, lhs.y + rhs.y); + DN_V2U16 result = DN_V2U16_From2N(lhs.x + rhs.x, lhs.y + rhs.y); return result; } DN_API DN_V2U16 operator*(DN_V2U16 lhs, DN_V2U16 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x * rhs.x, lhs.y * rhs.y); + DN_V2U16 result = DN_V2U16_From2N(lhs.x * rhs.x, lhs.y * rhs.y); return result; } DN_API DN_V2U16 operator*(DN_V2U16 lhs, DN_F32 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2U16 result = DN_V2U16_From2N(lhs.x * rhs, lhs.y * rhs); return result; } DN_API DN_V2U16 operator*(DN_V2U16 lhs, int32_t rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2U16 result = DN_V2U16_From2N(lhs.x * rhs, lhs.y * rhs); return result; } DN_API DN_V2U16 operator/(DN_V2U16 lhs, DN_V2U16 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x / rhs.x, lhs.y / rhs.y); + DN_V2U16 result = DN_V2U16_From2N(lhs.x / rhs.x, lhs.y / rhs.y); return result; } DN_API DN_V2U16 operator/(DN_V2U16 lhs, DN_F32 rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2U16 result = DN_V2U16_From2N(lhs.x / rhs, lhs.y / rhs); return result; } DN_API DN_V2U16 operator/(DN_V2U16 lhs, int32_t rhs) { - DN_V2U16 result = DN_V2U16_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2U16 result = DN_V2U16_From2N(lhs.x / rhs, lhs.y / rhs); return result; } @@ -11815,106 +11814,106 @@ DN_API bool operator>(DN_V2F32 lhs, DN_V2F32 rhs) // NOTE: DN_V2F32 operator- ////////////////////////////////////////////////////////////////////////// DN_API DN_V2F32 operator-(DN_V2F32 lhs) { - DN_V2F32 result = DN_V2F32_Init2N(-lhs.x, -lhs.y); + DN_V2F32 result = DN_V2F32_From2N(-lhs.x, -lhs.y); return result; } DN_API DN_V2F32 operator-(DN_V2F32 lhs, DN_V2F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x - rhs.x, lhs.y - rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x - rhs.x, lhs.y - rhs.y); return result; } DN_API DN_V2F32 operator-(DN_V2F32 lhs, DN_V2I32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x - rhs.x, lhs.y - rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x - rhs.x, lhs.y - rhs.y); return result; } DN_API DN_V2F32 operator-(DN_V2F32 lhs, DN_F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x - rhs, lhs.y - rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x - rhs, lhs.y - rhs); return result; } DN_API DN_V2F32 operator-(DN_V2F32 lhs, int32_t rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x - rhs, lhs.y - rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x - rhs, lhs.y - rhs); return result; } // NOTE: DN_V2F32 operator+ ////////////////////////////////////////////////////////////////////////// DN_API DN_V2F32 operator+(DN_V2F32 lhs, DN_V2F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x + rhs.x, lhs.y + rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x + rhs.x, lhs.y + rhs.y); return result; } DN_API DN_V2F32 operator+(DN_V2F32 lhs, DN_V2I32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x + rhs.x, lhs.y + rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x + rhs.x, lhs.y + rhs.y); return result; } DN_API DN_V2F32 operator+(DN_V2F32 lhs, DN_F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x + rhs, lhs.y + rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x + rhs, lhs.y + rhs); return result; } DN_API DN_V2F32 operator+(DN_V2F32 lhs, int32_t rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x + rhs, lhs.y + rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x + rhs, lhs.y + rhs); return result; } // NOTE: DN_V2F32 operator* ////////////////////////////////////////////////////////////////////////// DN_API DN_V2F32 operator*(DN_V2F32 lhs, DN_V2F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x * rhs.x, lhs.y * rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x * rhs.x, lhs.y * rhs.y); return result; } DN_API DN_V2F32 operator*(DN_V2F32 lhs, DN_V2I32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x * rhs.x, lhs.y * rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x * rhs.x, lhs.y * rhs.y); return result; } DN_API DN_V2F32 operator*(DN_V2F32 lhs, DN_F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x * rhs, lhs.y * rhs); return result; } DN_API DN_V2F32 operator*(DN_V2F32 lhs, int32_t rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x * rhs, lhs.y * rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x * rhs, lhs.y * rhs); return result; } // NOTE: DN_V2F32 operator/ ////////////////////////////////////////////////////////////////////////// DN_API DN_V2F32 operator/(DN_V2F32 lhs, DN_V2F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x / rhs.x, lhs.y / rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x / rhs.x, lhs.y / rhs.y); return result; } DN_API DN_V2F32 operator/(DN_V2F32 lhs, DN_V2I32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x / rhs.x, lhs.y / rhs.y); + DN_V2F32 result = DN_V2F32_From2N(lhs.x / rhs.x, lhs.y / rhs.y); return result; } DN_API DN_V2F32 operator/(DN_V2F32 lhs, DN_F32 rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x / rhs, lhs.y / rhs); return result; } DN_API DN_V2F32 operator/(DN_V2F32 lhs, int32_t rhs) { - DN_V2F32 result = DN_V2F32_Init2N(lhs.x / rhs, lhs.y / rhs); + DN_V2F32 result = DN_V2F32_From2N(lhs.x / rhs, lhs.y / rhs); return result; } @@ -12020,19 +12019,19 @@ DN_API DN_V2F32 &operator+=(DN_V2F32 &lhs, int32_t rhs) DN_API DN_V2F32 DN_V2F32_Min(DN_V2F32 a, DN_V2F32 b) { - DN_V2F32 result = DN_V2F32_Init2N(DN_Min(a.x, b.x), DN_Min(a.y, b.y)); + DN_V2F32 result = DN_V2F32_From2N(DN_Min(a.x, b.x), DN_Min(a.y, b.y)); return result; } DN_API DN_V2F32 DN_V2F32_Max(DN_V2F32 a, DN_V2F32 b) { - DN_V2F32 result = DN_V2F32_Init2N(DN_Max(a.x, b.x), DN_Max(a.y, b.y)); + DN_V2F32 result = DN_V2F32_From2N(DN_Max(a.x, b.x), DN_Max(a.y, b.y)); return result; } DN_API DN_V2F32 DN_V2F32_Abs(DN_V2F32 a) { - DN_V2F32 result = DN_V2F32_Init2N(DN_Abs(a.x), DN_Abs(a.y)); + DN_V2F32 result = DN_V2F32_From2N(DN_Abs(a.x), DN_Abs(a.y)); return result; } @@ -12083,7 +12082,7 @@ DN_API DN_F32 DN_V2F32_Dot(DN_V2F32 a, DN_V2F32 b) return result; } -DN_API DN_F32 DN_V2F32_LengthSq_V2x2(DN_V2F32 lhs, DN_V2F32 rhs) +DN_API DN_F32 DN_V2F32_LengthSq2V2(DN_V2F32 lhs, DN_V2F32 rhs) { // NOTE: Pythagoras's theorem (a^2 + b^2 = c^2) without the square root DN_F32 a = rhs.x - lhs.x; @@ -12093,9 +12092,16 @@ DN_API DN_F32 DN_V2F32_LengthSq_V2x2(DN_V2F32 lhs, DN_V2F32 rhs) return result; } -DN_API DN_F32 DN_V2F32_Length_V2x2(DN_V2F32 lhs, DN_V2F32 rhs) +DN_API bool DN_V2F32_LengthSqIsWithin2V2(DN_V2F32 lhs, DN_V2F32 rhs, DN_F32 within_amount_sq) { - DN_F32 result_squared = DN_V2F32_LengthSq_V2x2(lhs, rhs); + DN_F32 dist = DN_V2F32_LengthSq2V2(lhs, rhs); + bool result = dist <= within_amount_sq; + return result; +} + +DN_API DN_F32 DN_V2F32_Length2V2(DN_V2F32 lhs, DN_V2F32 rhs) +{ + DN_F32 result_squared = DN_V2F32_LengthSq2V2(lhs, rhs); DN_F32 result = DN_SqrtF32(result_squared); return result; } @@ -12140,7 +12146,7 @@ DN_API DN_V2F32 DN_V2F32_Perpendicular(DN_V2F32 a) // x' = -y // y' = +x - DN_V2F32 result = DN_V2F32_Init2N(-a.y, a.x); + DN_V2F32 result = DN_V2F32_From2N(-a.y, a.x); return result; } @@ -12149,7 +12155,7 @@ DN_API DN_V2F32 DN_V2F32_Reflect(DN_V2F32 in, DN_V2F32 surface) DN_V2F32 normal = DN_V2F32_Perpendicular(surface); DN_V2F32 normal_norm = DN_V2F32_Normalise(normal); DN_F32 signed_dist = DN_V2F32_Dot(in, normal_norm); - DN_V2F32 result = DN_V2F32_Init2N(in.x, in.y + (-signed_dist * 2.f)); + DN_V2F32 result = DN_V2F32_From2N(in.x, in.y + (-signed_dist * 2.f)); return result; } @@ -12200,55 +12206,55 @@ DN_API bool operator>(DN_V3F32 lhs, DN_V3F32 rhs) DN_API DN_V3F32 operator-(DN_V3F32 lhs, DN_V3F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z); + DN_V3F32 result = DN_V3F32_From3N(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z); return result; } DN_API DN_V3F32 operator-(DN_V3F32 lhs) { - DN_V3F32 result = DN_V3F32_Init3F32(-lhs.x, -lhs.y, -lhs.z); + DN_V3F32 result = DN_V3F32_From3N(-lhs.x, -lhs.y, -lhs.z); return result; } DN_API DN_V3F32 operator+(DN_V3F32 lhs, DN_V3F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); + DN_V3F32 result = DN_V3F32_From3N(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); return result; } DN_API DN_V3F32 operator*(DN_V3F32 lhs, DN_V3F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z); + DN_V3F32 result = DN_V3F32_From3N(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z); return result; } DN_API DN_V3F32 operator*(DN_V3F32 lhs, DN_F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs); + DN_V3F32 result = DN_V3F32_From3N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs); return result; } DN_API DN_V3F32 operator*(DN_V3F32 lhs, int32_t rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs); + DN_V3F32 result = DN_V3F32_From3N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs); return result; } DN_API DN_V3F32 operator/(DN_V3F32 lhs, DN_V3F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x / rhs.x, lhs.y / rhs.y, lhs.z / rhs.z); + DN_V3F32 result = DN_V3F32_From3N(lhs.x / rhs.x, lhs.y / rhs.y, lhs.z / rhs.z); return result; } DN_API DN_V3F32 operator/(DN_V3F32 lhs, DN_F32 rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs); + DN_V3F32 result = DN_V3F32_From3N(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs); return result; } DN_API DN_V3F32 operator/(DN_V3F32 lhs, int32_t rhs) { - DN_V3F32 result = DN_V3F32_Init3F32(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs); + DN_V3F32 result = DN_V3F32_From3N(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs); return result; } @@ -12323,6 +12329,25 @@ DN_API DN_V3F32 DN_V3_Normalise(DN_V3F32 a) #if !defined(DN_NO_V4) // NOTE: DN_V4 ///////////////////////////////////////////////////////////////////////////////////// +DN_API DN_V4F32 DN_V4F32_FromRGBU32(DN_U32 u32) +{ + DN_U8 r = (DN_U8)(((u32 << 8) & DN_V4_R_MASK_U32) >> 24); + DN_U8 g = (DN_U8)(((u32 << 8) & DN_V4_G_MASK_U32) >> 16); + DN_U8 b = (DN_U8)(((u32 << 8) & DN_V4_B_MASK_U32) >> 8); + DN_V4F32 result = DN_V4F32_FromRGBU8(r, g, b); + return result; +} + +DN_API DN_V4F32 DN_V4F32_FromRGBAU32(DN_U32 u32) +{ + DN_U8 r = (DN_U8)((u32 & DN_V4_R_MASK_U32) >> 24); + DN_U8 g = (DN_U8)((u32 & DN_V4_G_MASK_U32) >> 16); + DN_U8 b = (DN_U8)((u32 & DN_V4_B_MASK_U32) >> 8); + DN_U8 a = (DN_U8)((u32 & DN_V4_A_MASK_U32) >> 0); + DN_V4F32 result = DN_V4F32_FromRGBAU8(r, g, b, a); + return result; +} + DN_API bool operator==(DN_V4F32 lhs, DN_V4F32 rhs) { bool result = (lhs.x == rhs.x) && (lhs.y == rhs.y) && (lhs.z == rhs.z) && (lhs.w == rhs.w); @@ -12361,43 +12386,43 @@ DN_API bool operator>(DN_V4F32 lhs, DN_V4F32 rhs) DN_API DN_V4F32 operator-(DN_V4F32 lhs, DN_V4F32 rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); + DN_V4F32 result = DN_V4F32_From4N(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); return result; } DN_API DN_V4F32 operator-(DN_V4F32 lhs) { - DN_V4F32 result = DN_V4F32_Init4N(-lhs.x, -lhs.y, -lhs.z, -lhs.w); + DN_V4F32 result = DN_V4F32_From4N(-lhs.x, -lhs.y, -lhs.z, -lhs.w); return result; } DN_API DN_V4F32 operator+(DN_V4F32 lhs, DN_V4F32 rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); + DN_V4F32 result = DN_V4F32_From4N(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); return result; } DN_API DN_V4F32 operator*(DN_V4F32 lhs, DN_V4F32 rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); + DN_V4F32 result = DN_V4F32_From4N(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); return result; } DN_API DN_V4F32 operator*(DN_V4F32 lhs, DN_F32 rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs, lhs.w * rhs); + DN_V4F32 result = DN_V4F32_From4N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs, lhs.w * rhs); return result; } DN_API DN_V4F32 operator*(DN_V4F32 lhs, int32_t rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs, lhs.w * rhs); + DN_V4F32 result = DN_V4F32_From4N(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs, lhs.w * rhs); return result; } DN_API DN_V4F32 operator/(DN_V4F32 lhs, DN_F32 rhs) { - DN_V4F32 result = DN_V4F32_Init4N(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs, lhs.w / rhs); + DN_V4F32 result = DN_V4F32_From4N(lhs.x / rhs, lhs.y / rhs, lhs.z / rhs, lhs.w / rhs); return result; } @@ -12671,25 +12696,23 @@ DN_API DN_M4 DN_M4_DivF(DN_M4 lhs, DN_F32 rhs) return result; } - #if !defined(DN_NO_FSTR8) -DN_API DN_FStr8<256> DN_M4_ColumnMajorString(DN_M4 mat) +DN_API DN_Str8x256 DN_M4_ColumnMajorString(DN_M4 mat) { - DN_FStr8<256> result = {}; + DN_Str8x256 result = {}; for (int row = 0; row < 4; row++) { for (int it = 0; it < 4; it++) { if (it == 0) - DN_FStr8_Add(&result, DN_STR8("|")); - DN_FStr8_AddF(&result, "%.5f", mat.columns[it][row]); + DN_IStr8_AppendF(&result, "|"); + DN_IStr8_AppendF(&result, "%.5f", mat.columns[it][row]); if (it != 3) - DN_FStr8_Add(&result, DN_STR8(", ")); + DN_IStr8_AppendF(&result, ", "); else - DN_FStr8_Add(&result, DN_STR8("|\n")); + DN_IStr8_AppendF(&result, "|\n"); } } return result; } - #endif #endif // !defined(DN_M4) // NOTE: DN_M2x3 /////////////////////////////////////////////////////////////////////////////////// @@ -12878,7 +12901,7 @@ DN_API bool DN_Rect_Intersects(DN_Rect a, DN_Rect b) DN_API DN_Rect DN_Rect_Intersection(DN_Rect a, DN_Rect b) { - DN_Rect result = DN_Rect_Init2V2(a.pos, DN_V2F32_Init1N(0)); + DN_Rect result = DN_Rect_From2V2(a.pos, DN_V2F32_From1N(0)); if (DN_Rect_Intersects(a, b)) { DN_V2F32 a_min = a.pos; DN_V2F32 a_max = a.pos + a.size; @@ -12891,7 +12914,7 @@ DN_API DN_Rect DN_Rect_Intersection(DN_Rect a, DN_Rect b) min.y = DN_Max(a_min.y, b_min.y); max.x = DN_Min(a_max.x, b_max.x); max.y = DN_Min(a_max.y, b_max.y); - result = DN_Rect_Init2V2(min, max - min); + result = DN_Rect_From2V2(min, max - min); } return result; } @@ -12908,7 +12931,7 @@ DN_API DN_Rect DN_Rect_Union(DN_Rect a, DN_Rect b) min.y = DN_Min(a_min.y, b_min.y); max.x = DN_Max(a_max.x, b_max.x); max.y = DN_Max(a_max.y, b_max.y); - DN_Rect result = DN_Rect_Init2V2(min, max - min); + DN_Rect result = DN_Rect_From2V2(min, max - min); return result; } @@ -12933,7 +12956,7 @@ DN_API DN_Rect DN_Rect_CutLeftClip(DN_Rect *rect, DN_F32 amount, DN_RectCutClip DN_F32 result_max_x = min_x + amount; if (clip) result_max_x = DN_Min(result_max_x, max_x); - DN_Rect result = DN_Rect_Init4N(min_x, rect->pos.y, result_max_x - min_x, rect->size.h); + DN_Rect result = DN_Rect_From4N(min_x, rect->pos.y, result_max_x - min_x, rect->size.h); rect->pos.x = result_max_x; rect->size.w = max_x - result_max_x; return result; @@ -12946,7 +12969,7 @@ DN_API DN_Rect DN_Rect_CutRightClip(DN_Rect *rect, DN_F32 amount, DN_RectCutClip DN_F32 result_min_x = max_x - amount; if (clip) result_min_x = DN_Max(result_min_x, 0); - DN_Rect result = DN_Rect_Init4N(result_min_x, rect->pos.y, max_x - result_min_x, rect->size.h); + DN_Rect result = DN_Rect_From4N(result_min_x, rect->pos.y, max_x - result_min_x, rect->size.h); rect->size.w = result_min_x - min_x; return result; } @@ -12958,7 +12981,7 @@ DN_API DN_Rect DN_Rect_CutTopClip(DN_Rect *rect, DN_F32 amount, DN_RectCutClip c DN_F32 result_max_y = min_y + amount; if (clip) result_max_y = DN_Min(result_max_y, max_y); - DN_Rect result = DN_Rect_Init4N(rect->pos.x, min_y, rect->size.w, result_max_y - min_y); + DN_Rect result = DN_Rect_From4N(rect->pos.x, min_y, rect->size.w, result_max_y - min_y); rect->pos.y = result_max_y; rect->size.h = max_y - result_max_y; return result; @@ -12971,7 +12994,7 @@ DN_API DN_Rect DN_Rect_CutBottomClip(DN_Rect *rect, DN_F32 amount, DN_RectCutCli DN_F32 result_min_y = max_y - amount; if (clip) result_min_y = DN_Max(result_min_y, 0); - DN_Rect result = DN_Rect_Init4N(rect->pos.x, result_min_y, rect->size.w, max_y - result_min_y); + DN_Rect result = DN_Rect_From4N(rect->pos.x, result_min_y, rect->size.w, max_y - result_min_y); rect->size.h = result_min_y - min_y; return result; } @@ -12992,32 +13015,32 @@ DN_API DN_Rect DN_RectCut_Cut(DN_RectCut rect_cut, DN_V2F32 size, DN_RectCutClip DN_API DN_V2F32 DN_Rect_InterpolatedPoint(DN_Rect rect, DN_V2F32 t01) { - DN_V2F32 result = DN_V2F32_Init2N(rect.pos.w + (rect.size.w * t01.x), + DN_V2F32 result = DN_V2F32_From2N(rect.pos.w + (rect.size.w * t01.x), rect.pos.h + (rect.size.h * t01.y)); return result; } DN_API DN_V2F32 DN_Rect_TopLeft(DN_Rect rect) { - DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_Init2N(0, 0)); + DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_From2N(0, 0)); return result; } DN_API DN_V2F32 DN_Rect_TopRight(DN_Rect rect) { - DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_Init2N(1, 0)); + DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_From2N(1, 0)); return result; } DN_API DN_V2F32 DN_Rect_BottomLeft(DN_Rect rect) { - DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_Init2N(0, 1)); + DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_From2N(0, 1)); return result; } DN_API DN_V2F32 DN_Rect_BottomRight(DN_Rect rect) { - DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_Init2N(1, 1)); + DN_V2F32 result = DN_Rect_InterpolatedPoint(rect, DN_V2F32_From2N(1, 1)); return result; } #endif // !defined(DN_NO_RECT) @@ -13131,7 +13154,7 @@ DN_API void DN_ASYNC_WaitTask (DN_OSSemaphore *sem, DN_U32 timeout_ms); static DN_I32 DN_ASYNC_ThreadEntryPoint_(DN_OSThread *thread) { - DN_OS_ThreadSetName(DN_FStr8_ToStr8(&thread->name)); + DN_OS_ThreadSetName(DN_Str8_FromIStr8(&thread->name)); DN_ASYNCCore *async = DN_CAST(DN_ASYNCCore *) thread->user_context; DN_Ring *ring = &async->ring; for (;;) { @@ -13176,7 +13199,7 @@ DN_API void DN_ASYNC_Init(DN_ASYNCCore *async, char *base, DN_USize base_size, D async->threads = threads; for (DN_ForIndexU(index, async->thread_count)) { DN_OSThread *thread = async->threads + index; - thread->name = DN_FStr8_InitF<64>("ASYNC W%zu", index); + DN_IStr8_AppendF(&thread->name, "ASYNC W%zu", index); DN_OS_ThreadInit(thread, DN_ASYNC_ThreadEntryPoint_, async); } } @@ -13360,7 +13383,7 @@ DN_API void DN_BinPack_Str8FromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPa DN_Str8Builder_AppendBytesCopy(&pack->writer, string->data, string->size); } else { DN_Str8 src = DN_Str8_Slice(pack->read, pack->read_index, string->size); - *string = DN_Str8_Copy(arena, src); + *string = DN_Str8_FromStr8(arena, src); pack->read_index += src.size; } } @@ -13377,19 +13400,6 @@ DN_API void DN_BinPack_Str8FromPool(DN_BinPack *pack, DN_Pool *pool, DN_BinPackM } } -template -DN_API void DN_BinPack_FStr8(DN_BinPack *pack, DN_BinPackMode mode, DN_FStr8 *string) -{ - DN_BinPack_VarInt_(pack, mode, &string->size, sizeof(string->size)); - if (mode == DN_BinPackMode_Serialise) { - DN_Str8Builder_AppendBytesCopy(&pack->writer, string->data, string->size); - } else { - DN_Str8 src = DN_Str8_Slice(pack->read, pack->read_index, string->size); - *string = DN_FStr8_InitF("%.*s", DN_STR_FMT(src)); - pack->read_index += src.size; - } -} - DN_API void DN_BinPack_BytesFromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, void **ptr, DN_USize *size) { DN_Str8 string = DN_Str8_Init(*ptr, *size); @@ -13702,7 +13712,7 @@ static void DN_CSV_PackStr8(DN_CSVPack *pack, DN_CSVSerialise serialise, DN_Str8 { if (serialise == DN_CSVSerialise_Read) { DN_Str8 csv_value = DN_CSV_TokeniserNextColumn(&pack->read_tokeniser); - *str8 = DN_Str8_Copy(arena, csv_value); + *str8 = DN_Str8_FromStr8(arena, csv_value); } else { DN_Str8Builder_AppendF(&pack->write_builder, "%s%.*s", pack->write_column++ ? "," : "", DN_STR_FMT(*str8)); } @@ -14169,7 +14179,7 @@ DN_API void DN_JSONBuilder_KeyValue(DN_JSONBuilder *builder, DN_Str8 key, DN_Str DN_API void DN_JSONBuilder_KeyValueFV(DN_JSONBuilder *builder, DN_Str8 key, char const *value_fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(builder->string_builder.arena); - DN_Str8 value = DN_Str8_InitFV(tmem.arena, value_fmt, args); + DN_Str8 value = DN_Str8_FromFV(tmem.arena, value_fmt, args); DN_JSONBuilder_KeyValue(builder, key, value); } diff --git a/Single_Header/dn_single_header.h b/Single_Header/dn_single_header.h index ee3593c..26c471c 100644 --- a/Single_Header/dn_single_header.h +++ b/Single_Header/dn_single_header.h @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-08-02 22:07:04 +// Generated by the DN single header generator 2025-09-03 22:49:06 #if !defined(DN_BASE_INC_H) #define DN_BASE_INC_H @@ -313,12 +313,12 @@ #define DN_Gigabytes(val) ((DN_U64)1024 * DN_Megabytes(val)) // NOTE: Time ////////////////////////////////////////////////////////////////////////////////////// -#define DN_SecondsToMs(val) ((val) * 1000) -#define DN_MinutesToSec(val) ((val) * 60ULL) -#define DN_HoursToSec(val) (DN_MinutesToSec(val) * 60ULL) -#define DN_DaysToSec(val) (DN_HoursToSec(val) * 24ULL) -#define DN_WeeksToSec(val) (DN_DaysToSec(val) * 7ULL) -#define DN_YearsToSec(val) (DN_WeeksToSec(val) * 52ULL) +#define DN_SecondsToMs(val) ((val) * 1000) +#define DN_MinutesToSec(val) ((val) * 60ULL) +#define DN_HoursToSec(val) (DN_MinutesToSec(val) * 60ULL) +#define DN_DaysToSec(val) (DN_HoursToSec(val) * 24ULL) +#define DN_WeeksToSec(val) (DN_DaysToSec(val) * 7ULL) +#define DN_YearsToSec(val) (DN_WeeksToSec(val) * 52ULL) // NOTE: Debug Break /////////////////////////////////////////////////////////////////////////////// #if !defined(DN_DebugBreak) @@ -1033,8 +1033,8 @@ struct DN_Pool DN_U8 align; }; -DN_API DN_Arena DN_Arena_InitFromBuffer (void *buffer, DN_USize size, DN_ArenaFlags flags); -DN_API DN_Arena DN_Arena_InitFromMemFuncs (DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs); +DN_API DN_Arena DN_Arena_FromBuffer (void *buffer, DN_USize size, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromMemFuncs (DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs); DN_API void DN_Arena_Deinit (DN_Arena *arena); DN_API bool DN_Arena_Commit (DN_Arena *arena, DN_U64 size); DN_API bool DN_Arena_CommitTo (DN_Arena *arena, DN_U64 pos); @@ -1058,7 +1058,7 @@ DN_API void DN_Arena_TempMemEnd (DN_ArenaTem #define DN_Arena_NewCopy(arena, T, src) (T *)DN_Arena_Copy (arena, (src), sizeof(T), alignof(T)) #define DN_Arena_NewArrayCopy(arena, T, src, count) (T *)DN_Arena_Copy (arena, (src), sizeof(T) * (count), alignof(T)) -DN_API DN_Pool DN_Pool_Init (DN_Arena *arena, DN_U8 align); +DN_API DN_Pool DN_Pool_FromArena (DN_Arena *arena, DN_U8 align); DN_API bool DN_Pool_IsValid (DN_Pool const *pool); DN_API void * DN_Pool_Alloc (DN_Pool *pool, DN_USize size); DN_API DN_Str8 DN_Pool_AllocStr8FV (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, va_list args); @@ -1149,10 +1149,13 @@ DN_API DN_LOGTypeParam DN_LOG_MakeU32LogTypeParam (DN_LOGType type); #if !defined(DN_BASE_STRING_H) #define DN_BASE_STRING_H +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" + #if !defined(DN_STB_SPRINTF_HEADER_ONLY) #define STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_STATIC #endif + DN_MSVC_WARNING_PUSH DN_MSVC_WARNING_DISABLE(4505) // Unused function warning DN_GCC_WARNING_PUSH @@ -3100,7 +3103,7 @@ struct DN_Str8Link DN_Str8Link *prev; // The prev string in the linked list }; -struct DN_Str8BinarySplitResult +struct DN_Str8BSplitResult { DN_Str8 lhs; DN_Str8 rhs; @@ -3162,20 +3165,6 @@ struct DN_Str8DotTruncateResult DN_Str8 str8; }; -#if !defined(DN_NO_FSTR8) -template -struct DN_FStr8 -{ - char data[N + 1]; - DN_USize size; - - char *begin() { return data; } - char *end() { return data + size; } - char const *begin() const { return data; } - char const *end() const { return data + size; } -}; -#endif // !defined(DN_NO_FSTR8) - struct DN_Str8Builder { DN_Arena *arena; // Allocator to use to back the string list @@ -3191,393 +3180,140 @@ enum DN_Str8BuilderAdd DN_Str8BuilderAdd_Prepend, }; -// NOTE: DN_CStr8 ////////////////////////////////////////////////////////////////////////////////// -template constexpr DN_USize DN_CStr8_ArrayUCount (char const (&literal)[N]) { (void)literal; return N - 1; } -template constexpr DN_USize DN_CStr8_ArrayICount (char const (&literal)[N]) { (void)literal; return N - 1; } -DN_API DN_USize DN_CStr8_FSize (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_USize DN_CStr8_FVSize (DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_USize DN_CStr8_Size (char const *a); -DN_API DN_USize DN_CStr16_Size (wchar_t const *a); - -// NOTE: DN_Str16 ////////////////////////////////////////////////////////////////////////////////// -#define DN_STR16(string) DN_Str16{(wchar_t *)(string), sizeof(string)/sizeof(string[0]) - 1} -#define DN_Str16_HasData(string) ((string).data && (string).size) - -#if defined(__cplusplus) -DN_API bool operator== (DN_Str16 const &lhs, DN_Str16 const &rhs); -DN_API bool operator!= (DN_Str16 const &lhs, DN_Str16 const &rhs); -#endif - -// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -#define DN_STR8(string) DN_Str8{(char *)(string), (sizeof(string) - 1)} -#define DN_STR_FMT(string) (int)((string).size), (string).data -#define DN_Str8_Init(data, size) DN_Str8{(char *)(data), (size_t)(size)} - -DN_API DN_Str8 DN_Str8_InitCStr8 (char const *src); -#define DN_Str8_HasData(string) ((string).data && (string).size) -DN_API bool DN_Str8_IsAll (DN_Str8 string, DN_Str8IsAll is_all); - -DN_API DN_Str8 DN_Str8_InitF (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFV (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_Str8 DN_Str8_Alloc (DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_Copy (DN_Arena *arena, DN_Str8 string); - -DN_API char * DN_Str8_End (DN_Str8 string); -DN_API DN_Str8 DN_Str8_Slice (DN_Str8 string, DN_USize offset, DN_USize size); -DN_API DN_Str8 DN_Str8_Advance (DN_Str8 string, DN_USize amount); -DN_API DN_Str8 DN_Str8_NextLine (DN_Str8 string); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplit (DN_Str8 string, DN_Str8 find); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLast (DN_Str8 string, DN_Str8 find); -DN_API DN_USize DN_Str8_Split (DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits, DN_USize splits_count, DN_Str8SplitIncludeEmptyStrings mode); -DN_API DN_Slice DN_Str8_SplitAlloc (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); - -DN_API DN_Str8FindResult DN_Str8_FindStr8Array (DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case); -DN_API DN_Str8FindResult DN_Str8_FindStr8 (DN_Str8 string, DN_Str8 find, DN_Str8EqCase eq_case); -DN_API DN_Str8FindResult DN_Str8_Find (DN_Str8 string, uint32_t flags); -DN_API DN_Str8 DN_Str8_Segment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); -DN_API DN_Str8 DN_Str8_ReverseSegment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); - -DN_API bool DN_Str8_Eq (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_EqInsensitive (DN_Str8 lhs, DN_Str8 rhs); -DN_API bool DN_Str8_StartsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_StartsWithInsensitive (DN_Str8 string, DN_Str8 prefix); -DN_API bool DN_Str8_EndsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_EndsWithInsensitive (DN_Str8 string, DN_Str8 prefix); -DN_API bool DN_Str8_HasChar (DN_Str8 string, char ch); - -DN_API DN_Str8 DN_Str8_TrimPrefix (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API DN_Str8 DN_Str8_TrimHexPrefix (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimSuffix (DN_Str8 string, DN_Str8 suffix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API DN_Str8 DN_Str8_TrimAround (DN_Str8 string, DN_Str8 trim_string); -DN_API DN_Str8 DN_Str8_TrimHeadWhitespace (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimTailWhitespace (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimWhitespaceAround (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimByteOrderMark (DN_Str8 string); - -DN_API DN_Str8 DN_Str8_FileNameFromPath (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileNameNoExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FilePathNoExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileDirectoryFromPath (DN_Str8 path); - -DN_API DN_Str8ToU64Result DN_Str8_ToU64 (DN_Str8 string, char separator); -DN_API DN_Str8ToI64Result DN_Str8_ToI64 (DN_Str8 string, char separator); - -DN_API DN_Str8 DN_Str8_AppendF (DN_Arena *arena, DN_Str8 string, char const *fmt, ...); -DN_API DN_Str8 DN_Str8_AppendFV (DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args); - -DN_API DN_Str8 DN_Str8_FillF (DN_Arena *arena, DN_USize count, char const *fmt, ...); -DN_API DN_Str8 DN_Str8_FillFV (DN_Arena *arena, DN_USize count, char const *fmt, va_list args); - -DN_API void DN_Str8_Remove (DN_Str8 *string, DN_USize offset, DN_USize size); - -DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle (DN_Arena *arena, DN_Str8 str8, uint32_t side_size, DN_Str8 truncator); - -DN_API DN_Str8 DN_Str8_Lower (DN_Arena *arena, DN_Str8 string); -DN_API DN_Str8 DN_Str8_Upper (DN_Arena *arena, DN_Str8 string); - -#if defined(__cplusplus) -DN_API bool operator== (DN_Str8 const &lhs, DN_Str8 const &rhs); -DN_API bool operator!= (DN_Str8 const &lhs, DN_Str8 const &rhs); -#endif - -// NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_Init (DN_Arena *arena); -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRef (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopy (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); -template DN_Str8Builder DN_Str8Builder_InitCArrayRef (DN_Arena *arena, DN_Str8 const (&array)[N]); -template DN_Str8Builder DN_Str8Builder_InitCArrayCopy (DN_Arena *arena, DN_Str8 const (&array)[N]); - -DN_API bool DN_Str8Builder_AddArrayRef (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); -DN_API bool DN_Str8Builder_AddArrayCopy (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); -DN_API bool DN_Str8Builder_AddFV (DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args); - -#define DN_Str8Builder_AppendArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) -DN_API bool DN_Str8Builder_AppendRef (DN_Str8Builder *builder, DN_Str8 string); -DN_API bool DN_Str8Builder_AppendCopy (DN_Str8Builder *builder, DN_Str8 string); -#define DN_Str8Builder_AppendFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Append, fmt, args) -DN_API bool DN_Str8Builder_AppendF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); -DN_API bool DN_Str8Builder_AppendBytesRef (DN_Str8Builder *builder, void const *ptr, DN_USize size); -DN_API bool DN_Str8Builder_AppendBytesCopy (DN_Str8Builder *builder, void const *ptr, DN_USize size); -DN_API bool DN_Str8Builder_AppendBuilderRef (DN_Str8Builder *dest, DN_Str8Builder const *src); -DN_API bool DN_Str8Builder_AppendBuilderCopy (DN_Str8Builder *dest, DN_Str8Builder const *src); - -#define DN_Str8Builder_PrependArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) -DN_API bool DN_Str8Builder_PrependRef (DN_Str8Builder *builder, DN_Str8 string); -DN_API bool DN_Str8Builder_PrependCopy (DN_Str8Builder *builder, DN_Str8 string); -#define DN_Str8Builder_PrependFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Prepend, fmt, args) -DN_API bool DN_Str8Builder_PrependF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); - -DN_API bool DN_Str8Builder_Erase (DN_Str8Builder *builder, DN_Str8 string); -DN_API DN_Str8Builder DN_Str8Builder_Copy (DN_Arena *arena, DN_Str8Builder const *builder); -DN_API DN_Str8 DN_Str8Builder_Build (DN_Str8Builder const *builder, DN_Arena *arena); -DN_API DN_Str8 DN_Str8Builder_BuildDelimited (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena); -DN_API DN_Slice DN_Str8Builder_BuildSlice (DN_Str8Builder const *builder, DN_Arena *arena); - -// NOTE: DN_FStr8 ////////////////////////////////////////////////////////////////////////////////// -#if !defined(DN_NO_FSTR8) -template DN_FStr8 DN_FStr8_InitF (DN_FMT_ATTRIB char const *fmt, ...); -template DN_FStr8 DN_FStr8_InitFV (char const *fmt, va_list args); -template DN_USize DN_FStr8_Max (DN_FStr8 const *string); -template void DN_FStr8_Clear (DN_FStr8 *string); -template bool DN_FStr8_AddFV (DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, va_list va); -template bool DN_FStr8_AddF (DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, ...); -template bool DN_FStr8_AddCStr8 (DN_FStr8 *string, char const *value, DN_USize size); -template bool DN_FStr8_Add (DN_FStr8 *string, DN_Str8 value); -template DN_Str8 DN_FStr8_ToStr8 (DN_FStr8 const *string); -template bool DN_FStr8_Eq (DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqStr8 (DN_FStr8 const *lhs, DN_Str8 rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqInsensitive (DN_FStr8 const *lhs, DN_FStr8 const *rhs); -template bool DN_FStr8_EqStr8Insensitive (DN_FStr8 const *lhs, DN_Str8 rhs); -template bool DN_FStr8_EqFStr8 (DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqFStr8Insensitive (DN_FStr8 const *lhs, DN_FStr8 const *rhs); -template bool operator== (DN_FStr8 const &lhs, DN_FStr8 const &rhs); -template bool operator!= (DN_FStr8 const &lhs, DN_FStr8 const &rhs); -template bool operator== (DN_FStr8 const &lhs, DN_Str8 const &rhs); -template bool operator!= (DN_FStr8 const &lhs, DN_Str8 const &rhs); -#endif // !defined(DN_NO_FSTR8) - -// NOTE: DN_Char /////////////////////////////////////////////////////////////////////////////////// -struct DN_CharHexToU8 +struct DN_Str8x64 { - bool success; - uint8_t value; + char data[64]; + DN_USize size; }; -DN_API bool DN_Char_IsAlphabet (char ch); -DN_API bool DN_Char_IsDigit (char ch); -DN_API bool DN_Char_IsAlphaNum (char ch); -DN_API bool DN_Char_IsWhitespace (char ch); -DN_API bool DN_Char_IsHex (char ch); -DN_API DN_CharHexToU8 DN_Char_HexToU8 (char ch); -DN_API char DN_Char_ToHex (char ch); -DN_API char DN_Char_ToHexUnchecked (char ch); -DN_API char DN_Char_ToLower (char ch); -DN_API char DN_Char_ToUpper (char ch); - -// NOTE: DN_UTF //////////////////////////////////////////////////////////////////////////////////// -DN_API int DN_UTF8_EncodeCodepoint (uint8_t utf8[4], uint32_t codepoint); -DN_API int DN_UTF16_EncodeCodepoint (uint16_t utf16[2], uint32_t codepoint); - -// NOTE: DN_Str8Builder /////////////////////////////////////////////////////////////////////////// -template -DN_Str8Builder DN_Str8Builder_InitCArrayRef(DN_Arena *arena, DN_Str8 const (&array)[N]) +struct DN_Str8x256 { - DN_Str8Builder result = DN_Str8Builder_InitArrayRef(arena, array, N); - return result; -} + char data[256]; + DN_USize size; +}; -template -DN_Str8Builder DN_Str8Builder_InitCArrayCopy(DN_Arena *arena, DN_Str8 const (&array)[N]) -{ - DN_Str8Builder result = DN_Str8Builder_InitArrayCopy(arena, array, N); - return result; -} +DN_API DN_USize DN_CStr8_FSize (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_USize DN_CStr8_FVSize (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_USize DN_CStr8_Size (char const *a); +DN_API DN_USize DN_CStr16_Size (wchar_t const *a); -template -bool DN_Str8Builder_AddCArrayRef(DN_Str8Builder *builder, DN_Str8 const (&array)[N], DN_Str8BuilderAdd add) -{ - bool result = DN_Str8Builder_AddArrayRef(builder, array, N, add); - return result; -} +#define DN_STR16(string) DN_Str16{(wchar_t *)(string), sizeof(string)/sizeof(string[0]) - 1} +#define DN_Str16_HasData(string) ((string).data && (string).size) -template -bool DN_Str8Builder_AddCArrayCopy(DN_Str8Builder *builder, DN_Str8 const (&array)[N], DN_Str8BuilderAdd add) -{ - bool result = DN_Str8Builder_AddArrayCopy(builder, array, N, add); - return result; -} +#if defined(__cplusplus) +DN_API bool operator== (DN_Str16 const &lhs, DN_Str16 const &rhs); +DN_API bool operator!= (DN_Str16 const &lhs, DN_Str16 const &rhs); +#endif -#if !defined(DN_NO_FSTR8) -// NOTE: DN_FStr8 ////////////////////////////////////////////////////////////////////////////////// -template -DN_FStr8 DN_FStr8_InitF(DN_FMT_ATTRIB char const *fmt, ...) -{ - DN_FStr8 result = {}; - if (fmt) { - va_list args; - va_start(args, fmt); - DN_FStr8_AddFV(&result, fmt, args); - va_end(args); - } - return result; -} +#define DN_STR8(string) DN_Str8{(char *)(string), (sizeof(string) - 1)} +#define DN_STR_FMT(string) (int)((string).size), (string).data +#define DN_Str8_Init(data, size) DN_Str8{(char *)(data), (size_t)(size)} +#define DN_Str8_HasData(string) ((string).data && (string).size) +DN_API DN_Str8 DN_Str8_Alloc (DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromCStr8 (char const *src); +DN_API DN_Str8 DN_Str8_FromF (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFV (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromStr8 (DN_Arena *arena, DN_Str8 string); +DN_API bool DN_Str8_IsAll (DN_Str8 string, DN_Str8IsAll is_all); +DN_API char * DN_Str8_End (DN_Str8 string); +DN_API DN_Str8 DN_Str8_Slice (DN_Str8 string, DN_USize offset, DN_USize size); +DN_API DN_Str8 DN_Str8_Advance (DN_Str8 string, DN_USize amount); +DN_API DN_Str8 DN_Str8_NextLine (DN_Str8 string); +DN_API DN_Str8BSplitResult DN_Str8_BSplitArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); +DN_API DN_Str8BSplitResult DN_Str8_BSplit (DN_Str8 string, DN_Str8 find); +DN_API DN_Str8BSplitResult DN_Str8_BSplitLastArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); +DN_API DN_Str8BSplitResult DN_Str8_BSplitLast (DN_Str8 string, DN_Str8 find); +DN_API DN_USize DN_Str8_Split (DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits, DN_USize splits_count, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitAlloc (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Str8FindResult DN_Str8_FindStr8Array (DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case); +DN_API DN_Str8FindResult DN_Str8_FindStr8 (DN_Str8 string, DN_Str8 find, DN_Str8EqCase eq_case); +DN_API DN_Str8FindResult DN_Str8_Find (DN_Str8 string, uint32_t flags); +DN_API DN_Str8 DN_Str8_Segment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); +DN_API DN_Str8 DN_Str8_ReverseSegment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); +DN_API bool DN_Str8_Eq (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_EqInsensitive (DN_Str8 lhs, DN_Str8 rhs); +DN_API bool DN_Str8_StartsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_StartsWithInsensitive (DN_Str8 string, DN_Str8 prefix); +DN_API bool DN_Str8_EndsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_EndsWithInsensitive (DN_Str8 string, DN_Str8 prefix); +DN_API bool DN_Str8_HasChar (DN_Str8 string, char ch); +DN_API DN_Str8 DN_Str8_TrimPrefix (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API DN_Str8 DN_Str8_TrimHexPrefix (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimSuffix (DN_Str8 string, DN_Str8 suffix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API DN_Str8 DN_Str8_TrimAround (DN_Str8 string, DN_Str8 trim_string); +DN_API DN_Str8 DN_Str8_TrimHeadWhitespace (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimTailWhitespace (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimWhitespaceAround (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimByteOrderMark (DN_Str8 string); +DN_API DN_Str8 DN_Str8_FileNameFromPath (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileNameNoExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FilePathNoExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileDirectoryFromPath (DN_Str8 path); +DN_API DN_Str8ToU64Result DN_Str8_ToU64 (DN_Str8 string, char separator); +DN_API DN_Str8ToI64Result DN_Str8_ToI64 (DN_Str8 string, char separator); +DN_API DN_Str8 DN_Str8_AppendF (DN_Arena *arena, DN_Str8 string, char const *fmt, ...); +DN_API DN_Str8 DN_Str8_AppendFV (DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FillF (DN_Arena *arena, DN_USize count, char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FillFV (DN_Arena *arena, DN_USize count, char const *fmt, va_list args); +DN_API void DN_Str8_Remove (DN_Str8 *string, DN_USize offset, DN_USize size); +DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle (DN_Arena *arena, DN_Str8 str8, uint32_t side_size, DN_Str8 truncator); +DN_API DN_Str8 DN_Str8_Lower (DN_Arena *arena, DN_Str8 string); +DN_API DN_Str8 DN_Str8_Upper (DN_Arena *arena, DN_Str8 string); +#if defined(__cplusplus) +DN_API bool operator== (DN_Str8 const &lhs, DN_Str8 const &rhs); +DN_API bool operator!= (DN_Str8 const &lhs, DN_Str8 const &rhs); +#endif -template -DN_FStr8 DN_FStr8_InitFV(char const *fmt, va_list args) -{ - DN_FStr8 result = {}; - DN_FStr8_AddFV(&result, fmt, args); - return result; -} +DN_API DN_Str8 DN_LStr8_AppendF (char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, ...); +#define DN_IStr8_AppendF(struct_ptr, fmt, ...) DN_LStr8_AppendF((struct_ptr)->data, &(struct_ptr)->size, DN_ArrayCountU((struct_ptr)->data), fmt, ##__VA_ARGS__) +#define DN_Str8_FromIStr8(struct_ptr) DN_Str8_Init((struct_ptr)->data, (struct_ptr)->size) -template -DN_USize DN_FStr8_Max(DN_FStr8 const *) -{ - DN_USize result = N; - return result; -} -template -void DN_FStr8_Clear(DN_FStr8 *string) -{ - *string = {}; -} +DN_API DN_Str8Builder DN_Str8Builder_FromArena (DN_Arena *arena); +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRef (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopy (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); +DN_API DN_Str8Builder DN_Str8Builder_FromBuilder (DN_Arena *arena, DN_Str8Builder const *builder); +DN_API bool DN_Str8Builder_AddArrayRef (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); +DN_API bool DN_Str8Builder_AddArrayCopy (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); +DN_API bool DN_Str8Builder_AddFV (DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args); +#define DN_Str8Builder_AppendArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) +DN_API bool DN_Str8Builder_AppendRef (DN_Str8Builder *builder, DN_Str8 string); +DN_API bool DN_Str8Builder_AppendCopy (DN_Str8Builder *builder, DN_Str8 string); +#define DN_Str8Builder_AppendFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Append, fmt, args) +DN_API bool DN_Str8Builder_AppendF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); +DN_API bool DN_Str8Builder_AppendBytesRef (DN_Str8Builder *builder, void const *ptr, DN_USize size); +DN_API bool DN_Str8Builder_AppendBytesCopy (DN_Str8Builder *builder, void const *ptr, DN_USize size); +DN_API bool DN_Str8Builder_AppendBuilderRef (DN_Str8Builder *dest, DN_Str8Builder const *src); +DN_API bool DN_Str8Builder_AppendBuilderCopy (DN_Str8Builder *dest, DN_Str8Builder const *src); +#define DN_Str8Builder_PrependArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) +DN_API bool DN_Str8Builder_PrependRef (DN_Str8Builder *builder, DN_Str8 string); +DN_API bool DN_Str8Builder_PrependCopy (DN_Str8Builder *builder, DN_Str8 string); +#define DN_Str8Builder_PrependFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Prepend, fmt, args) +DN_API bool DN_Str8Builder_PrependF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); +DN_API bool DN_Str8Builder_Erase (DN_Str8Builder *builder, DN_Str8 string); +DN_API DN_Str8 DN_Str8Builder_Build (DN_Str8Builder const *builder, DN_Arena *arena); +DN_API DN_Str8 DN_Str8Builder_BuildDelimited (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena); +DN_API DN_Slice DN_Str8Builder_BuildSlice (DN_Str8Builder const *builder, DN_Arena *arena); -template -bool DN_FStr8_AddFV(DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, va_list args) -{ - bool result = false; - if (!string || !fmt) - return result; +DN_API bool DN_Char_IsAlphabet (char ch); +DN_API bool DN_Char_IsDigit (char ch); +DN_API bool DN_Char_IsAlphaNum (char ch); +DN_API bool DN_Char_IsWhitespace (char ch); +DN_API bool DN_Char_IsHex (char ch); +DN_API char DN_Char_ToHex (char ch); +DN_API char DN_Char_ToHexUnchecked (char ch); +DN_API char DN_Char_ToLower (char ch); +DN_API char DN_Char_ToUpper (char ch); - DN_USize require = DN_CStr8_FVSize(fmt, args) + 1 /*null_terminate*/; - DN_USize space = (N + 1) - string->size; - result = require <= space; - string->size += DN_VSNPrintF(string->data + string->size, DN_CAST(int) space, fmt, args); - - // NOTE: snprintf returns the required size of the format string - // irrespective of if there's space or not. - string->size = DN_Min(string->size, N); - return result; -} - -template -bool DN_FStr8_AddF(DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, ...) -{ - bool result = false; - if (!string || !fmt) - return result; - va_list args; - va_start(args, fmt); - result = DN_FStr8_AddFV(string, fmt, args); - va_end(args); - return result; -} - -template -bool DN_FStr8_AddCStr8(DN_FStr8 *string, char const *src, DN_USize size) -{ - DN_Assert(string->size <= N); - bool result = false; - if (!string || !src || size == 0 || string->size >= N) - return result; - - DN_USize space = N - string->size; - result = size <= space; - DN_Memcpy(string->data + string->size, src, DN_Min(space, size)); - string->size = DN_Min(string->size + size, N); - string->data[string->size] = 0; - return result; -} - -template -bool DN_FStr8_Add(DN_FStr8 *string, DN_Str8 src) -{ - bool result = DN_FStr8_AddCStr8(string, src.data, src.size); - return result; -} - -template -DN_Str8 DN_FStr8_ToStr8(DN_FStr8 const *string) -{ - DN_Str8 result = {}; - if (!string || string->size <= 0) - return result; - - result.data = DN_CAST(char *) string->data; - result.size = string->size; - return result; -} - -template -bool DN_FStr8_Eq(DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, eq_case); - return result; -} - -template -bool DN_FStr8_EqStr8(DN_FStr8 const *lhs, DN_Str8 rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - bool result = DN_Str8_Eq(lhs_s8, rhs, eq_case); - return result; -} - -template -bool DN_FStr8_EqInsensitive(DN_FStr8 const *lhs, DN_FStr8 const *rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool DN_FStr8_EqStr8Insensitive(DN_FStr8 const *lhs, DN_Str8 rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - bool result = DN_Str8_Eq(lhs_s8, rhs, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool DN_FStr8_EqFStr8(DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, eq_case); - return result; -} - -template -bool DN_FStr8_EqFStr8Insensitive(DN_FStr8 const *lhs, DN_FStr8 const *rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool operator==(DN_FStr8 const &lhs, DN_FStr8 const &rhs) -{ - bool result = DN_FStr8_Eq(&lhs, &rhs, DN_Str8EqCase_Sensitive); - return result; -} - -template -bool operator!=(DN_FStr8 const &lhs, DN_FStr8 const &rhs) -{ - bool result = !(lhs == rhs); - return result; -} - -template -bool operator==(DN_FStr8 const &lhs, DN_Str8 const &rhs) -{ - bool result = DN_Str8_Eq(DN_FStr8_ToStr8(&lhs), rhs, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool operator!=(DN_FStr8 const &lhs, DN_Str8 const &rhs) -{ - bool result = !(lhs == rhs); - return result; -} -#endif // !defined(DN_NO_FSTR8) +DN_API int DN_UTF8_EncodeCodepoint (uint8_t utf8[4], uint32_t codepoint); +DN_API int DN_UTF16_EncodeCodepoint (uint16_t utf16[2], uint32_t codepoint); #endif // !defined(DN_BASE_STRING_H) // DN: Single header generator inlined this file => #include "Base/dn_base_containers.h" #if !defined(DN_CONTAINERS_H) @@ -4091,37 +3827,46 @@ enum DN_CVTU64AgeUnit_ DN_CVTU64AgeUnit_All = DN_CVTU64AgeUnit_HMS | DN_CVTU64AgeUnit_Day | DN_CVTU64AgeUnit_Week | DN_CVTU64AgeUnit_Year, }; -DN_API int DN_CVT_FmtBuffer3DotTruncate (char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8 (DN_U64 val, char separator); -DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes (DN_U64 bytes, DN_CVTBytesType type); -#define DN_CVT_U64ToBytesAuto(bytes) DN_CVT_U64ToBytes(bytes, DN_CVTBytesType_Auto) -DN_API DN_Str8 DN_CVT_U64ToBytesStr8 (DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType type); -#define DN_CVT_U64ToBytesStr8Auto(arena, bytes) DN_CVT_U64ToBytesStr8(arena, bytes, DN_CVTBytesType_Auto) -#define DN_CVT_U64ToBytesStr8FromTLS(bytes, type) DN_CVT_U64ToBytesStr8(DN_OS_TLSTopArena(), bytes, type) -#define DN_CVT_U64ToBytesStr8AutoFromTLS(bytes) DN_CVT_U64ToBytesStr8(DN_OS_TLSTopArena(), bytes, DN_CVTBytesType_Auto) -#define DN_CVT_U64ToBytesStr8FromFrame(bytes, type) DN_CVT_U64ToBytesStr8(DN_OS_TLSFrameArena(), bytes, type) -#define DN_CVT_U64ToBytesStr8AutoFromFrame(bytes) DN_CVT_U64ToBytesStr8(DN_OS_TLSFrameArena(), bytes, DN_CVTBytesType_Auto) -DN_API DN_Str8 DN_CVT_BytesTypeToStr8 (DN_CVTBytesType type); -DN_API DN_Str8 DN_CVT_U64ToAge (DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit); -DN_API DN_Str8 DN_CVT_F64ToAge (DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit); +struct DN_NibbleFromU8Result +{ + char nibble0; + char nibble1; +}; -DN_API DN_U64 DN_CVT_HexToU64 (DN_Str8 hex); -DN_API DN_Str8 DN_CVT_U64ToHex (DN_Arena *arena, DN_U64 number, DN_CVTU64HexStrFlags flags); -#define DN_CVT_U64ToHexFromFrame(number, flags) DN_CVT_U64ToHex(DN_OS_TLSFrameArena(), number, flags) -DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr (DN_U64 number, DN_CVTU64HexStrFlags flags); +DN_API DN_NibbleFromU8Result DN_CVT_NibbleFromU8 (DN_U8 u8); +DN_API DN_U8 DN_CVT_U8FromHexNibble (char hex); -DN_API bool DN_CVT_BytesToHexPtr (void const *src, DN_USize src_size, char *dest, DN_USize dest_size); -DN_API DN_Str8 DN_CVT_BytesToHex (DN_Arena *arena, void const *src, DN_USize size); -#define DN_CVT_BytesToHexFromTLS(...) DN_CVT_BytesToHex(DN_OS_TLSTopArena(), __VA_ARGS__) -#define DN_CVT_BytesToHexFromFrame(...) DN_CVT_BytesToHex(DN_OS_TLSFrameArena(), __VA_ARGS__) +DN_API int DN_CVT_FmtBuffer3DotTruncate (char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_CVTU64Str8 DN_CVT_Str8FromU64 (DN_U64 val, char separator); +DN_API DN_CVTU64Bytes DN_CVT_BytesFromU64 (DN_U64 bytes, DN_CVTBytesType type); +#define DN_CVT_BytesFromU64Auto(bytes) DN_CVT_BytesFromU64(bytes, DN_CVTBytesType_Auto) +DN_API DN_Str8 DN_CVT_BytesStr8FromU64 (DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType type); +#define DN_CVT_BytesStr8FromU64Auto(arena, bytes) DN_CVT_BytesStr8FromU64(arena, bytes, DN_CVTBytesType_Auto) +#define DN_CVT_BytesStr8FromTLS(bytes, type) DN_CVT_BytesStr8FromU64(DN_OS_TLSTopArena(), bytes, type) +#define DN_CVT_BytesStr8FromU64AutoTLS(bytes) DN_CVT_BytesStr8FromU64(DN_OS_TLSTopArena(), bytes, DN_CVTBytesType_Auto) +#define DN_CVT_BytesStr8FromU64Frame(bytes, type) DN_CVT_BytesStr8FromU64(DN_OS_TLSFrameArena(), bytes, type) +#define DN_CVT_BytesStr8FromU64AutoFrame(bytes) DN_CVT_BytesStr8FromU64(DN_OS_TLSFrameArena(), bytes, DN_CVTBytesType_Auto) +DN_API DN_Str8 DN_CVT_BytesTypeToStr8 (DN_CVTBytesType type); +DN_API DN_Str8 DN_CVT_AgeFromU64 (DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit); +DN_API DN_Str8 DN_CVT_AgeFromF64 (DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit); -DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked (DN_Str8 hex, void *dest, DN_USize dest_size); -DN_API DN_USize DN_CVT_HexToBytesPtr (DN_Str8 hex, void *dest, DN_USize dest_size); -DN_API DN_Str8 DN_CVT_HexToBytesUnchecked (DN_Arena *arena, DN_Str8 hex); -#define DN_CVT_HexToBytesUncheckedFromTLS(...) DN_CVT_HexToBytesUnchecked(DN_OS_TLSTopArena(), __VA_ARGS__) -DN_API DN_Str8 DN_CVT_HexToBytes (DN_Arena *arena, DN_Str8 hex); -#define DN_CVT_HexToBytesFromFrame(...) DN_CVT_HexToBytes(DN_OS_TLSFrameArena(), __VA_ARGS__) -#define DN_CVT_HexToBytesFromTLS(...) DN_CVT_HexToBytes(DN_OS_TLSTopArena(), __VA_ARGS__) +DN_API DN_U64 DN_CVT_U64FromHex (DN_Str8 hex); +DN_API DN_Str8 DN_CVT_HexFromU64 (DN_Arena *arena, DN_U64 number, DN_CVTU64HexStrFlags flags); +#define DN_CVT_HexFromU64Frame(number, flags) DN_CVT_HexFromU64(DN_OS_TLSFrameArena(), number, flags) +DN_API DN_CVTU64HexStr DN_CVT_HexFromU64Str (DN_U64 number, DN_CVTU64HexStrFlags flags); + +DN_API bool DN_CVT_HexFromBytesPtr (void const *src, DN_USize src_size, char *dest, DN_USize dest_size); +DN_API DN_Str8 DN_CVT_HexFromBytes (DN_Arena *arena, void const *src, DN_USize size); +#define DN_CVT_HexFromBytesTLS(...) DN_CVT_HexFromBytes(DN_OS_TLSTopArena(), __VA_ARGS__) +#define DN_CVT_HexFromBytesFrame(...) DN_CVT_HexFromBytes(DN_OS_TLSFrameArena(), __VA_ARGS__) + +DN_API DN_USize DN_CVT_BytesFromHexPtrUnchecked (DN_Str8 hex, void *dest, DN_USize dest_size); +DN_API DN_USize DN_CVT_BytesFromHexPtr (DN_Str8 hex, void *dest, DN_USize dest_size); +DN_API DN_Str8 DN_CVT_BytesFromHexUnchecked (DN_Arena *arena, DN_Str8 hex); +#define DN_CVT_BytesFromHexUncheckedFromTLS(...) DN_CVT_BytesFromHexUnchecked(DN_OS_TLSTopArena(), __VA_ARGS__) +DN_API DN_Str8 DN_CVT_BytesFromHex (DN_Arena *arena, DN_Str8 hex); +#define DN_CVT_BytesFromHexFrame(...) DN_CVT_BytesFromHex(DN_OS_TLSFrameArena(), __VA_ARGS__) +#define DN_CVT_BytesFromHexTLS(...) DN_CVT_BytesFromHex(DN_OS_TLSTopArena(), __VA_ARGS__) #endif // defined(DN_BASE_CONVERT_H) #endif // !defined(DN_BASE_INC_H) @@ -5976,7 +5721,7 @@ typedef DN_I32(DN_OSThreadFunc)(struct DN_OSThread *); struct DN_OSThread { - DN_FStr8<64> name; + DN_Str8x64 name; DN_OSTLS tls; DN_OSTLSInitArgs tls_init_args; void *handle; @@ -6225,8 +5970,8 @@ DN_API DN_OSHttpResponse DN_OS_HttpRequest (DN_Arena *arena, DN_Str8 #if !defined(DN_OS_ALLOCATOR_H) #define DN_OS_ALLOCATOR_H -DN_API DN_Arena DN_Arena_InitFromOSHeap(DN_U64 size, DN_ArenaFlags flags); -DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromOSHeap(DN_U64 size, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags); #endif // !defined(DN_OS_ALLOCATOR_H) // DN: Single header generator inlined this file => #include "OS/dn_os_containers.h" @@ -6341,24 +6086,24 @@ DN_API void DN_OS_PrintLnFVStyle (DN_OSPrintDest dest, DN_LOGStyle style, #if !defined(DN_OS_STRING_H) #define DN_OS_STRING_H +// DN: Single header generator commented out this header => #include "../dn_base_inc.h" +// DN: Single header generator commented out this header => #include "../dn_os_inc.h" + // NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8 DN_Str8_InitFFromFrame (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFFromOSHeap (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFFromTLS (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFrameFV (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromFrameF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFrame (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromHeapF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromHeap (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromTLSFV (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromTLSF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromTLS (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromStr8Frame (DN_Str8 string); +DN_API DN_Str8 DN_Str8_FromStr8TLS (DN_Str8 string); -DN_API DN_Str8 DN_Str8_InitFVFromFrame (DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_Str8 DN_Str8_InitFVFromTLS (DN_FMT_ATTRIB char const *fmt, va_list args); - -DN_API DN_Str8 DN_Str8_AllocFromFrame (DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_AllocFromOSHeap (DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_AllocFromTLS (DN_USize size, DN_ZeroMem zero_mem); - -DN_API DN_Str8 DN_Str8_CopyFromFrame (DN_Arena *arena, DN_Str8 string); -DN_API DN_Str8 DN_Str8_CopyFromTLS (DN_Arena *arena, DN_Str8 string); - -DN_API DN_Slice DN_Str8_SplitAllocFromFrame (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); -DN_API DN_Slice DN_Str8_SplitAllocFromTLS (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitFromFrame (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitFromTLS (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); DN_API DN_Str8 DN_Str8_SegmentFromFrame (DN_Str8 src, DN_USize segment_size, char segment_char); DN_API DN_Str8 DN_Str8_SegmentFromTLS (DN_Str8 src, DN_USize segment_size, char segment_char); @@ -6390,19 +6135,19 @@ DN_API DN_Str8 DN_Str8_ReplaceInsensitive (DN_Str8 s // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_InitFromFrame () { return DN_Str8Builder_Init(DN_OS_TLSGet()->frame_arena); } -DN_API DN_Str8Builder DN_Str8Builder_InitFromTLS () { return DN_Str8Builder_Init(DN_OS_TLSTopArena()); } +DN_API DN_Str8Builder DN_Str8Builder_FromArena () { return DN_Str8Builder_FromArena(DN_OS_TLSGet()->frame_arena); } +DN_API DN_Str8Builder DN_Str8Builder_FromTLS () { return DN_Str8Builder_FromArena(DN_OS_TLSTopArena()); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRefFromFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayRef(DN_OS_TLSGet()->frame_arena, strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRefFromTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayRef(DN_OS_TLSTopArena(), strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopyFromFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayCopy(DN_OS_TLSGet()->frame_arena, strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopyFromTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayCopy(DN_OS_TLSTopArena(), strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRefFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrRef(DN_OS_TLSGet()->frame_arena, strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRefTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrRef(DN_OS_TLSTopArena(), strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopyFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrCopy(DN_OS_TLSGet()->frame_arena, strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopyTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrCopy(DN_OS_TLSTopArena(), strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_CopyFromFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_Copy(DN_OS_TLSGet()->frame_arena, builder); } -DN_API DN_Str8Builder DN_Str8Builder_CopyFromTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_Copy(DN_OS_TLSTopArena(), builder); } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilderFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_FromBuilder(DN_OS_TLSGet()->frame_arena, builder); } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilderTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_FromBuilder(DN_OS_TLSTopArena(), builder); } DN_API DN_Str8 DN_Str8Builder_BuildFromFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_Build(builder, DN_OS_TLSGet()->frame_arena); } -DN_API DN_Str8 DN_Str8Builder_BuildFromOSHeap (DN_Str8Builder const *builder, DN_Arena *arena); +DN_API DN_Str8 DN_Str8Builder_BuildFromHeap (DN_Str8Builder const *builder, DN_Arena *arena); DN_API DN_Str8 DN_Str8Builder_BuildFromTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_Build(builder, DN_OS_TLSTopArena()); } DN_API DN_Str8 DN_Str8Builder_BuildDelimitedFromFrame(DN_Str8Builder const *builder, DN_Str8 delimiter) { return DN_Str8Builder_BuildDelimited(builder, delimiter, DN_OS_TLSGet()->frame_arena); } @@ -6687,8 +6432,8 @@ struct DN_RaycastLineIntersectV2Result // NOTE: DN_V2 ///////////////////////////////////////////////////////////////////////////////////// #define DN_V2I32_Zero DN_LITERAL(DN_V2I32){{(int32_t)(0), (int32_t)(0)}} #define DN_V2I32_One DN_LITERAL(DN_V2I32){{(int32_t)(1), (int32_t)(1)}} -#define DN_V2I32_Init1N(x) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(x)}} -#define DN_V2I32_Init2N(x, y) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(y)}} +#define DN_V2I32_From1N(x) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(x)}} +#define DN_V2I32_From2N(x, y) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(y)}} #define DN_V2I32_InitV2(xy) DN_LITERAL(DN_V2I32){{(int32_t)(xy).x, (int32_t)(xy).y}} DN_API bool operator!= (DN_V2I32 lhs, DN_V2I32 rhs); @@ -6721,8 +6466,8 @@ DN_API DN_V2I32 DN_V2I32_Abs (DN_V2I32 a); #define DN_V2U16_Zero DN_LITERAL(DN_V2U16){{(uint16_t)(0), (uint16_t)(0)}} #define DN_V2U16_One DN_LITERAL(DN_V2U16){{(uint16_t)(1), (uint16_t)(1)}} -#define DN_V2U16_Init1N(x) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(x)}} -#define DN_V2U16_Init2N(x, y) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(y)}} +#define DN_V2U16_From1N(x) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(x)}} +#define DN_V2U16_From2N(x, y) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(y)}} DN_API bool operator!= (DN_V2U16 lhs, DN_V2U16 rhs); DN_API bool operator== (DN_V2U16 lhs, DN_V2U16 rhs); @@ -6749,9 +6494,9 @@ DN_API DN_V2U16 & operator+= (DN_V2U16& lhs, #define DN_V2F32_Zero DN_LITERAL(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}} #define DN_V2F32_One DN_LITERAL(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}} -#define DN_V2F32_Init1N(x) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(x)}} -#define DN_V2F32_Init2N(x, y) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(y)}} -#define DN_V2F32_InitV2I32(xy) DN_LITERAL(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}} +#define DN_V2F32_From1N(x) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(x)}} +#define DN_V2F32_From2N(x, y) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(y)}} +#define DN_V2F32_FromV2I32(xy) DN_LITERAL(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}} DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs); DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs); @@ -6805,8 +6550,9 @@ DN_API DN_V2F32 DN_V2F32_Min (DN_V2F32 a, DN DN_API DN_V2F32 DN_V2F32_Max (DN_V2F32 a, DN_V2F32 b); DN_API DN_V2F32 DN_V2F32_Abs (DN_V2F32 a); DN_API DN_F32 DN_V2F32_Dot (DN_V2F32 a, DN_V2F32 b); -DN_API DN_F32 DN_V2F32_LengthSq_V2x2 (DN_V2F32 lhs, DN_V2F32 rhs); -DN_API DN_F32 DN_V2F32_Length_V2x2 (DN_V2F32 lhs, DN_V2F32 rhs); +DN_API DN_F32 DN_V2F32_LengthSq2V2 (DN_V2F32 lhs, DN_V2F32 rhs); +DN_API bool DN_V2F32_LengthSqIsWithin2V2 (DN_V2F32 lhs, DN_V2F32 rhs, DN_F32 within_amount_sq); +DN_API DN_F32 DN_V2F32_Length2V2 (DN_V2F32 lhs, DN_V2F32 rhs); DN_API DN_F32 DN_V2F32_LengthSq (DN_V2F32 lhs); DN_API DN_F32 DN_V2F32_Length (DN_V2F32 lhs); DN_API DN_V2F32 DN_V2F32_Normalise (DN_V2F32 a); @@ -6816,9 +6562,9 @@ DN_API DN_F32 DN_V2F32_Area (DN_V2F32 a); #endif // !defined(DN_NO_V2) #if !defined(DN_NO_V3) // NOTE: DN_V3 ///////////////////////////////////////////////////////////////////////////////////// -#define DN_V3F32_Init1N(x) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}} -#define DN_V3F32_Init3F32(x, y, z) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z)}} -#define DN_V3F32_InitV2F32_1F32(xy, z) DN_LITERAL(DN_V3F32){{(DN_F32)(xy.x), (DN_F32)(xy.y), (DN_F32)(z)}} +#define DN_V3F32_From1N(x) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}} +#define DN_V3F32_From3N(x, y, z) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z)}} +#define DN_V3F32_FromV2F32And1N(xy, z) DN_LITERAL(DN_V3F32){{(DN_F32)(xy.x), (DN_F32)(xy.y), (DN_F32)(z)}} DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs); DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs); @@ -6848,10 +6594,20 @@ DN_API DN_F32 DN_V3F32_Length (DN_V3F32 a); DN_API DN_V3F32 DN_V3F32_Normalise (DN_V3F32 a); #endif // !defined(DN_NO_V3) #if !defined(DN_NO_V4) +DN_U32 const DN_V4_R_MASK_U32 = 0xFF000000; +DN_U32 const DN_V4_G_MASK_U32 = 0x00FF0000; +DN_U32 const DN_V4_B_MASK_U32 = 0x0000FF00; +DN_U32 const DN_V4_A_MASK_U32 = 0x000000FF; + // NOTE: DN_V4 ///////////////////////////////////////////////////////////////////////////////////// -#define DN_V4F32_Init1N(x) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}} -#define DN_V4F32_Init4N(x, y, z, w) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z), (DN_F32)(w)}} -#define DN_V4F32_InitV3_1N(xyz, w) DN_LITERAL(DN_V4F32){{xyz.x, xyz.y, xyz.z, w}} +#define DN_V4F32_From1N(x) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}} +#define DN_V4F32_From4N(x, y, z, w) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z), (DN_F32)(w)}} +#define DN_V4F32_FromV3And1N(xyz, w) DN_LITERAL(DN_V4F32){{xyz.x, xyz.y, xyz.z, w}} +#define DN_V4F32_FromRGBAU8(r, g, b, a) DN_LITERAL(DN_V4F32){{r / 255.f, g / 255.f, b / 255.f, a / 255.f}} +#define DN_V4F32_FromRGBU8(r, g, b) DN_LITERAL(DN_V4F32){{r / 255.f, g / 255.f, b / 255.f, 1.f}} +DN_API DN_V4F32 DN_V4F32_FromRGBU32(DN_U32 u32); +DN_API DN_V4F32 DN_V4F32_FromRGBAU32(DN_U32 u32); +#define DN_V4F32_FromV4Alpha(v4, alpha) DN_V4F32_FromV3And1N(v4.xyz, alpha) DN_API bool operator== (DN_V4F32 lhs, DN_V4F32 rhs); DN_API bool operator!= (DN_V4F32 lhs, DN_V4F32 rhs); DN_API bool operator<= (DN_V4F32 lhs, DN_V4F32 rhs); @@ -6869,10 +6625,10 @@ DN_API DN_V4F32 & operator*= (DN_V4F32 &lhs, DN_API DN_V4F32 & operator*= (DN_V4F32 &lhs, int32_t rhs); DN_API DN_V4F32 & operator-= (DN_V4F32 &lhs, DN_V4F32 rhs); DN_API DN_V4F32 & operator+= (DN_V4F32 &lhs, DN_V4F32 rhs); +DN_API DN_F32 DN_V4F32_Dot (DN_V4F32 a, DN_V4F32 b); #endif // !defined(DN_NO_V4) #if !defined(DN_NO_M4) // NOTE: DN_M4 ///////////////////////////////////////////////////////////////////////////////////// -DN_API DN_F32 DN_V4F32Dot (DN_V4F32 a, DN_V4F32 b); DN_API DN_M4 DN_M4_Identity (); DN_API DN_M4 DN_M4_ScaleF (DN_F32 x, DN_F32 y, DN_F32 z); DN_API DN_M4 DN_M4_Scale (DN_V3F32 xyz); @@ -6890,9 +6646,7 @@ DN_API DN_M4 DN_M4_AddF (DN_M4 lhs, DN_ DN_API DN_M4 DN_M4_SubF (DN_M4 lhs, DN_F32 rhs); DN_API DN_M4 DN_M4_MulF (DN_M4 lhs, DN_F32 rhs); DN_API DN_M4 DN_M4_DivF (DN_M4 lhs, DN_F32 rhs); -#if !defined(DN_NO_FSTR8) -DN_API DN_FStr8<256> DN_M4_ColumnMajorString (DN_M4 mat); -#endif +DN_API DN_Str8x256 DN_M4_ColumnMajorString (DN_M4 mat); #endif // !defined(DN_NO_M4) // NOTE: DN_M2x3 /////////////////////////////////////////////////////////////////////////////////// DN_API bool operator== (DN_M2x3 const &lhs, DN_M2x3 const &rhs); @@ -6906,8 +6660,8 @@ DN_API DN_V2F32 DN_M2x3_Mul2F32 (DN_M2x3 m1, DN DN_API DN_V2F32 DN_M2x3_MulV2 (DN_M2x3 m1, DN_V2F32 v2); #if !defined(DN_NO_RECT) // NOTE: DN_Rect /////////////////////////////////////////////////////////////////////////////////// -#define DN_Rect_Init2V2(pos, size) DN_LITERAL(DN_Rect){(pos), (size)} -#define DN_Rect_Init4N(x, y, w, h) DN_LITERAL(DN_Rect){DN_LITERAL(DN_V2F32){{x, y}}, DN_LITERAL(DN_V2F32){{w, h}}} +#define DN_Rect_From2V2(pos, size) DN_LITERAL(DN_Rect){(pos), (size)} +#define DN_Rect_From4N(x, y, w, h) DN_LITERAL(DN_Rect){DN_LITERAL(DN_V2F32){{x, y}}, DN_LITERAL(DN_V2F32){{w, h}}} DN_API bool operator== (const DN_Rect& lhs, const DN_Rect& rhs); DN_API DN_V2F32 DN_Rect_Center (DN_Rect rect); @@ -7045,7 +6799,6 @@ DN_API void DN_BinPack_V4 (DN_BinPack *pack, DN_API void DN_BinPack_Bool (DN_BinPack *pack, DN_BinPackMode mode, bool *item); DN_API void DN_BinPack_Str8FromArena (DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, DN_Str8 *string); DN_API void DN_BinPack_Str8FromPool (DN_BinPack *pack, DN_Pool *pool, DN_BinPackMode mode, DN_Str8 *string); -template DN_API void DN_BinPack_FStr8 (DN_BinPack *pack, DN_BinPackMode mode, DN_FStr8 *string); DN_API void DN_BinPack_BytesFromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, void **ptr, DN_USize *size); DN_API void DN_BinPack_BytesFromPool (DN_BinPack *pack, DN_Pool *pool, DN_BinPackMode mode, void **ptr, DN_USize *size); DN_API void DN_BinPack_CArray (DN_BinPack *pack, DN_BinPackMode mode, void *ptr, DN_USize size); diff --git a/Source/Base/dn_base_containers.cpp b/Source/Base/dn_base_containers.cpp index ee8a5a7..87e5ae7 100644 --- a/Source/Base/dn_base_containers.cpp +++ b/Source/Base/dn_base_containers.cpp @@ -691,7 +691,7 @@ DN_DSMap DN_DSMap_Init(DN_Arena *arena, DN_U32 size, DN_DSMapFlags flags) if (!DN_Check(arena)) return result; result.arena = arena; - result.pool = DN_Pool_Init(arena, DN_POOL_DEFAULT_ALIGN); + result.pool = DN_Pool_FromArena(arena, DN_POOL_DEFAULT_ALIGN); result.hash_to_slot = DN_Arena_NewArray(result.arena, DN_U32, size, DN_ZeroMem_Yes); result.slots = DN_Arena_NewArray(result.arena, DN_DSMapSlot, size, DN_ZeroMem_Yes); result.occupied = 1; // For sentinel diff --git a/Source/Base/dn_base_convert.cpp b/Source/Base/dn_base_convert.cpp index ebec28d..05de7d4 100644 --- a/Source/Base/dn_base_convert.cpp +++ b/Source/Base/dn_base_convert.cpp @@ -1,5 +1,33 @@ #define DN_CONVERT_CPP +#include "../dn_base_inc.h" + +DN_API DN_NibbleFromU8Result DN_CVT_NibbleFromU8(DN_U8 u8) +{ + static char const *table = "0123456789abcdef"; + DN_U8 lhs = (u8 >> 0) & 0xF; + DN_U8 rhs = (u8 >> 4) & 0xF; + DN_NibbleFromU8Result result = {}; + result.nibble0 = table[rhs]; + result.nibble1 = table[lhs]; + return result; +} + +DN_API DN_U8 DN_CVT_U8FromHexNibble(char hex) +{ + bool digit = hex >= '0' && hex <= '9'; + bool upper = hex >= 'A' && hex <= 'F'; + bool lower = hex >= 'a' && hex <= 'f'; + DN_U8 result = 0xFF; + if (digit) + result = hex - '0'; + if (upper) + result = hex - 'A' + 10; + if (lower) + result = hex - 'a' + 10; + return result; +} + DN_API int DN_CVT_FmtBuffer3DotTruncate(char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...) { va_list args; @@ -14,7 +42,7 @@ DN_API int DN_CVT_FmtBuffer3DotTruncate(char *buffer, int size, DN_FMT_ATTRIB ch return result; } -DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8(DN_U64 val, char separator) +DN_API DN_CVTU64Str8 DN_CVT_Str8FromU64(DN_U64 val, char separator) { DN_CVTU64Str8 result = {}; if (val == 0) { @@ -47,7 +75,7 @@ DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8(DN_U64 val, char separator) return result; } -DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes(DN_U64 bytes, DN_CVTBytesType type) +DN_API DN_CVTU64Bytes DN_CVT_BytesFromU64(DN_U64 bytes, DN_CVTBytesType type) { DN_Assert(type != DN_CVTBytesType_Count); DN_CVTU64Bytes result = {}; @@ -64,10 +92,10 @@ DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes(DN_U64 bytes, DN_CVTBytesType type) return result; } -DN_API DN_Str8 DN_CVT_U64ToBytesStr8(DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType desired_type) +DN_API DN_Str8 DN_CVT_BytesStr8FromU64(DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType desired_type) { - DN_CVTU64Bytes byte_size = DN_CVT_U64ToBytes(bytes, desired_type); - DN_Str8 result = DN_Str8_InitF(arena, "%.2f%.*s", byte_size.bytes, DN_STR_FMT(byte_size.suffix)); + DN_CVTU64Bytes byte_size = DN_CVT_BytesFromU64(bytes, desired_type); + DN_Str8 result = DN_Str8_FromF(arena, "%.2f%.*s", byte_size.bytes, DN_STR_FMT(byte_size.suffix)); return result; } @@ -86,15 +114,15 @@ DN_API DN_Str8 DN_CVT_BytesTypeToStr8(DN_CVTBytesType type) return result; } -DN_API DN_Str8 DN_CVT_U64ToAge(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit) +DN_API DN_Str8 DN_CVT_AgeFromU64(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit) { DN_Str8 result = {}; if (!arena) return result; char buffer[512]; - DN_Arena stack_arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); - DN_Str8Builder builder = DN_Str8Builder_Init(&stack_arena); + DN_Arena stack_arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&stack_arena); DN_U64 remainder = age_s; if (unit & DN_CVTU64AgeUnit_Year) { @@ -142,15 +170,15 @@ DN_API DN_Str8 DN_CVT_U64ToAge(DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit u return result; } -DN_API DN_Str8 DN_CVT_F64ToAge(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit) +DN_API DN_Str8 DN_CVT_AgeFromF64(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit) { DN_Str8 result = {}; if (!arena) return result; char buffer[256]; - DN_Arena stack_arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); - DN_Str8Builder builder = DN_Str8Builder_Init(&stack_arena); + DN_Arena stack_arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_NoPoison); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&stack_arena); DN_F64 remainder = age_s; if (unit & DN_CVTU64AgeUnit_Year) { @@ -202,7 +230,7 @@ DN_API DN_Str8 DN_CVT_F64ToAge(DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit u return result; } -DN_API DN_U64 DN_CVT_HexToU64(DN_Str8 hex) +DN_API DN_U64 DN_CVT_U64FromHex(DN_Str8 hex) { DN_Str8 real_hex = DN_Str8_TrimPrefix(DN_Str8_TrimPrefix(hex, DN_STR8("0x")), DN_STR8("0X")); DN_USize max_hex_size = sizeof(DN_U64) * 2 /*hex chars per byte*/; @@ -211,16 +239,16 @@ DN_API DN_U64 DN_CVT_HexToU64(DN_Str8 hex) DN_USize size = DN_Min(max_hex_size, real_hex.size); DN_U64 result = 0; for (DN_USize index = 0; index < size; index++) { - char ch = real_hex.data[index]; - DN_CharHexToU8 val = DN_Char_HexToU8(ch); - if (!val.success) + char ch = real_hex.data[index]; + DN_U8 val = DN_CVT_U8FromHexNibble(ch); + if (val == 0xFF) break; - result = (result << 4) | val.value; + result = (result << 4) | val; } return result; } -DN_API DN_Str8 DN_CVT_U64ToHex(DN_Arena *arena, DN_U64 number, uint32_t flags) +DN_API DN_Str8 DN_CVT_HexFromU64(DN_Arena *arena, DN_U64 number, uint32_t flags) { DN_Str8 prefix = {}; if ((flags & DN_CVTU64HexStrFlags_0xPrefix)) @@ -238,7 +266,7 @@ DN_API DN_Str8 DN_CVT_U64ToHex(DN_Arena *arena, DN_U64 number, uint32_t flags) return result; } -DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr8(DN_U64 number, DN_CVTU64HexStrFlags flags) +DN_API DN_CVTU64HexStr DN_CVT_HexFromU64Str8(DN_U64 number, DN_CVTU64HexStrFlags flags) { DN_Str8 prefix = {}; if (flags & DN_CVTU64HexStrFlags_0xPrefix) @@ -260,7 +288,7 @@ DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr8(DN_U64 number, DN_CVTU64HexStrFlags f return result; } -DN_API bool DN_CVT_BytesToHexPtr(void const *src, DN_USize src_size, char *dest, DN_USize dest_size) +DN_API bool DN_CVT_HexFromBytesPtr(void const *src, DN_USize src_size, char *dest, DN_USize dest_size) { if (!src || !dest) return false; @@ -281,7 +309,7 @@ DN_API bool DN_CVT_BytesToHexPtr(void const *src, DN_USize src_size, char *dest, return true; } -DN_API DN_Str8 DN_CVT_BytesToHex(DN_Arena *arena, void const *src, DN_USize size) +DN_API DN_Str8 DN_CVT_HexFromBytes(DN_Arena *arena, void const *src, DN_USize size) { DN_Str8 result = {}; if (!src || size <= 0) @@ -289,12 +317,12 @@ DN_API DN_Str8 DN_CVT_BytesToHex(DN_Arena *arena, void const *src, DN_USize size result = DN_Str8_Alloc(arena, size * 2, DN_ZeroMem_No); result.data[result.size] = 0; - bool converted = DN_CVT_BytesToHexPtr(src, size, result.data, result.size); + bool converted = DN_CVT_HexFromBytesPtr(src, size, result.data, result.size); DN_Assert(converted); return result; } -DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize dest_size) +DN_API DN_USize DN_CVT_BytesFromHexPtrUnchecked(DN_Str8 hex, void *dest, DN_USize dest_size) { DN_USize result = 0; unsigned char *dest_u8 = DN_CAST(unsigned char *) dest; @@ -302,8 +330,8 @@ DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize for (DN_USize hex_index = 0; hex_index < hex.size; hex_index += 2, result += 1) { char hex01 = hex.data[hex_index]; char hex02 = (hex_index + 1 < hex.size) ? hex.data[hex_index + 1] : 0; - char bit4_01 = DN_Char_HexToU8(hex01).value; - char bit4_02 = DN_Char_HexToU8(hex02).value; + char bit4_01 = DN_CVT_U8FromHexNibble(hex01); + char bit4_02 = DN_CVT_U8FromHexNibble(hex02); char byte = (bit4_01 << 4) | (bit4_02 << 0); dest_u8[result] = byte; } @@ -312,7 +340,7 @@ DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked(DN_Str8 hex, void *dest, DN_USize return result; } -DN_API DN_USize DN_CVT_HexToBytesPtr(DN_Str8 hex, void *dest, DN_USize dest_size) +DN_API DN_USize DN_CVT_BytesFromHexPtr(DN_Str8 hex, void *dest, DN_USize dest_size) { hex = DN_Str8_TrimPrefix(hex, DN_STR8("0x")); hex = DN_Str8_TrimPrefix(hex, DN_STR8("0X")); @@ -329,22 +357,22 @@ DN_API DN_USize DN_CVT_HexToBytesPtr(DN_Str8 hex, void *dest, DN_USize dest_size if (hex.size <= 0 || !DN_Check(dest_size >= min_buffer_size)) return result; - result = DN_CVT_HexToBytesPtrUnchecked(hex, dest, dest_size); + result = DN_CVT_BytesFromHexPtrUnchecked(hex, dest, dest_size); return result; } -DN_API DN_Str8 DN_CVT_HexToBytesUnchecked(DN_Arena *arena, DN_Str8 hex) +DN_API DN_Str8 DN_CVT_BytesFromHexUnchecked(DN_Arena *arena, DN_Str8 hex) { DN_USize hex_size_rounded_up = hex.size + (hex.size % 2); DN_Str8 result = DN_Str8_Alloc(arena, (hex_size_rounded_up / 2), DN_ZeroMem_No); if (result.data) { - DN_USize bytes_written = DN_CVT_HexToBytesPtr(hex, result.data, result.size); + DN_USize bytes_written = DN_CVT_BytesFromHexPtr(hex, result.data, result.size); DN_Assert(bytes_written == result.size); } return result; } -DN_API DN_Str8 DN_CVT_HexToBytes(DN_Arena *arena, DN_Str8 hex) +DN_API DN_Str8 DN_CVT_BytesFromHex(DN_Arena *arena, DN_Str8 hex) { hex = DN_Str8_TrimPrefix(hex, DN_STR8("0x")); hex = DN_Str8_TrimPrefix(hex, DN_STR8("0X")); @@ -356,6 +384,6 @@ DN_API DN_Str8 DN_CVT_HexToBytes(DN_Arena *arena, DN_Str8 hex) if (!DN_Check(DN_Str8_IsAll(hex, DN_Str8IsAll_Hex))) return result; - result = DN_CVT_HexToBytesUnchecked(arena, hex); + result = DN_CVT_BytesFromHexUnchecked(arena, hex); return result; } diff --git a/Source/Base/dn_base_convert.h b/Source/Base/dn_base_convert.h index a9c4d71..16ea878 100644 --- a/Source/Base/dn_base_convert.h +++ b/Source/Base/dn_base_convert.h @@ -54,35 +54,44 @@ enum DN_CVTU64AgeUnit_ DN_CVTU64AgeUnit_All = DN_CVTU64AgeUnit_HMS | DN_CVTU64AgeUnit_Day | DN_CVTU64AgeUnit_Week | DN_CVTU64AgeUnit_Year, }; -DN_API int DN_CVT_FmtBuffer3DotTruncate (char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_CVTU64Str8 DN_CVT_U64ToStr8 (DN_U64 val, char separator); -DN_API DN_CVTU64Bytes DN_CVT_U64ToBytes (DN_U64 bytes, DN_CVTBytesType type); -#define DN_CVT_U64ToBytesAuto(bytes) DN_CVT_U64ToBytes(bytes, DN_CVTBytesType_Auto) -DN_API DN_Str8 DN_CVT_U64ToBytesStr8 (DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType type); -#define DN_CVT_U64ToBytesStr8Auto(arena, bytes) DN_CVT_U64ToBytesStr8(arena, bytes, DN_CVTBytesType_Auto) -#define DN_CVT_U64ToBytesStr8FromTLS(bytes, type) DN_CVT_U64ToBytesStr8(DN_OS_TLSTopArena(), bytes, type) -#define DN_CVT_U64ToBytesStr8AutoFromTLS(bytes) DN_CVT_U64ToBytesStr8(DN_OS_TLSTopArena(), bytes, DN_CVTBytesType_Auto) -#define DN_CVT_U64ToBytesStr8FromFrame(bytes, type) DN_CVT_U64ToBytesStr8(DN_OS_TLSFrameArena(), bytes, type) -#define DN_CVT_U64ToBytesStr8AutoFromFrame(bytes) DN_CVT_U64ToBytesStr8(DN_OS_TLSFrameArena(), bytes, DN_CVTBytesType_Auto) -DN_API DN_Str8 DN_CVT_BytesTypeToStr8 (DN_CVTBytesType type); -DN_API DN_Str8 DN_CVT_U64ToAge (DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit); -DN_API DN_Str8 DN_CVT_F64ToAge (DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit); +struct DN_NibbleFromU8Result +{ + char nibble0; + char nibble1; +}; -DN_API DN_U64 DN_CVT_HexToU64 (DN_Str8 hex); -DN_API DN_Str8 DN_CVT_U64ToHex (DN_Arena *arena, DN_U64 number, DN_CVTU64HexStrFlags flags); -#define DN_CVT_U64ToHexFromFrame(number, flags) DN_CVT_U64ToHex(DN_OS_TLSFrameArena(), number, flags) -DN_API DN_CVTU64HexStr DN_CVT_U64ToHexStr (DN_U64 number, DN_CVTU64HexStrFlags flags); +DN_API DN_NibbleFromU8Result DN_CVT_NibbleFromU8 (DN_U8 u8); +DN_API DN_U8 DN_CVT_U8FromHexNibble (char hex); -DN_API bool DN_CVT_BytesToHexPtr (void const *src, DN_USize src_size, char *dest, DN_USize dest_size); -DN_API DN_Str8 DN_CVT_BytesToHex (DN_Arena *arena, void const *src, DN_USize size); -#define DN_CVT_BytesToHexFromTLS(...) DN_CVT_BytesToHex(DN_OS_TLSTopArena(), __VA_ARGS__) -#define DN_CVT_BytesToHexFromFrame(...) DN_CVT_BytesToHex(DN_OS_TLSFrameArena(), __VA_ARGS__) +DN_API int DN_CVT_FmtBuffer3DotTruncate (char *buffer, int size, DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_CVTU64Str8 DN_CVT_Str8FromU64 (DN_U64 val, char separator); +DN_API DN_CVTU64Bytes DN_CVT_BytesFromU64 (DN_U64 bytes, DN_CVTBytesType type); +#define DN_CVT_BytesFromU64Auto(bytes) DN_CVT_BytesFromU64(bytes, DN_CVTBytesType_Auto) +DN_API DN_Str8 DN_CVT_BytesStr8FromU64 (DN_Arena *arena, DN_U64 bytes, DN_CVTBytesType type); +#define DN_CVT_BytesStr8FromU64Auto(arena, bytes) DN_CVT_BytesStr8FromU64(arena, bytes, DN_CVTBytesType_Auto) +#define DN_CVT_BytesStr8FromTLS(bytes, type) DN_CVT_BytesStr8FromU64(DN_OS_TLSTopArena(), bytes, type) +#define DN_CVT_BytesStr8FromU64AutoTLS(bytes) DN_CVT_BytesStr8FromU64(DN_OS_TLSTopArena(), bytes, DN_CVTBytesType_Auto) +#define DN_CVT_BytesStr8FromU64Frame(bytes, type) DN_CVT_BytesStr8FromU64(DN_OS_TLSFrameArena(), bytes, type) +#define DN_CVT_BytesStr8FromU64AutoFrame(bytes) DN_CVT_BytesStr8FromU64(DN_OS_TLSFrameArena(), bytes, DN_CVTBytesType_Auto) +DN_API DN_Str8 DN_CVT_BytesTypeToStr8 (DN_CVTBytesType type); +DN_API DN_Str8 DN_CVT_AgeFromU64 (DN_Arena *arena, DN_U64 age_s, DN_CVTU64AgeUnit unit); +DN_API DN_Str8 DN_CVT_AgeFromF64 (DN_Arena *arena, DN_F64 age_s, DN_CVTU64AgeUnit unit); -DN_API DN_USize DN_CVT_HexToBytesPtrUnchecked (DN_Str8 hex, void *dest, DN_USize dest_size); -DN_API DN_USize DN_CVT_HexToBytesPtr (DN_Str8 hex, void *dest, DN_USize dest_size); -DN_API DN_Str8 DN_CVT_HexToBytesUnchecked (DN_Arena *arena, DN_Str8 hex); -#define DN_CVT_HexToBytesUncheckedFromTLS(...) DN_CVT_HexToBytesUnchecked(DN_OS_TLSTopArena(), __VA_ARGS__) -DN_API DN_Str8 DN_CVT_HexToBytes (DN_Arena *arena, DN_Str8 hex); -#define DN_CVT_HexToBytesFromFrame(...) DN_CVT_HexToBytes(DN_OS_TLSFrameArena(), __VA_ARGS__) -#define DN_CVT_HexToBytesFromTLS(...) DN_CVT_HexToBytes(DN_OS_TLSTopArena(), __VA_ARGS__) +DN_API DN_U64 DN_CVT_U64FromHex (DN_Str8 hex); +DN_API DN_Str8 DN_CVT_HexFromU64 (DN_Arena *arena, DN_U64 number, DN_CVTU64HexStrFlags flags); +#define DN_CVT_HexFromU64Frame(number, flags) DN_CVT_HexFromU64(DN_OS_TLSFrameArena(), number, flags) +DN_API DN_CVTU64HexStr DN_CVT_HexFromU64Str (DN_U64 number, DN_CVTU64HexStrFlags flags); + +DN_API bool DN_CVT_HexFromBytesPtr (void const *src, DN_USize src_size, char *dest, DN_USize dest_size); +DN_API DN_Str8 DN_CVT_HexFromBytes (DN_Arena *arena, void const *src, DN_USize size); +#define DN_CVT_HexFromBytesTLS(...) DN_CVT_HexFromBytes(DN_OS_TLSTopArena(), __VA_ARGS__) +#define DN_CVT_HexFromBytesFrame(...) DN_CVT_HexFromBytes(DN_OS_TLSFrameArena(), __VA_ARGS__) + +DN_API DN_USize DN_CVT_BytesFromHexPtrUnchecked (DN_Str8 hex, void *dest, DN_USize dest_size); +DN_API DN_USize DN_CVT_BytesFromHexPtr (DN_Str8 hex, void *dest, DN_USize dest_size); +DN_API DN_Str8 DN_CVT_BytesFromHexUnchecked (DN_Arena *arena, DN_Str8 hex); +#define DN_CVT_BytesFromHexUncheckedFromTLS(...) DN_CVT_BytesFromHexUnchecked(DN_OS_TLSTopArena(), __VA_ARGS__) +DN_API DN_Str8 DN_CVT_BytesFromHex (DN_Arena *arena, DN_Str8 hex); +#define DN_CVT_BytesFromHexFrame(...) DN_CVT_BytesFromHex(DN_OS_TLSFrameArena(), __VA_ARGS__) +#define DN_CVT_BytesFromHexTLS(...) DN_CVT_BytesFromHex(DN_OS_TLSTopArena(), __VA_ARGS__) #endif // defined(DN_BASE_CONVERT_H) diff --git a/Source/Base/dn_base_mem.cpp b/Source/Base/dn_base_mem.cpp index 16ac34b..0205857 100644 --- a/Source/Base/dn_base_mem.cpp +++ b/Source/Base/dn_base_mem.cpp @@ -1,6 +1,8 @@ #define DN_BASE_MEM_CPP -static DN_ArenaBlock *DN_Arena_BlockInitFromMemFuncs_(DN_U64 reserve, DN_U64 commit, bool track_alloc, bool alloc_can_leak, DN_ArenaMemFuncs mem_funcs) +#include "../dn_base_inc.h" + +static DN_ArenaBlock *DN_Arena_BlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit, bool track_alloc, bool alloc_can_leak, DN_ArenaMemFuncs mem_funcs) { DN_ArenaBlock *result = nullptr; switch (mem_funcs.type) { @@ -51,11 +53,11 @@ static DN_ArenaBlock *DN_Arena_BlockInitFromMemFuncs_(DN_U64 reserve, DN_U64 com return result; } -static DN_ArenaBlock *DN_Arena_BlockInitFlagsFromMemFuncs_(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) +static DN_ArenaBlock *DN_Arena_BlockFlagsFromMemFuncs_(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) { bool track_alloc = (flags & DN_ArenaFlags_NoAllocTrack) == 0; bool alloc_can_leak = flags & DN_ArenaFlags_AllocCanLeak; - DN_ArenaBlock *result = DN_Arena_BlockInitFromMemFuncs_(reserve, commit, track_alloc, alloc_can_leak, mem_funcs); + DN_ArenaBlock *result = DN_Arena_BlockFromMemFuncs_(reserve, commit, track_alloc, alloc_can_leak, mem_funcs); if (result && ((flags & DN_ArenaFlags_NoPoison) == 0)) DN_ASanPoisonMemoryRegion(DN_CAST(char *) result + DN_ARENA_HEADER_SIZE, result->commit - DN_ARENA_HEADER_SIZE); return result; @@ -77,7 +79,7 @@ static void DN_Arena_UpdateStatsOnNewBlock_(DN_Arena *arena, DN_ArenaBlock const } } -DN_API DN_Arena DN_Arena_InitFromBuffer(void *buffer, DN_USize size, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromBuffer(void *buffer, DN_USize size, DN_ArenaFlags flags) { DN_Assert(buffer); DN_AssertF(DN_ARENA_HEADER_SIZE < size, "Buffer (%zu bytes) too small, need atleast %zu bytes to store arena metadata", size, DN_ARENA_HEADER_SIZE); @@ -98,13 +100,13 @@ DN_API DN_Arena DN_Arena_InitFromBuffer(void *buffer, DN_USize size, DN_ArenaFla return result; } -DN_API DN_Arena DN_Arena_InitFromMemFuncs(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) +DN_API DN_Arena DN_Arena_FromMemFuncs(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs) { DN_Arena result = {}; result.flags = flags; result.mem_funcs = mem_funcs; result.flags |= DN_ArenaFlags_MemFuncs; - result.curr = DN_Arena_BlockInitFlagsFromMemFuncs_(reserve, commit, flags, mem_funcs); + result.curr = DN_Arena_BlockFlagsFromMemFuncs_(reserve, commit, flags, mem_funcs); DN_Arena_UpdateStatsOnNewBlock_(&result, result.curr); return result; } @@ -177,7 +179,7 @@ DN_API bool DN_Arena_Grow(DN_Arena *arena, DN_U64 reserve, DN_U64 commit) return false; bool result = false; - DN_ArenaBlock *new_block = DN_Arena_BlockInitFlagsFromMemFuncs_(reserve, commit, arena->flags, arena->mem_funcs); + DN_ArenaBlock *new_block = DN_Arena_BlockFlagsFromMemFuncs_(reserve, commit, arena->flags, arena->mem_funcs); if (new_block) { result = true; new_block->prev = arena->curr; @@ -194,7 +196,7 @@ DN_API void *DN_Arena_Alloc(DN_Arena *arena, DN_U64 size, uint8_t align, DN_Zero return nullptr; if (!arena->curr) { - arena->curr = DN_Arena_BlockInitFlagsFromMemFuncs_(DN_ARENA_RESERVE_SIZE, DN_ARENA_COMMIT_SIZE, arena->flags, arena->mem_funcs); + arena->curr = DN_Arena_BlockFlagsFromMemFuncs_(DN_ARENA_RESERVE_SIZE, DN_ARENA_COMMIT_SIZE, arena->flags, arena->mem_funcs); DN_Arena_UpdateStatsOnNewBlock_(arena, arena->curr); } @@ -394,7 +396,7 @@ DN_ArenaTempMemScope::~DN_ArenaTempMemScope() } // NOTE: DN_Pool /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Pool DN_Pool_Init(DN_Arena *arena, uint8_t align) +DN_API DN_Pool DN_Pool_FromArena(DN_Arena *arena, uint8_t align) { DN_Pool result = {}; if (arena) { diff --git a/Source/Base/dn_base_mem.h b/Source/Base/dn_base_mem.h index 372c2fc..12acba1 100644 --- a/Source/Base/dn_base_mem.h +++ b/Source/Base/dn_base_mem.h @@ -199,8 +199,8 @@ struct DN_Pool DN_U8 align; }; -DN_API DN_Arena DN_Arena_InitFromBuffer (void *buffer, DN_USize size, DN_ArenaFlags flags); -DN_API DN_Arena DN_Arena_InitFromMemFuncs (DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs); +DN_API DN_Arena DN_Arena_FromBuffer (void *buffer, DN_USize size, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromMemFuncs (DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags, DN_ArenaMemFuncs mem_funcs); DN_API void DN_Arena_Deinit (DN_Arena *arena); DN_API bool DN_Arena_Commit (DN_Arena *arena, DN_U64 size); DN_API bool DN_Arena_CommitTo (DN_Arena *arena, DN_U64 pos); @@ -224,7 +224,7 @@ DN_API void DN_Arena_TempMemEnd (DN_ArenaTem #define DN_Arena_NewCopy(arena, T, src) (T *)DN_Arena_Copy (arena, (src), sizeof(T), alignof(T)) #define DN_Arena_NewArrayCopy(arena, T, src, count) (T *)DN_Arena_Copy (arena, (src), sizeof(T) * (count), alignof(T)) -DN_API DN_Pool DN_Pool_Init (DN_Arena *arena, DN_U8 align); +DN_API DN_Pool DN_Pool_FromArena (DN_Arena *arena, DN_U8 align); DN_API bool DN_Pool_IsValid (DN_Pool const *pool); DN_API void * DN_Pool_Alloc (DN_Pool *pool, DN_USize size); DN_API DN_Str8 DN_Pool_AllocStr8FV (DN_Pool *pool, DN_FMT_ATTRIB char const *fmt, va_list args); diff --git a/Source/Base/dn_base_string.cpp b/Source/Base/dn_base_string.cpp index bfaaf23..2a09b6e 100644 --- a/Source/Base/dn_base_string.cpp +++ b/Source/Base/dn_base_string.cpp @@ -1,5 +1,7 @@ #define DN_STRING_CPP +#include "../dn_base_inc.h" + // NOTE: DN_CStr8 ////////////////////////////////////////////////////////////////////////////////// DN_API DN_USize DN_CStr8_FSize(DN_FMT_ATTRIB char const *fmt, ...) { @@ -56,13 +58,47 @@ DN_API bool operator!=(DN_Str16 const &lhs, DN_Str16 const &rhs) } // NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8 DN_Str8_InitCStr8(char const *src) +DN_API DN_Str8 DN_Str8_Alloc(DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem) +{ + DN_Str8 result = {}; + result.data = DN_Arena_NewArray(arena, char, size + 1, zero_mem); + if (result.data) + result.size = size; + result.data[result.size] = 0; + return result; +} + +DN_API DN_Str8 DN_Str8_FromCStr8(char const *src) { DN_USize size = DN_CStr8_Size(src); DN_Str8 result = DN_Str8_Init(src, size); return result; } +DN_API DN_Str8 DN_Str8_FromF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) +{ + va_list va; + va_start(va, fmt); + DN_Str8 result = DN_Str8_FromFV(arena, fmt, va); + va_end(va); + return result; +} + +DN_API DN_Str8 DN_Str8_FromFV(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = {}; + if (!fmt) + return result; + + DN_USize size = DN_CStr8_FVSize(fmt, args); + if (size) { + result = DN_Str8_Alloc(arena, size, DN_ZeroMem_No); + if (DN_Str8_HasData(result)) + DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); + } + return result; +} + DN_API bool DN_Str8_IsAll(DN_Str8 string, DN_Str8IsAll is_all) { bool result = DN_Str8_HasData(string); @@ -114,13 +150,13 @@ DN_API DN_Str8 DN_Str8_Advance(DN_Str8 string, DN_USize amount) DN_API DN_Str8 DN_Str8_NextLine(DN_Str8 string) { - DN_Str8 result = DN_Str8_BinarySplit(string, DN_STR8("\n")).rhs; + DN_Str8 result = DN_Str8_BSplit(string, DN_STR8("\n")).rhs; return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) +DN_API DN_Str8BSplitResult DN_Str8_BSplitArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; if (!DN_Str8_HasData(string) || !find || find_size == 0) return result; @@ -141,15 +177,15 @@ DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray(DN_Str8 string, DN_Str8 return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplit(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_Str8_BSplit(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = DN_Str8_BinarySplitArray(string, &find, 1); + DN_Str8BSplitResult result = DN_Str8_BSplitArray(string, &find, 1); return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) +DN_API DN_Str8BSplitResult DN_Str8_BSplitLastArray(DN_Str8 string, DN_Str8 const *find, DN_USize find_size) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; if (!DN_Str8_HasData(string) || !find || find_size == 0) return result; @@ -170,9 +206,9 @@ DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray(DN_Str8 string, DN_ return result; } -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLast(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_Str8_BSplitLast(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = DN_Str8_BinarySplitLastArray(string, &find, 1); + DN_Str8BSplitResult result = DN_Str8_BSplitLastArray(string, &find, 1); return result; } @@ -182,10 +218,10 @@ DN_API DN_USize DN_Str8_Split(DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits if (!DN_Str8_HasData(string) || !DN_Str8_HasData(delimiter) || delimiter.size <= 0) return result; - DN_Str8BinarySplitResult split = {}; + DN_Str8BSplitResult split = {}; DN_Str8 first = string; do { - split = DN_Str8_BinarySplit(first, delimiter); + split = DN_Str8_BSplit(first, delimiter); if (split.lhs.size || mode == DN_Str8SplitIncludeEmptyStrings_Yes) { if (splits && result < splits_count) splits[result] = split.lhs; @@ -212,9 +248,6 @@ DN_API DN_Slice DN_Str8_SplitAlloc(DN_Arena *arena, DN_Str8 string, DN_ DN_API DN_Str8FindResult DN_Str8_FindStr8Array(DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case) { DN_Str8FindResult result = {}; - if (!DN_Str8_HasData(string) || !find || find_size == 0) - return result; - for (DN_USize index = 0; !result.found && index < string.size; index++) { for (DN_USize find_index = 0; find_index < find_size; find_index++) { DN_Str8 find_item = find[find_index]; @@ -261,7 +294,7 @@ DN_API DN_Str8FindResult DN_Str8_Find(DN_Str8 string, uint32_t flags) DN_API DN_Str8 DN_Str8_Segment(DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char) { if (!segment_size || !DN_Str8_HasData(src)) { - DN_Str8 result = DN_Str8_Copy(arena, src); + DN_Str8 result = DN_Str8_FromStr8(arena, src); return result; } @@ -288,7 +321,7 @@ DN_API DN_Str8 DN_Str8_Segment(DN_Arena *arena, DN_Str8 src, DN_USize segment_si DN_API DN_Str8 DN_Str8_ReverseSegment(DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char) { if (!segment_size || !DN_Str8_HasData(src)) { - DN_Str8 result = DN_Str8_Copy(arena, src); + DN_Str8 result = DN_Str8_FromStr8(arena, src); return result; } @@ -473,7 +506,7 @@ DN_API DN_Str8 DN_Str8_TrimByteOrderMark(DN_Str8 string) DN_API DN_Str8 DN_Str8_FileNameFromPath(DN_Str8 path) { DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(path, separators, DN_ArrayCountU(separators)); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(path, separators, DN_ArrayCountU(separators)); DN_Str8 result = DN_Str8_HasData(split.rhs) ? split.rhs : split.lhs; return result; } @@ -487,14 +520,14 @@ DN_API DN_Str8 DN_Str8_FileNameNoExtension(DN_Str8 path) DN_API DN_Str8 DN_Str8_FilePathNoExtension(DN_Str8 path) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLast(path, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplitLast(path, DN_STR8(".")); DN_Str8 result = split.lhs; return result; } DN_API DN_Str8 DN_Str8_FileExtension(DN_Str8 path) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLast(path, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplitLast(path, DN_STR8(".")); DN_Str8 result = split.rhs; return result; } @@ -502,7 +535,7 @@ DN_API DN_Str8 DN_Str8_FileExtension(DN_Str8 path) DN_API DN_Str8 DN_Str8_FileDirectoryFromPath(DN_Str8 path) { DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(path, separators, DN_ArrayCountU(separators)); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(path, separators, DN_ArrayCountU(separators)); DN_Str8 result = split.lhs; return result; } @@ -611,7 +644,7 @@ DN_API DN_Str8 DN_Str8_AppendF(DN_Arena *arena, DN_Str8 string, char const *fmt, DN_API DN_Str8 DN_Str8_AppendFV(DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args) { // TODO: Calculate size and write into one buffer instead of 2 appends - DN_Str8 append = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 append = DN_Str8_FromFV(arena, fmt, args); DN_Str8 result = DN_Str8_Alloc(arena, string.size + append.size, DN_ZeroMem_No); DN_Memcpy(result.data, string.data, string.size); DN_Memcpy(result.data + string.size, append.data, append.size); @@ -629,7 +662,7 @@ DN_API DN_Str8 DN_Str8_FillF(DN_Arena *arena, DN_USize count, char const *fmt, . DN_API DN_Str8 DN_Str8_FillFV(DN_Arena *arena, DN_USize count, char const *fmt, va_list args) { - DN_Str8 fill = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 fill = DN_Str8_FromFV(arena, fmt, args); DN_Str8 result = DN_Str8_Alloc(arena, count * fill.size, DN_ZeroMem_No); for (DN_USize index = 0; index < count; index++) { void *dest = result.data + (index * fill.size); @@ -655,15 +688,15 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle(DN_Arena *arena, DN_St { DN_Str8DotTruncateResult result = {}; if (str8.size <= (side_size * 2)) { - result.str8 = DN_Str8_Copy(arena, str8); + result.str8 = DN_Str8_FromStr8(arena, str8); return result; } DN_Str8 head = DN_Str8_Slice(str8, 0, side_size); DN_Str8 tail = DN_Str8_Slice(str8, str8.size - side_size, side_size); DN_MSVC_WARNING_PUSH - DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8_InitF' Actual type: 'struct DN_Str8' - result.str8 = DN_Str8_InitF(arena, "%S%S%S", head, truncator, tail); + DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8_FromF' Actual type: 'struct DN_Str8' + result.str8 = DN_Str8_FromF(arena, "%S%S%S", head, truncator, tail); DN_MSVC_WARNING_POP result.truncated = true; return result; @@ -671,7 +704,7 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle(DN_Arena *arena, DN_St DN_API DN_Str8 DN_Str8_Lower(DN_Arena *arena, DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(arena, string); + DN_Str8 result = DN_Str8_FromStr8(arena, string); for (DN_ForIndexU(index, result.size)) result.data[index] = DN_Char_ToLower(result.data[index]); return result; @@ -679,7 +712,7 @@ DN_API DN_Str8 DN_Str8_Lower(DN_Arena *arena, DN_Str8 string) DN_API DN_Str8 DN_Str8_Upper(DN_Arena *arena, DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(arena, string); + DN_Str8 result = DN_Str8_FromStr8(arena, string); for (DN_ForIndexU(index, result.size)) result.data[index] = DN_Char_ToUpper(result.data[index]); return result; @@ -699,41 +732,7 @@ DN_API bool operator!=(DN_Str8 const &lhs, DN_Str8 const &rhs) } #endif -DN_API DN_Str8 DN_Str8_InitF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) -{ - va_list va; - va_start(va, fmt); - DN_Str8 result = DN_Str8_InitFV(arena, fmt, va); - va_end(va); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFV(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = {}; - if (!fmt) - return result; - - DN_USize size = DN_CStr8_FVSize(fmt, args); - if (size) { - result = DN_Str8_Alloc(arena, size, DN_ZeroMem_No); - if (DN_Str8_HasData(result)) - DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); - } - return result; -} - -DN_API DN_Str8 DN_Str8_Alloc(DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem) -{ - DN_Str8 result = {}; - result.data = DN_Arena_NewArray(arena, char, size + 1, zero_mem); - if (result.data) - result.size = size; - result.data[result.size] = 0; - return result; -} - -DN_API DN_Str8 DN_Str8_Copy(DN_Arena *arena, DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8(DN_Arena *arena, DN_Str8 string) { DN_Str8 result = DN_Str8_Alloc(arena, string.size, DN_ZeroMem_No); if (DN_Str8_HasData(result)) { @@ -744,31 +743,35 @@ DN_API DN_Str8 DN_Str8_Copy(DN_Arena *arena, DN_Str8 string) } // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_Init(DN_Arena *arena) +DN_API DN_Str8Builder DN_Str8Builder_FromArena(DN_Arena *arena) { DN_Str8Builder result = {}; result.arena = arena; return result; } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRef(DN_Arena *arena, - DN_Str8 const *strings, - DN_USize size) +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRef(DN_Arena *arena, DN_Str8 const *strings, DN_USize size) { - DN_Str8Builder result = DN_Str8Builder_Init(arena); + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); DN_Str8Builder_AppendArrayRef(&result, strings, size); return result; } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopy(DN_Arena *arena, - DN_Str8 const *strings, - DN_USize size) +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopy(DN_Arena *arena, DN_Str8 const *strings, DN_USize size) { - DN_Str8Builder result = DN_Str8Builder_Init(arena); + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); DN_Str8Builder_AppendArrayCopy(&result, strings, size); return result; } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilder(DN_Arena *arena, DN_Str8Builder const *builder) +{ + DN_Str8Builder result = DN_Str8Builder_FromArena(arena); + DN_Str8Builder_AppendBuilderCopy(&result, builder); + return result; +} + + DN_API bool DN_Str8Builder_AddArrayRef(DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add) { if (!builder) @@ -830,7 +833,7 @@ DN_API bool DN_Str8Builder_AddArrayCopy(DN_Str8Builder *builder, DN_Str8 const * bool result = true; DN_Str8 *strings_copy = DN_Arena_NewArray(builder->arena, DN_Str8, size, DN_ZeroMem_No); for (DN_ForIndexU(index, size)) { - strings_copy[index] = DN_Str8_Copy(builder->arena, strings[index]); + strings_copy[index] = DN_Str8_FromStr8(builder->arena, strings[index]); if (strings_copy[index].size != strings[index].size) { result = false; break; @@ -848,7 +851,7 @@ DN_API bool DN_Str8Builder_AddArrayCopy(DN_Str8Builder *builder, DN_Str8 const * DN_API bool DN_Str8Builder_AddFV(DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args) { - DN_Str8 string = DN_Str8_InitFV(builder->arena, fmt, args); + DN_Str8 string = DN_Str8_FromFV(builder->arena, fmt, args); DN_ArenaTempMem temp_mem = DN_Arena_TempMemBegin(builder->arena); bool result = DN_Str8Builder_AddArrayRef(builder, &string, 1, add); if (!result) @@ -913,7 +916,7 @@ static bool DN_Str8Builder_AppendBuilder_(DN_Str8Builder *dest, DN_Str8Builder c link->string = it->string; if (copy) { - link->string = DN_Str8_Copy(dest->arena, it->string); + link->string = DN_Str8_FromStr8(dest->arena, it->string); if (link->string.size != it->string.size) { result = false; break; @@ -985,13 +988,6 @@ DN_API bool DN_Str8Builder_Erase(DN_Str8Builder *builder, DN_Str8 string) return false; } -DN_API DN_Str8Builder DN_Str8Builder_Copy(DN_Arena *arena, DN_Str8Builder const *builder) -{ - DN_Str8Builder result = DN_Str8Builder_Init(arena); - DN_Str8Builder_AppendBuilderCopy(&result, builder); - return result; -} - DN_API DN_Str8 DN_Str8Builder_Build(DN_Str8Builder const *builder, DN_Arena *arena) { DN_Str8 result = DN_Str8Builder_BuildDelimited(builder, DN_STR8(""), arena); @@ -1038,12 +1034,22 @@ DN_API DN_Slice DN_Str8Builder_BuildSlice(DN_Str8Builder const *builder DN_USize slice_index = 0; for (DN_Str8Link *link = builder->head; link; link = link->next) - result.data[slice_index++] = DN_Str8_Copy(arena, link->string); + result.data[slice_index++] = DN_Str8_FromStr8(arena, link->string); DN_Assert(slice_index == builder->count); return result; } +DN_API DN_Str8 DN_LStr8_AppendF(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + *buf_size += DN_VSNPrintF(buf + *buf_size, DN_CAST(int)(buf_max - *buf_size), fmt, args); + va_end(args); + DN_Str8 result = DN_Str8_Init(buf, *buf_size); + return result; +} + // NOTE: DN_Char /////////////////////////////////////////////////////////////////////////////////// DN_API bool DN_Char_IsAlphabet(char ch) { @@ -1075,37 +1081,6 @@ DN_API bool DN_Char_IsHex(char ch) return result; } -DN_API DN_CharHexToU8 DN_Char_HexToU8(char ch) -{ - DN_CharHexToU8 result = {}; - result.success = true; - if (ch >= 'a' && ch <= 'f') - result.value = ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') - result.value = ch - 'A' + 10; - else if (ch >= '0' && ch <= '9') - result.value = ch - '0'; - else - result.success = false; - return result; -} - -static char constexpr DN_HEX_LUT[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - -DN_API char DN_Char_ToHex(char ch) -{ - char result = DN_CAST(char) - 1; - if (ch < 16) - result = DN_HEX_LUT[DN_CAST(uint8_t) ch]; - return result; -} - -DN_API char DN_Char_ToHexUnchecked(char ch) -{ - char result = DN_HEX_LUT[DN_CAST(uint8_t) ch]; - return result; -} - DN_API char DN_Char_ToLower(char ch) { char result = ch; diff --git a/Source/Base/dn_base_string.h b/Source/Base/dn_base_string.h index e897fca..4a475fe 100644 --- a/Source/Base/dn_base_string.h +++ b/Source/Base/dn_base_string.h @@ -1,10 +1,13 @@ #if !defined(DN_BASE_STRING_H) #define DN_BASE_STRING_H +#include "../dn_base_inc.h" + #if !defined(DN_STB_SPRINTF_HEADER_ONLY) #define STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_STATIC #endif + DN_MSVC_WARNING_PUSH DN_MSVC_WARNING_DISABLE(4505) // Unused function warning DN_GCC_WARNING_PUSH @@ -25,7 +28,7 @@ struct DN_Str8Link DN_Str8Link *prev; // The prev string in the linked list }; -struct DN_Str8BinarySplitResult +struct DN_Str8BSplitResult { DN_Str8 lhs; DN_Str8 rhs; @@ -87,20 +90,6 @@ struct DN_Str8DotTruncateResult DN_Str8 str8; }; -#if !defined(DN_NO_FSTR8) -template -struct DN_FStr8 -{ - char data[N + 1]; - DN_USize size; - - char *begin() { return data; } - char *end() { return data + size; } - char const *begin() const { return data; } - char const *end() const { return data + size; } -}; -#endif // !defined(DN_NO_FSTR8) - struct DN_Str8Builder { DN_Arena *arena; // Allocator to use to back the string list @@ -116,391 +105,138 @@ enum DN_Str8BuilderAdd DN_Str8BuilderAdd_Prepend, }; -// NOTE: DN_CStr8 ////////////////////////////////////////////////////////////////////////////////// -template constexpr DN_USize DN_CStr8_ArrayUCount (char const (&literal)[N]) { (void)literal; return N - 1; } -template constexpr DN_USize DN_CStr8_ArrayICount (char const (&literal)[N]) { (void)literal; return N - 1; } -DN_API DN_USize DN_CStr8_FSize (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_USize DN_CStr8_FVSize (DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_USize DN_CStr8_Size (char const *a); -DN_API DN_USize DN_CStr16_Size (wchar_t const *a); - -// NOTE: DN_Str16 ////////////////////////////////////////////////////////////////////////////////// -#define DN_STR16(string) DN_Str16{(wchar_t *)(string), sizeof(string)/sizeof(string[0]) - 1} -#define DN_Str16_HasData(string) ((string).data && (string).size) - -#if defined(__cplusplus) -DN_API bool operator== (DN_Str16 const &lhs, DN_Str16 const &rhs); -DN_API bool operator!= (DN_Str16 const &lhs, DN_Str16 const &rhs); -#endif - -// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -#define DN_STR8(string) DN_Str8{(char *)(string), (sizeof(string) - 1)} -#define DN_STR_FMT(string) (int)((string).size), (string).data -#define DN_Str8_Init(data, size) DN_Str8{(char *)(data), (size_t)(size)} - -DN_API DN_Str8 DN_Str8_InitCStr8 (char const *src); -#define DN_Str8_HasData(string) ((string).data && (string).size) -DN_API bool DN_Str8_IsAll (DN_Str8 string, DN_Str8IsAll is_all); - -DN_API DN_Str8 DN_Str8_InitF (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFV (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_Str8 DN_Str8_Alloc (DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_Copy (DN_Arena *arena, DN_Str8 string); - -DN_API char * DN_Str8_End (DN_Str8 string); -DN_API DN_Str8 DN_Str8_Slice (DN_Str8 string, DN_USize offset, DN_USize size); -DN_API DN_Str8 DN_Str8_Advance (DN_Str8 string, DN_USize amount); -DN_API DN_Str8 DN_Str8_NextLine (DN_Str8 string); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplit (DN_Str8 string, DN_Str8 find); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLast (DN_Str8 string, DN_Str8 find); -DN_API DN_USize DN_Str8_Split (DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits, DN_USize splits_count, DN_Str8SplitIncludeEmptyStrings mode); -DN_API DN_Slice DN_Str8_SplitAlloc (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); - -DN_API DN_Str8FindResult DN_Str8_FindStr8Array (DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case); -DN_API DN_Str8FindResult DN_Str8_FindStr8 (DN_Str8 string, DN_Str8 find, DN_Str8EqCase eq_case); -DN_API DN_Str8FindResult DN_Str8_Find (DN_Str8 string, uint32_t flags); -DN_API DN_Str8 DN_Str8_Segment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); -DN_API DN_Str8 DN_Str8_ReverseSegment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); - -DN_API bool DN_Str8_Eq (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_EqInsensitive (DN_Str8 lhs, DN_Str8 rhs); -DN_API bool DN_Str8_StartsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_StartsWithInsensitive (DN_Str8 string, DN_Str8 prefix); -DN_API bool DN_Str8_EndsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API bool DN_Str8_EndsWithInsensitive (DN_Str8 string, DN_Str8 prefix); -DN_API bool DN_Str8_HasChar (DN_Str8 string, char ch); - -DN_API DN_Str8 DN_Str8_TrimPrefix (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API DN_Str8 DN_Str8_TrimHexPrefix (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimSuffix (DN_Str8 string, DN_Str8 suffix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); -DN_API DN_Str8 DN_Str8_TrimAround (DN_Str8 string, DN_Str8 trim_string); -DN_API DN_Str8 DN_Str8_TrimHeadWhitespace (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimTailWhitespace (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimWhitespaceAround (DN_Str8 string); -DN_API DN_Str8 DN_Str8_TrimByteOrderMark (DN_Str8 string); - -DN_API DN_Str8 DN_Str8_FileNameFromPath (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileNameNoExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FilePathNoExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileExtension (DN_Str8 path); -DN_API DN_Str8 DN_Str8_FileDirectoryFromPath (DN_Str8 path); - -DN_API DN_Str8ToU64Result DN_Str8_ToU64 (DN_Str8 string, char separator); -DN_API DN_Str8ToI64Result DN_Str8_ToI64 (DN_Str8 string, char separator); - -DN_API DN_Str8 DN_Str8_AppendF (DN_Arena *arena, DN_Str8 string, char const *fmt, ...); -DN_API DN_Str8 DN_Str8_AppendFV (DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args); - -DN_API DN_Str8 DN_Str8_FillF (DN_Arena *arena, DN_USize count, char const *fmt, ...); -DN_API DN_Str8 DN_Str8_FillFV (DN_Arena *arena, DN_USize count, char const *fmt, va_list args); - -DN_API void DN_Str8_Remove (DN_Str8 *string, DN_USize offset, DN_USize size); - -DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle (DN_Arena *arena, DN_Str8 str8, uint32_t side_size, DN_Str8 truncator); - -DN_API DN_Str8 DN_Str8_Lower (DN_Arena *arena, DN_Str8 string); -DN_API DN_Str8 DN_Str8_Upper (DN_Arena *arena, DN_Str8 string); - -#if defined(__cplusplus) -DN_API bool operator== (DN_Str8 const &lhs, DN_Str8 const &rhs); -DN_API bool operator!= (DN_Str8 const &lhs, DN_Str8 const &rhs); -#endif - -// NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_Init (DN_Arena *arena); -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRef (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopy (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); -template DN_Str8Builder DN_Str8Builder_InitCArrayRef (DN_Arena *arena, DN_Str8 const (&array)[N]); -template DN_Str8Builder DN_Str8Builder_InitCArrayCopy (DN_Arena *arena, DN_Str8 const (&array)[N]); - -DN_API bool DN_Str8Builder_AddArrayRef (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); -DN_API bool DN_Str8Builder_AddArrayCopy (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); -DN_API bool DN_Str8Builder_AddFV (DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args); - -#define DN_Str8Builder_AppendArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) -#define DN_Str8Builder_AppendSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) -DN_API bool DN_Str8Builder_AppendRef (DN_Str8Builder *builder, DN_Str8 string); -DN_API bool DN_Str8Builder_AppendCopy (DN_Str8Builder *builder, DN_Str8 string); -#define DN_Str8Builder_AppendFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Append, fmt, args) -DN_API bool DN_Str8Builder_AppendF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); -DN_API bool DN_Str8Builder_AppendBytesRef (DN_Str8Builder *builder, void const *ptr, DN_USize size); -DN_API bool DN_Str8Builder_AppendBytesCopy (DN_Str8Builder *builder, void const *ptr, DN_USize size); -DN_API bool DN_Str8Builder_AppendBuilderRef (DN_Str8Builder *dest, DN_Str8Builder const *src); -DN_API bool DN_Str8Builder_AppendBuilderCopy (DN_Str8Builder *dest, DN_Str8Builder const *src); - -#define DN_Str8Builder_PrependArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) -#define DN_Str8Builder_PrependSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) -DN_API bool DN_Str8Builder_PrependRef (DN_Str8Builder *builder, DN_Str8 string); -DN_API bool DN_Str8Builder_PrependCopy (DN_Str8Builder *builder, DN_Str8 string); -#define DN_Str8Builder_PrependFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Prepend, fmt, args) -DN_API bool DN_Str8Builder_PrependF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); - -DN_API bool DN_Str8Builder_Erase (DN_Str8Builder *builder, DN_Str8 string); -DN_API DN_Str8Builder DN_Str8Builder_Copy (DN_Arena *arena, DN_Str8Builder const *builder); -DN_API DN_Str8 DN_Str8Builder_Build (DN_Str8Builder const *builder, DN_Arena *arena); -DN_API DN_Str8 DN_Str8Builder_BuildDelimited (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena); -DN_API DN_Slice DN_Str8Builder_BuildSlice (DN_Str8Builder const *builder, DN_Arena *arena); - -// NOTE: DN_FStr8 ////////////////////////////////////////////////////////////////////////////////// -#if !defined(DN_NO_FSTR8) -template DN_FStr8 DN_FStr8_InitF (DN_FMT_ATTRIB char const *fmt, ...); -template DN_FStr8 DN_FStr8_InitFV (char const *fmt, va_list args); -template DN_USize DN_FStr8_Max (DN_FStr8 const *string); -template void DN_FStr8_Clear (DN_FStr8 *string); -template bool DN_FStr8_AddFV (DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, va_list va); -template bool DN_FStr8_AddF (DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, ...); -template bool DN_FStr8_AddCStr8 (DN_FStr8 *string, char const *value, DN_USize size); -template bool DN_FStr8_Add (DN_FStr8 *string, DN_Str8 value); -template DN_Str8 DN_FStr8_ToStr8 (DN_FStr8 const *string); -template bool DN_FStr8_Eq (DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqStr8 (DN_FStr8 const *lhs, DN_Str8 rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqInsensitive (DN_FStr8 const *lhs, DN_FStr8 const *rhs); -template bool DN_FStr8_EqStr8Insensitive (DN_FStr8 const *lhs, DN_Str8 rhs); -template bool DN_FStr8_EqFStr8 (DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case); -template bool DN_FStr8_EqFStr8Insensitive (DN_FStr8 const *lhs, DN_FStr8 const *rhs); -template bool operator== (DN_FStr8 const &lhs, DN_FStr8 const &rhs); -template bool operator!= (DN_FStr8 const &lhs, DN_FStr8 const &rhs); -template bool operator== (DN_FStr8 const &lhs, DN_Str8 const &rhs); -template bool operator!= (DN_FStr8 const &lhs, DN_Str8 const &rhs); -#endif // !defined(DN_NO_FSTR8) - -// NOTE: DN_Char /////////////////////////////////////////////////////////////////////////////////// -struct DN_CharHexToU8 +struct DN_Str8x64 { - bool success; - uint8_t value; + char data[64]; + DN_USize size; }; -DN_API bool DN_Char_IsAlphabet (char ch); -DN_API bool DN_Char_IsDigit (char ch); -DN_API bool DN_Char_IsAlphaNum (char ch); -DN_API bool DN_Char_IsWhitespace (char ch); -DN_API bool DN_Char_IsHex (char ch); -DN_API DN_CharHexToU8 DN_Char_HexToU8 (char ch); -DN_API char DN_Char_ToHex (char ch); -DN_API char DN_Char_ToHexUnchecked (char ch); -DN_API char DN_Char_ToLower (char ch); -DN_API char DN_Char_ToUpper (char ch); - -// NOTE: DN_UTF //////////////////////////////////////////////////////////////////////////////////// -DN_API int DN_UTF8_EncodeCodepoint (uint8_t utf8[4], uint32_t codepoint); -DN_API int DN_UTF16_EncodeCodepoint (uint16_t utf16[2], uint32_t codepoint); - -// NOTE: DN_Str8Builder /////////////////////////////////////////////////////////////////////////// -template -DN_Str8Builder DN_Str8Builder_InitCArrayRef(DN_Arena *arena, DN_Str8 const (&array)[N]) +struct DN_Str8x256 { - DN_Str8Builder result = DN_Str8Builder_InitArrayRef(arena, array, N); - return result; -} + char data[256]; + DN_USize size; +}; -template -DN_Str8Builder DN_Str8Builder_InitCArrayCopy(DN_Arena *arena, DN_Str8 const (&array)[N]) -{ - DN_Str8Builder result = DN_Str8Builder_InitArrayCopy(arena, array, N); - return result; -} +DN_API DN_USize DN_CStr8_FSize (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_USize DN_CStr8_FVSize (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_USize DN_CStr8_Size (char const *a); +DN_API DN_USize DN_CStr16_Size (wchar_t const *a); -template -bool DN_Str8Builder_AddCArrayRef(DN_Str8Builder *builder, DN_Str8 const (&array)[N], DN_Str8BuilderAdd add) -{ - bool result = DN_Str8Builder_AddArrayRef(builder, array, N, add); - return result; -} +#define DN_STR16(string) DN_Str16{(wchar_t *)(string), sizeof(string)/sizeof(string[0]) - 1} +#define DN_Str16_HasData(string) ((string).data && (string).size) -template -bool DN_Str8Builder_AddCArrayCopy(DN_Str8Builder *builder, DN_Str8 const (&array)[N], DN_Str8BuilderAdd add) -{ - bool result = DN_Str8Builder_AddArrayCopy(builder, array, N, add); - return result; -} +#if defined(__cplusplus) +DN_API bool operator== (DN_Str16 const &lhs, DN_Str16 const &rhs); +DN_API bool operator!= (DN_Str16 const &lhs, DN_Str16 const &rhs); +#endif -#if !defined(DN_NO_FSTR8) -// NOTE: DN_FStr8 ////////////////////////////////////////////////////////////////////////////////// -template -DN_FStr8 DN_FStr8_InitF(DN_FMT_ATTRIB char const *fmt, ...) -{ - DN_FStr8 result = {}; - if (fmt) { - va_list args; - va_start(args, fmt); - DN_FStr8_AddFV(&result, fmt, args); - va_end(args); - } - return result; -} +#define DN_STR8(string) DN_Str8{(char *)(string), (sizeof(string) - 1)} +#define DN_STR_FMT(string) (int)((string).size), (string).data +#define DN_Str8_Init(data, size) DN_Str8{(char *)(data), (size_t)(size)} +#define DN_Str8_HasData(string) ((string).data && (string).size) +DN_API DN_Str8 DN_Str8_Alloc (DN_Arena *arena, DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromCStr8 (char const *src); +DN_API DN_Str8 DN_Str8_FromF (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFV (DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromStr8 (DN_Arena *arena, DN_Str8 string); +DN_API bool DN_Str8_IsAll (DN_Str8 string, DN_Str8IsAll is_all); +DN_API char * DN_Str8_End (DN_Str8 string); +DN_API DN_Str8 DN_Str8_Slice (DN_Str8 string, DN_USize offset, DN_USize size); +DN_API DN_Str8 DN_Str8_Advance (DN_Str8 string, DN_USize amount); +DN_API DN_Str8 DN_Str8_NextLine (DN_Str8 string); +DN_API DN_Str8BSplitResult DN_Str8_BSplitArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); +DN_API DN_Str8BSplitResult DN_Str8_BSplit (DN_Str8 string, DN_Str8 find); +DN_API DN_Str8BSplitResult DN_Str8_BSplitLastArray (DN_Str8 string, DN_Str8 const *find, DN_USize find_size); +DN_API DN_Str8BSplitResult DN_Str8_BSplitLast (DN_Str8 string, DN_Str8 find); +DN_API DN_USize DN_Str8_Split (DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits, DN_USize splits_count, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitAlloc (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Str8FindResult DN_Str8_FindStr8Array (DN_Str8 string, DN_Str8 const *find, DN_USize find_size, DN_Str8EqCase eq_case); +DN_API DN_Str8FindResult DN_Str8_FindStr8 (DN_Str8 string, DN_Str8 find, DN_Str8EqCase eq_case); +DN_API DN_Str8FindResult DN_Str8_Find (DN_Str8 string, uint32_t flags); +DN_API DN_Str8 DN_Str8_Segment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); +DN_API DN_Str8 DN_Str8_ReverseSegment (DN_Arena *arena, DN_Str8 src, DN_USize segment_size, char segment_char); +DN_API bool DN_Str8_Eq (DN_Str8 lhs, DN_Str8 rhs, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_EqInsensitive (DN_Str8 lhs, DN_Str8 rhs); +DN_API bool DN_Str8_StartsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_StartsWithInsensitive (DN_Str8 string, DN_Str8 prefix); +DN_API bool DN_Str8_EndsWith (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API bool DN_Str8_EndsWithInsensitive (DN_Str8 string, DN_Str8 prefix); +DN_API bool DN_Str8_HasChar (DN_Str8 string, char ch); +DN_API DN_Str8 DN_Str8_TrimPrefix (DN_Str8 string, DN_Str8 prefix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API DN_Str8 DN_Str8_TrimHexPrefix (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimSuffix (DN_Str8 string, DN_Str8 suffix, DN_Str8EqCase eq_case = DN_Str8EqCase_Sensitive); +DN_API DN_Str8 DN_Str8_TrimAround (DN_Str8 string, DN_Str8 trim_string); +DN_API DN_Str8 DN_Str8_TrimHeadWhitespace (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimTailWhitespace (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimWhitespaceAround (DN_Str8 string); +DN_API DN_Str8 DN_Str8_TrimByteOrderMark (DN_Str8 string); +DN_API DN_Str8 DN_Str8_FileNameFromPath (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileNameNoExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FilePathNoExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileExtension (DN_Str8 path); +DN_API DN_Str8 DN_Str8_FileDirectoryFromPath (DN_Str8 path); +DN_API DN_Str8ToU64Result DN_Str8_ToU64 (DN_Str8 string, char separator); +DN_API DN_Str8ToI64Result DN_Str8_ToI64 (DN_Str8 string, char separator); +DN_API DN_Str8 DN_Str8_AppendF (DN_Arena *arena, DN_Str8 string, char const *fmt, ...); +DN_API DN_Str8 DN_Str8_AppendFV (DN_Arena *arena, DN_Str8 string, char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FillF (DN_Arena *arena, DN_USize count, char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FillFV (DN_Arena *arena, DN_USize count, char const *fmt, va_list args); +DN_API void DN_Str8_Remove (DN_Str8 *string, DN_USize offset, DN_USize size); +DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddle (DN_Arena *arena, DN_Str8 str8, uint32_t side_size, DN_Str8 truncator); +DN_API DN_Str8 DN_Str8_Lower (DN_Arena *arena, DN_Str8 string); +DN_API DN_Str8 DN_Str8_Upper (DN_Arena *arena, DN_Str8 string); +#if defined(__cplusplus) +DN_API bool operator== (DN_Str8 const &lhs, DN_Str8 const &rhs); +DN_API bool operator!= (DN_Str8 const &lhs, DN_Str8 const &rhs); +#endif -template -DN_FStr8 DN_FStr8_InitFV(char const *fmt, va_list args) -{ - DN_FStr8 result = {}; - DN_FStr8_AddFV(&result, fmt, args); - return result; -} +DN_API DN_Str8 DN_LStr8_AppendF (char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, ...); +#define DN_IStr8_AppendF(struct_ptr, fmt, ...) DN_LStr8_AppendF((struct_ptr)->data, &(struct_ptr)->size, DN_ArrayCountU((struct_ptr)->data), fmt, ##__VA_ARGS__) +#define DN_Str8_FromIStr8(struct_ptr) DN_Str8_Init((struct_ptr)->data, (struct_ptr)->size) -template -DN_USize DN_FStr8_Max(DN_FStr8 const *) -{ - DN_USize result = N; - return result; -} -template -void DN_FStr8_Clear(DN_FStr8 *string) -{ - *string = {}; -} +DN_API DN_Str8Builder DN_Str8Builder_FromArena (DN_Arena *arena); +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRef (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopy (DN_Arena *arena, DN_Str8 const *strings, DN_USize size); +DN_API DN_Str8Builder DN_Str8Builder_FromBuilder (DN_Arena *arena, DN_Str8Builder const *builder); +DN_API bool DN_Str8Builder_AddArrayRef (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); +DN_API bool DN_Str8Builder_AddArrayCopy (DN_Str8Builder *builder, DN_Str8 const *strings, DN_USize size, DN_Str8BuilderAdd add); +DN_API bool DN_Str8Builder_AddFV (DN_Str8Builder *builder, DN_Str8BuilderAdd add, DN_FMT_ATTRIB char const *fmt, va_list args); +#define DN_Str8Builder_AppendArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) +#define DN_Str8Builder_AppendSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Append) +DN_API bool DN_Str8Builder_AppendRef (DN_Str8Builder *builder, DN_Str8 string); +DN_API bool DN_Str8Builder_AppendCopy (DN_Str8Builder *builder, DN_Str8 string); +#define DN_Str8Builder_AppendFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Append, fmt, args) +DN_API bool DN_Str8Builder_AppendF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); +DN_API bool DN_Str8Builder_AppendBytesRef (DN_Str8Builder *builder, void const *ptr, DN_USize size); +DN_API bool DN_Str8Builder_AppendBytesCopy (DN_Str8Builder *builder, void const *ptr, DN_USize size); +DN_API bool DN_Str8Builder_AppendBuilderRef (DN_Str8Builder *dest, DN_Str8Builder const *src); +DN_API bool DN_Str8Builder_AppendBuilderCopy (DN_Str8Builder *dest, DN_Str8Builder const *src); +#define DN_Str8Builder_PrependArrayRef(builder, strings, size) DN_Str8Builder_AddArrayRef(builder, strings, size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependArrayCopy(builder, strings, size) DN_Str8Builder_AddArrayCopy(builder, strings, size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependSliceRef(builder, slice) DN_Str8Builder_AddArrayRef(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) +#define DN_Str8Builder_PrependSliceCopy(builder, slice) DN_Str8Builder_AddArrayCopy(builder, slice.data, slice.size, DN_Str8BuilderAdd_Prepend) +DN_API bool DN_Str8Builder_PrependRef (DN_Str8Builder *builder, DN_Str8 string); +DN_API bool DN_Str8Builder_PrependCopy (DN_Str8Builder *builder, DN_Str8 string); +#define DN_Str8Builder_PrependFV(builder, fmt, args) DN_Str8Builder_AddFV(builder, DN_Str8BuilderAdd_Prepend, fmt, args) +DN_API bool DN_Str8Builder_PrependF (DN_Str8Builder *builder, DN_FMT_ATTRIB char const *fmt, ...); +DN_API bool DN_Str8Builder_Erase (DN_Str8Builder *builder, DN_Str8 string); +DN_API DN_Str8 DN_Str8Builder_Build (DN_Str8Builder const *builder, DN_Arena *arena); +DN_API DN_Str8 DN_Str8Builder_BuildDelimited (DN_Str8Builder const *builder, DN_Str8 delimiter, DN_Arena *arena); +DN_API DN_Slice DN_Str8Builder_BuildSlice (DN_Str8Builder const *builder, DN_Arena *arena); -template -bool DN_FStr8_AddFV(DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, va_list args) -{ - bool result = false; - if (!string || !fmt) - return result; +DN_API bool DN_Char_IsAlphabet (char ch); +DN_API bool DN_Char_IsDigit (char ch); +DN_API bool DN_Char_IsAlphaNum (char ch); +DN_API bool DN_Char_IsWhitespace (char ch); +DN_API bool DN_Char_IsHex (char ch); +DN_API char DN_Char_ToHex (char ch); +DN_API char DN_Char_ToHexUnchecked (char ch); +DN_API char DN_Char_ToLower (char ch); +DN_API char DN_Char_ToUpper (char ch); - DN_USize require = DN_CStr8_FVSize(fmt, args) + 1 /*null_terminate*/; - DN_USize space = (N + 1) - string->size; - result = require <= space; - string->size += DN_VSNPrintF(string->data + string->size, DN_CAST(int) space, fmt, args); - - // NOTE: snprintf returns the required size of the format string - // irrespective of if there's space or not. - string->size = DN_Min(string->size, N); - return result; -} - -template -bool DN_FStr8_AddF(DN_FStr8 *string, DN_FMT_ATTRIB char const *fmt, ...) -{ - bool result = false; - if (!string || !fmt) - return result; - va_list args; - va_start(args, fmt); - result = DN_FStr8_AddFV(string, fmt, args); - va_end(args); - return result; -} - -template -bool DN_FStr8_AddCStr8(DN_FStr8 *string, char const *src, DN_USize size) -{ - DN_Assert(string->size <= N); - bool result = false; - if (!string || !src || size == 0 || string->size >= N) - return result; - - DN_USize space = N - string->size; - result = size <= space; - DN_Memcpy(string->data + string->size, src, DN_Min(space, size)); - string->size = DN_Min(string->size + size, N); - string->data[string->size] = 0; - return result; -} - -template -bool DN_FStr8_Add(DN_FStr8 *string, DN_Str8 src) -{ - bool result = DN_FStr8_AddCStr8(string, src.data, src.size); - return result; -} - -template -DN_Str8 DN_FStr8_ToStr8(DN_FStr8 const *string) -{ - DN_Str8 result = {}; - if (!string || string->size <= 0) - return result; - - result.data = DN_CAST(char *) string->data; - result.size = string->size; - return result; -} - -template -bool DN_FStr8_Eq(DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, eq_case); - return result; -} - -template -bool DN_FStr8_EqStr8(DN_FStr8 const *lhs, DN_Str8 rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - bool result = DN_Str8_Eq(lhs_s8, rhs, eq_case); - return result; -} - -template -bool DN_FStr8_EqInsensitive(DN_FStr8 const *lhs, DN_FStr8 const *rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool DN_FStr8_EqStr8Insensitive(DN_FStr8 const *lhs, DN_Str8 rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - bool result = DN_Str8_Eq(lhs_s8, rhs, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool DN_FStr8_EqFStr8(DN_FStr8 const *lhs, DN_FStr8 const *rhs, DN_Str8EqCase eq_case) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, eq_case); - return result; -} - -template -bool DN_FStr8_EqFStr8Insensitive(DN_FStr8 const *lhs, DN_FStr8 const *rhs) -{ - DN_Str8 lhs_s8 = DN_FStr8_ToStr8(lhs); - DN_Str8 rhs_s8 = DN_FStr8_ToStr8(rhs); - bool result = DN_Str8_Eq(lhs_s8, rhs_s8, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool operator==(DN_FStr8 const &lhs, DN_FStr8 const &rhs) -{ - bool result = DN_FStr8_Eq(&lhs, &rhs, DN_Str8EqCase_Sensitive); - return result; -} - -template -bool operator!=(DN_FStr8 const &lhs, DN_FStr8 const &rhs) -{ - bool result = !(lhs == rhs); - return result; -} - -template -bool operator==(DN_FStr8 const &lhs, DN_Str8 const &rhs) -{ - bool result = DN_Str8_Eq(DN_FStr8_ToStr8(&lhs), rhs, DN_Str8EqCase_Insensitive); - return result; -} - -template -bool operator!=(DN_FStr8 const &lhs, DN_Str8 const &rhs) -{ - bool result = !(lhs == rhs); - return result; -} -#endif // !defined(DN_NO_FSTR8) +DN_API int DN_UTF8_EncodeCodepoint (uint8_t utf8[4], uint32_t codepoint); +DN_API int DN_UTF16_EncodeCodepoint (uint16_t utf16[2], uint32_t codepoint); #endif // !defined(DN_BASE_STRING_H) diff --git a/Source/Core/dn_core.cpp b/Source/Core/dn_core.cpp index 67f9321..2b81aca 100644 --- a/Source/Core/dn_core.cpp +++ b/Source/Core/dn_core.cpp @@ -13,13 +13,13 @@ DN_API void DN_Core_Init(DN_Core *core, DN_CoreOnInit on_init) #if defined(DN_LEAK_TRACKING) // NOTE: Setup the allocation table with allocation tracking turned off on // the arena we're using to initialise the table. - core->alloc_table_arena = DN_Arena_InitFromOSVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); + core->alloc_table_arena = DN_Arena_FromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); core->alloc_table = DN_DSMap_Init(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); #endif // NOTE: Print out init features /////////////////////////////////////////////////////////////// DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); if (on_init & DN_CoreOnInit_LogLibFeatures) { DN_Str8Builder_AppendRef(&builder, DN_STR8("DN initialised:\n")); diff --git a/Source/Core/dn_core_debug.cpp b/Source/Core/dn_core_debug.cpp index da055f5..ccaf760 100644 --- a/Source/Core/dn_core_debug.cpp +++ b/Source/Core/dn_core_debug.cpp @@ -100,7 +100,7 @@ DN_API DN_Str8 DN_StackTrace_WalkResultToStr8(DN_Arena *arena, DN_StackTraceWalk return result; DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); DN_StackTrace_AddWalkToStr8Builder_(walk, &builder, skip); result = DN_Str8Builder_Build(&builder, arena); return result; @@ -118,8 +118,8 @@ DN_API DN_Str8 DN_StackTrace_WalkStr8FromHeap(uint16_t limit, uint16_t skip) { // NOTE: We don't use WalkResultToStr8 because that uses the TLS arenas which // does not use the OS heap. - DN_Arena arena = DN_Arena_InitFromOSHeap(DN_Kilobytes(64), DN_ArenaFlags_NoAllocTrack); - DN_Str8Builder builder = DN_Str8Builder_Init(&arena); + DN_Arena arena = DN_Arena_FromHeap(DN_Kilobytes(64), DN_ArenaFlags_NoAllocTrack); + DN_Str8Builder builder = DN_Str8Builder_FromArena(&arena); DN_StackTraceWalkResult walk = DN_StackTrace_Walk(&arena, limit); DN_StackTrace_AddWalkToStr8Builder_(&walk, &builder, skip); DN_Str8 result = DN_Str8Builder_BuildFromOSHeap(&builder); @@ -232,8 +232,8 @@ DN_API void DN_DBGTrackAlloc(void *ptr, DN_USize size, bool leak_permitted) DN_DebugAlloc *alloc = alloc_entry.value; if (alloc_entry.found) { if ((alloc->flags & DN_DebugAllocFlag_Freed) == 0) { - DN_Str8 alloc_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, alloc->size); - DN_Str8 new_alloc_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, size); + DN_Str8 alloc_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, alloc->size); + DN_Str8 new_alloc_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, size); DN_HardAssertF( alloc->flags & DN_DebugAllocFlag_Freed, "This pointer is already in the leak tracker, however it has not been freed yet. This " @@ -290,7 +290,7 @@ DN_API void DN_DBGTrackDealloc(void *ptr) DN_DebugAlloc *alloc = alloc_entry.value; if (alloc->flags & DN_DebugAllocFlag_Freed) { - DN_Str8 freed_size = DN_CVT_U64ToBytesStr8Auto(alloc_table->arena, alloc->freed_size); + DN_Str8 freed_size = DN_CVT_BytesStr8FromU64Auto(alloc_table->arena, alloc->freed_size); DN_HardAssertF((alloc->flags & DN_DebugAllocFlag_Freed) == 0, "Double free detected, pointer to free was already marked " "as freed. Either the pointer was reallocated but not " @@ -332,7 +332,7 @@ DN_API void DN_DBGDumpLeaks() if (alloc_leaked && !leak_permitted) { leaked_bytes += alloc->size; leak_count++; - DN_Str8 alloc_size = DN_CVT_U64ToBytesStr8Auto(g_dn_core->alloc_table.arena, alloc->size); + DN_Str8 alloc_size = DN_CVT_BytesStr8FromU64Auto(g_dn_core->alloc_table.arena, alloc->size); DN_LOG_WarningF("Pointer (0x%p) leaked %.*s at:\n" "%.*s", alloc->ptr, DN_STR_FMT(alloc_size), @@ -342,8 +342,8 @@ DN_API void DN_DBGDumpLeaks() if (leak_count) { char buffer[512]; - DN_Arena arena = DN_Arena_InitFromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_Nil); - DN_Str8 leak_size = DN_CVT_U64ToBytesStr8Auto(&arena, leaked_bytes); + DN_Arena arena = DN_Arena_FromBuffer(buffer, sizeof(buffer), DN_ArenaFlags_Nil); + DN_Str8 leak_size = DN_CVT_BytesStr8FromU64Auto(&arena, leaked_bytes); DN_LOG_WarningF("There were %I64u leaked allocations totalling %.*s", leak_count, DN_STR_FMT(leak_size)); } } diff --git a/Source/Core/dn_core_demo.cpp b/Source/Core/dn_core_demo.cpp index 492c841..0cfd5ca 100644 --- a/Source/Core/dn_core_demo.cpp +++ b/Source/Core/dn_core_demo.cpp @@ -54,11 +54,11 @@ void DN_Docs_Demo() } } - // NOTE: DN_CVT_BytesToHex //////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_HexFromBytes //////////////////////////////////////////////////////////////////////// { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); unsigned char bytes[2] = {0xFA, 0xCE}; - DN_Str8 hex = DN_CVT_BytesToHex(tmem.arena, bytes, sizeof(bytes)); + DN_Str8 hex = DN_CVT_HexFromBytes(tmem.arena, bytes, sizeof(bytes)); DN_Assert(hex == DN_STR8("face")); // NOTE: Guaranteed to be null-terminated } @@ -154,7 +154,7 @@ void DN_Docs_Demo() // // A 'Deinit' of the map will similarly deallocate the passed in arena (as // the map takes ownership of the arena). - DN_Arena arena = DN_Arena_InitFromOSVMem(0, 0, DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(0, 0, DN_ArenaFlags_Nil); DN_DSMap map = DN_DSMap_Init(&arena, /*size*/ 1024, DN_DSMapFlags_Nil); // Size must be PoT! DN_Assert(DN_DSMap_IsValid(&map)); // Valid if no initialisation failure (e.g. mem alloc failure) @@ -331,21 +331,10 @@ void DN_Docs_Demo() } } - // NOTE: DN_FStr8_Max ///////////////////////////////////////////////////////////////////////// - // - // Return the maximum capacity of the string, e.g. the 'N' template - // parameter of FStr8 - - // NOTE: DN_FStr8_ToStr8 ////////////////////////////////////////////////////////////////////// - // - // Create a slice of the string into a pointer and length string (DN_Str8). - // The lifetime of the slice is bound to the lifetime of the FStr8 and is - // invalidated when the FStr8 is. - - // NOTE: DN_CVT_HexToBytes //////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_BytesFromHex //////////////////////////////////////////////////////////////////////// { unsigned char bytes[2]; - DN_USize bytes_written = DN_CVT_HexToBytesPtr(DN_STR8("0xFACE"), bytes, sizeof(bytes)); + DN_USize bytes_written = DN_CVT_BytesFromHexPtr(DN_STR8("0xFACE"), bytes, sizeof(bytes)); DN_Assert(bytes_written == 2); DN_Assert(bytes[0] == 0xFA); DN_Assert(bytes[1] == 0xCE); @@ -776,21 +765,21 @@ void DN_Docs_Demo() DN_Assert(string.data[string.size] == 0); // It is null-terminated! } - // NOTE: DN_Str8_BinarySplit ////////////////////////////////////////////////////////////////// + // NOTE: DN_Str8_BSplit ////////////////////////////////////////////////////////////////// // // Splits a string into 2 substrings occuring prior and after the first // occurence of the delimiter. Neither strings include the matched // delimiter. If no delimiter is found, the 'rhs' of the split will be // empty. { - DN_Str8BinarySplitResult dot_split = DN_Str8_BinarySplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8(".")); - DN_Str8BinarySplitResult slash_split = DN_Str8_BinarySplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8("/")); + DN_Str8BSplitResult dot_split = DN_Str8_BSplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8(".")); + DN_Str8BSplitResult slash_split = DN_Str8_BSplit(/*string*/ DN_STR8("abc.def.ghi"), /*delimiter*/ DN_STR8("/")); DN_Assert(dot_split.lhs == DN_STR8("abc") && dot_split.rhs == DN_STR8("def.ghi")); DN_Assert(slash_split.lhs == DN_STR8("abc.def.ghi") && slash_split.rhs == DN_STR8("")); // Loop that walks the string and produces ("abc", "def", "ghi") for (DN_Str8 it = DN_STR8("abc.def.ghi"); it.size;) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(it, DN_STR8(".")); + DN_Str8BSplitResult split = DN_Str8_BSplit(it, DN_STR8(".")); DN_Str8 chunk = split.lhs; // "abc", "def", ... it = split.rhs; (void)chunk; @@ -1052,17 +1041,17 @@ void DN_Docs_Demo() // @param[in] conflict_arena A pointer to the arena currently being used in the // function - // NOTE: DN_CVT_U64ToStr8 ///////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_Str8FromU64 ///////////////////////////////////////////////////////////////////////// { - DN_CVTU64Str8 string = DN_CVT_U64ToStr8(123123, ','); + DN_CVTU64Str8 string = DN_CVT_Str8FromU64(123123, ','); if (0) // Prints "123,123" printf("%.*s", DN_STR_FMT(string)); } - // NOTE: DN_CVT_U64ToAge ////////////////////////////////////////////////////////////////////////// + // NOTE: DN_CVT_AgeFromU64 ////////////////////////////////////////////////////////////////////////// { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 string = DN_CVT_U64ToAge(tmem.arena, DN_HoursToSec(2) + DN_MinutesToSec(30), DN_CVTU64AgeUnit_All); + DN_Str8 string = DN_CVT_AgeFromU64(tmem.arena, DN_HoursToSec(2) + DN_MinutesToSec(30), DN_CVTU64AgeUnit_All); DN_Assert(DN_Str8_Eq(string, DN_STR8("2h 30m"))); } diff --git a/Source/Extra/dn_async.cpp b/Source/Extra/dn_async.cpp index 4a6bed5..509c9c5 100644 --- a/Source/Extra/dn_async.cpp +++ b/Source/Extra/dn_async.cpp @@ -6,7 +6,7 @@ static DN_I32 DN_ASYNC_ThreadEntryPoint_(DN_OSThread *thread) { - DN_OS_ThreadSetName(DN_FStr8_ToStr8(&thread->name)); + DN_OS_ThreadSetName(DN_Str8_FromIStr8(&thread->name)); DN_ASYNCCore *async = DN_CAST(DN_ASYNCCore *) thread->user_context; DN_Ring *ring = &async->ring; for (;;) { @@ -51,7 +51,7 @@ DN_API void DN_ASYNC_Init(DN_ASYNCCore *async, char *base, DN_USize base_size, D async->threads = threads; for (DN_ForIndexU(index, async->thread_count)) { DN_OSThread *thread = async->threads + index; - thread->name = DN_FStr8_InitF<64>("ASYNC W%zu", index); + DN_IStr8_AppendF(&thread->name, "ASYNC W%zu", index); DN_OS_ThreadInit(thread, DN_ASYNC_ThreadEntryPoint_, async); } } diff --git a/Source/Extra/dn_bin_pack.cpp b/Source/Extra/dn_bin_pack.cpp index 6df9842..18df18f 100644 --- a/Source/Extra/dn_bin_pack.cpp +++ b/Source/Extra/dn_bin_pack.cpp @@ -112,7 +112,7 @@ DN_API void DN_BinPack_Str8FromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPa DN_Str8Builder_AppendBytesCopy(&pack->writer, string->data, string->size); } else { DN_Str8 src = DN_Str8_Slice(pack->read, pack->read_index, string->size); - *string = DN_Str8_Copy(arena, src); + *string = DN_Str8_FromStr8(arena, src); pack->read_index += src.size; } } @@ -129,19 +129,6 @@ DN_API void DN_BinPack_Str8FromPool(DN_BinPack *pack, DN_Pool *pool, DN_BinPackM } } -template -DN_API void DN_BinPack_FStr8(DN_BinPack *pack, DN_BinPackMode mode, DN_FStr8 *string) -{ - DN_BinPack_VarInt_(pack, mode, &string->size, sizeof(string->size)); - if (mode == DN_BinPackMode_Serialise) { - DN_Str8Builder_AppendBytesCopy(&pack->writer, string->data, string->size); - } else { - DN_Str8 src = DN_Str8_Slice(pack->read, pack->read_index, string->size); - *string = DN_FStr8_InitF("%.*s", DN_STR_FMT(src)); - pack->read_index += src.size; - } -} - DN_API void DN_BinPack_BytesFromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, void **ptr, DN_USize *size) { DN_Str8 string = DN_Str8_Init(*ptr, *size); diff --git a/Source/Extra/dn_bin_pack.h b/Source/Extra/dn_bin_pack.h index be4ec55..88d602b 100644 --- a/Source/Extra/dn_bin_pack.h +++ b/Source/Extra/dn_bin_pack.h @@ -35,7 +35,6 @@ DN_API void DN_BinPack_V4 (DN_BinPack *pack, DN_API void DN_BinPack_Bool (DN_BinPack *pack, DN_BinPackMode mode, bool *item); DN_API void DN_BinPack_Str8FromArena (DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, DN_Str8 *string); DN_API void DN_BinPack_Str8FromPool (DN_BinPack *pack, DN_Pool *pool, DN_BinPackMode mode, DN_Str8 *string); -template DN_API void DN_BinPack_FStr8 (DN_BinPack *pack, DN_BinPackMode mode, DN_FStr8 *string); DN_API void DN_BinPack_BytesFromArena(DN_BinPack *pack, DN_Arena *arena, DN_BinPackMode mode, void **ptr, DN_USize *size); DN_API void DN_BinPack_BytesFromPool (DN_BinPack *pack, DN_Pool *pool, DN_BinPackMode mode, void **ptr, DN_USize *size); DN_API void DN_BinPack_CArray (DN_BinPack *pack, DN_BinPackMode mode, void *ptr, DN_USize size); diff --git a/Source/Extra/dn_cgen.cpp b/Source/Extra/dn_cgen.cpp index db23ba9..f1bbe7b 100644 --- a/Source/Extra/dn_cgen.cpp +++ b/Source/Extra/dn_cgen.cpp @@ -344,7 +344,7 @@ DN_API DN_CGenMapNodeToEnum DN_CGen_MapNodeToEnumOrExit(MD_Node const *node, DN_ DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); va_list args; va_start(args, fmt); - DN_Str8 user_msg = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 user_msg = DN_Str8_FromFV(tmem.arena, fmt, args); va_end(args); DN_Str8Builder builder = {}; @@ -516,7 +516,7 @@ static void DN_CGen_EmitRowWhitespace_(DN_CGenTableRow const *row, DN_CppFile *c break; DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 prefix = DN_Str8_InitF(tmem.arena, "// NOTE: %.*s ", MD_S8VArg(tag->comment)); + DN_Str8 prefix = DN_Str8_FromF(tmem.arena, "// NOTE: %.*s ", MD_S8VArg(tag->comment)); int line_padding = DN_Max(100 - (DN_CAST(int) prefix.size + (DN_CppSpacePerIndent(cpp) * cpp->indent)), 0); DN_CppPrint(cpp, "%.*s", DN_STR_FMT(prefix)); for (int index = 0; index < line_padding; index++) @@ -610,7 +610,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_Str8 array_size = {}; if (cpp_array_size.column.string.size) - array_size = DN_Str8_InitF(tmem.arena, "[%.*s]", DN_STR_FMT(cpp_array_size.column.string)); + array_size = DN_Str8_FromF(tmem.arena, "[%.*s]", DN_STR_FMT(cpp_array_size.column.string)); // NOTE: Check if we're referencing a code generated type. If we // are, append the `emit_prefix` @@ -618,7 +618,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil { DN_Str8 find_name = DN_CGen_StripQualifiersOnCppType_(tmem.arena, emit_cpp_type); if (DN_CGen_WillCodeGenTypeName(cgen, find_name)) - emit_cpp_type = DN_Str8_InitF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(cpp_type.column.string)); + emit_cpp_type = DN_Str8_FromF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(cpp_type.column.string)); } int name_to_type_padding = 1 + longest_type_name - DN_CAST(int) emit_cpp_type.size; @@ -814,7 +814,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil // NOTE: CHeck the length of the string after turning it into emittable code DN_Str8 cpp_type_name = DN_CGen_StripQualifiersOnCppType_(tmem.arena, cpp_type.column.string); if (DN_CGen_WillCodeGenTypeName(cgen, cpp_type_name)) - cpp_type_name = DN_Str8_InitFFromTLS("%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(cpp_type_name)); + cpp_type_name = DN_Str8_FromTLSF("%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(cpp_type_name)); DN_Str8 cpp_type_name_no_templates = DN_CGen_ConvertTemplatesToEmittableLiterals_(tmem.arena, cpp_type_name); longest_cpp_type_name = DN_Max(longest_cpp_type_name, cpp_type_name_no_templates.size); @@ -849,7 +849,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil index_the_field_references = sub_row_index; } cpp_array_size_field_str8 = - DN_Str8_InitFFromTLS("&g_%.*s%.*s_type_fields[%zu]", + DN_Str8_FromTLSF("&g_%.*s%.*s_type_fields[%zu]", DN_STR_FMT(emit_prefix), DN_STR_FMT(struct_name.string), index_the_field_references); @@ -862,7 +862,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_USize cpp_name_padding = 1 + it.table->headers[cpp_name.index].longest_string - cpp_name.column.string.size; DN_USize cpp_type_padding = 1 + longest_cpp_type_name - cpp_type_name.size; - DN_Str8 cpp_type_enum = DN_Str8_InitFFromTLS("%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(orig_cpp_type_no_templates)); + DN_Str8 cpp_type_enum = DN_Str8_FromTLSF("%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(orig_cpp_type_no_templates)); DN_USize cpp_type_enum_padding = cpp_type_padding + (orig_cpp_type.size - cpp_type_name.size); DN_Str8 cpp_label_str8 = cpp_name.column.string; @@ -872,7 +872,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil cpp_label_str8_padding = 1 + it.table->headers[cpp_label.index].longest_string - cpp_label.column.string.size; } - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); // NOTE: row DN_Str8Builder_AppendF(&builder, "{%2d, ", row_index); @@ -962,8 +962,8 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); DN_USize cpp_name_padding = 1 + it.table->headers[cpp_name.index].longest_string - cpp_name.column.string.size; - DN_Str8 cpp_value_str8 = DN_Str8_HasData(cpp_value.column.string) ? cpp_value.column.string : DN_Str8_InitFFromTLS("%zu", row_index); - DN_Str8 cpp_type_enum = DN_Str8_InitFFromTLS("%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(struct_or_enum_name)); + DN_Str8 cpp_value_str8 = DN_Str8_HasData(cpp_value.column.string) ? cpp_value.column.string : DN_Str8_FromTLSF("%zu", row_index); + DN_Str8 cpp_type_enum = DN_Str8_FromTLSF("%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(struct_or_enum_name)); DN_Str8 cpp_label_str8 = cpp_name.column.string; DN_USize cpp_label_str8_padding = cpp_name_padding; @@ -1029,7 +1029,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_Str8 type_name = it.cgen_table_column[DN_CGenTableHeaderType_Name].string; if (DN_CGen_WillCodeGenTypeName(cgen, type_name)) - type_name = DN_Str8_InitF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); + type_name = DN_Str8_FromF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); longest_name_across_all_tables = DN_Max(longest_name_across_all_tables, DN_CAST(int) type_name.size); } @@ -1045,7 +1045,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_Str8 type_name = it.cgen_table_column[DN_CGenTableHeaderType_Name].string; if (DN_CGen_WillCodeGenTypeName(cgen, type_name)) - type_name = DN_Str8_InitF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); + type_name = DN_Str8_FromF(tmem.arena, "%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); longest_type_name = DN_Max(longest_type_name, type_name.size); } } @@ -1055,7 +1055,7 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); DN_Str8 type_name = it.cgen_table_column[DN_CGenTableHeaderType_Name].string; if (DN_CGen_WillCodeGenTypeName(cgen, type_name)) - type_name = DN_Str8_InitFFromTLS("%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); + type_name = DN_Str8_FromTLSF("%.*s%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(type_name)); int name_padding = 1 + longest_name_across_all_tables - DN_CAST(int) type_name.size; DN_Str8 type_info_kind = {}; @@ -1082,14 +1082,14 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil DN_CGenLookupColumnAtHeader cpp_name = DN_CGen_LookupColumnAtHeader(it.table, it.cgen_table_column[DN_CGenTableHeaderType_CppName].string, row); fields_count_int += DN_Str8_HasData(cpp_name.column.string); } - fields_count = DN_Str8_InitFFromTLS("%d", fields_count_int); + fields_count = DN_Str8_FromTLSF("%d", fields_count_int); } DN_Str8 fields = DN_STR8("NULL"); int fields_padding = 1; if (table->type != DN_CGenTableType_CodeGenBuiltinTypes) { fields_padding = name_padding; - fields = DN_Str8_InitF(tmem.arena, "g_%.*s_type_fields", DN_STR_FMT(type_name)); + fields = DN_Str8_FromF(tmem.arena, "g_%.*s_type_fields", DN_STR_FMT(type_name)); } DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); @@ -1130,10 +1130,10 @@ DN_API void DN_CGen_EmitCodeForTables(DN_CGen *cgen, DN_CGenEmit emit, DN_CppFil for (DN_CGenTable *table = cgen->first_table; table != 0; table = table->next) { for (DN_CGenLookupTableIterator it = {}; DN_CGen_LookupNextTableInCodeGenTable(cgen, table, &it);) { DN_Str8 enum_name = DN_CGen_ConvertTemplatesToEmittableLiterals_(tmem.arena, it.cgen_table_column[DN_CGenTableHeaderType_Name].string); - DN_Str8 full_enum_name = DN_Str8_InitF(tmem.arena, "%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(enum_name)); + DN_Str8 full_enum_name = DN_Str8_FromF(tmem.arena, "%.*sType_%.*s", DN_STR_FMT(emit_prefix), DN_STR_FMT(enum_name)); // NOTE: Builtin types don't have type info - DN_Str8 full_variable_name = DN_Str8_InitF(tmem.arena, "g_%.*s%.*s_type_fields", DN_STR_FMT(emit_prefix), DN_STR_FMT(enum_name)); + DN_Str8 full_variable_name = DN_Str8_FromF(tmem.arena, "g_%.*s%.*s_type_fields", DN_STR_FMT(emit_prefix), DN_STR_FMT(enum_name)); if (it.cgen_table->type == DN_CGenTableType_CodeGenBuiltinTypes) full_variable_name = DN_STR8("nullptr"); diff --git a/Source/Extra/dn_csv.cpp b/Source/Extra/dn_csv.cpp index aece9d2..208353c 100644 --- a/Source/Extra/dn_csv.cpp +++ b/Source/Extra/dn_csv.cpp @@ -250,7 +250,7 @@ static void DN_CSV_PackStr8(DN_CSVPack *pack, DN_CSVSerialise serialise, DN_Str8 { if (serialise == DN_CSVSerialise_Read) { DN_Str8 csv_value = DN_CSV_TokeniserNextColumn(&pack->read_tokeniser); - *str8 = DN_Str8_Copy(arena, csv_value); + *str8 = DN_Str8_FromStr8(arena, csv_value); } else { DN_Str8Builder_AppendF(&pack->write_builder, "%s%.*s", pack->write_column++ ? "," : "", DN_STR_FMT(*str8)); } diff --git a/Source/Extra/dn_helpers.cpp b/Source/Extra/dn_helpers.cpp index 0d78299..8569bc4 100644 --- a/Source/Extra/dn_helpers.cpp +++ b/Source/Extra/dn_helpers.cpp @@ -164,7 +164,7 @@ DN_API void DN_JSONBuilder_KeyValue(DN_JSONBuilder *builder, DN_Str8 key, DN_Str DN_API void DN_JSONBuilder_KeyValueFV(DN_JSONBuilder *builder, DN_Str8 key, char const *value_fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(builder->string_builder.arena); - DN_Str8 value = DN_Str8_InitFV(tmem.arena, value_fmt, args); + DN_Str8 value = DN_Str8_FromFV(tmem.arena, value_fmt, args); DN_JSONBuilder_KeyValue(builder, key, value); } diff --git a/Source/Extra/dn_math.cpp b/Source/Extra/dn_math.cpp index b48525c..bb2c417 100644 --- a/Source/Extra/dn_math.cpp +++ b/Source/Extra/dn_math.cpp @@ -1214,25 +1214,23 @@ DN_API DN_M4 DN_M4_DivF(DN_M4 lhs, DN_F32 rhs) return result; } - #if !defined(DN_NO_FSTR8) -DN_API DN_FStr8<256> DN_M4_ColumnMajorString(DN_M4 mat) +DN_API DN_Str8x256 DN_M4_ColumnMajorString(DN_M4 mat) { - DN_FStr8<256> result = {}; + DN_Str8x256 result = {}; for (int row = 0; row < 4; row++) { for (int it = 0; it < 4; it++) { if (it == 0) - DN_FStr8_Add(&result, DN_STR8("|")); - DN_FStr8_AddF(&result, "%.5f", mat.columns[it][row]); + DN_IStr8_AppendF(&result, "|"); + DN_IStr8_AppendF(&result, "%.5f", mat.columns[it][row]); if (it != 3) - DN_FStr8_Add(&result, DN_STR8(", ")); + DN_IStr8_AppendF(&result, ", "); else - DN_FStr8_Add(&result, DN_STR8("|\n")); + DN_IStr8_AppendF(&result, "|\n"); } } return result; } - #endif #endif // !defined(DN_M4) // NOTE: DN_M2x3 /////////////////////////////////////////////////////////////////////////////////// diff --git a/Source/Extra/dn_math.h b/Source/Extra/dn_math.h index 35a452d..1fa34c7 100644 --- a/Source/Extra/dn_math.h +++ b/Source/Extra/dn_math.h @@ -288,8 +288,8 @@ DN_U32 const DN_V4_A_MASK_U32 = 0x000000FF; #define DN_V4F32_From1N(x) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}} #define DN_V4F32_From4N(x, y, z, w) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z), (DN_F32)(w)}} #define DN_V4F32_FromV3And1N(xyz, w) DN_LITERAL(DN_V4F32){{xyz.x, xyz.y, xyz.z, w}} -#define DN_V4F32_FromRGBAU8(r, g, b, a) DN_LITERAL(DN_V4F32){r / 255.f, g / 255.f, b / 255.f, a / 255.f} -#define DN_V4F32_FromRGBU8(r, g, b) DN_LITERAL(DN_V4F32){r / 255.f, g / 255.f, b / 255.f, 1.f} +#define DN_V4F32_FromRGBAU8(r, g, b, a) DN_LITERAL(DN_V4F32){{r / 255.f, g / 255.f, b / 255.f, a / 255.f}} +#define DN_V4F32_FromRGBU8(r, g, b) DN_LITERAL(DN_V4F32){{r / 255.f, g / 255.f, b / 255.f, 1.f}} DN_API DN_V4F32 DN_V4F32_FromRGBU32(DN_U32 u32); DN_API DN_V4F32 DN_V4F32_FromRGBAU32(DN_U32 u32); #define DN_V4F32_FromV4Alpha(v4, alpha) DN_V4F32_FromV3And1N(v4.xyz, alpha) @@ -331,9 +331,7 @@ DN_API DN_M4 DN_M4_AddF (DN_M4 lhs, DN_ DN_API DN_M4 DN_M4_SubF (DN_M4 lhs, DN_F32 rhs); DN_API DN_M4 DN_M4_MulF (DN_M4 lhs, DN_F32 rhs); DN_API DN_M4 DN_M4_DivF (DN_M4 lhs, DN_F32 rhs); -#if !defined(DN_NO_FSTR8) -DN_API DN_FStr8<256> DN_M4_ColumnMajorString (DN_M4 mat); -#endif +DN_API DN_Str8x256 DN_M4_ColumnMajorString (DN_M4 mat); #endif // !defined(DN_NO_M4) // NOTE: DN_M2x3 /////////////////////////////////////////////////////////////////////////////////// DN_API bool operator== (DN_M2x3 const &lhs, DN_M2x3 const &rhs); diff --git a/Source/Extra/dn_net2_curl.cpp b/Source/Extra/dn_net2_curl.cpp index eab6f45..76c9e2f 100644 --- a/Source/Extra/dn_net2_curl.cpp +++ b/Source/Extra/dn_net2_curl.cpp @@ -34,7 +34,7 @@ static DN_NET2Response DN_NET2_WaitForAnyResponse(DN_NET2Core *net, DN_Arena *ar // NOTE: Deallocate the memory used in the request DN_Arena_PopTo(&request->arena, request->start_response_arena_pos); - request->response.body = DN_Str8Builder_Init(&request->arena); + request->response.body = DN_Str8Builder_FromArena(&request->arena); // NOTE: For websocket requests, notify the NET thread we've read data from it and it can go // back to polling the socket for more data @@ -70,7 +70,7 @@ static DN_NET2Response DN_NET2_WaitForResponse(DN_NET2Core *net, DN_NET2Request // NOTE: Deallocate the memory used in the request DN_Arena_PopTo(&request_ptr->arena, request_ptr->start_response_arena_pos); - request_ptr->response.body = DN_Str8Builder_Init(&request_ptr->arena); + request_ptr->response.body = DN_Str8Builder_FromArena(&request_ptr->arena); // NOTE: Decrement the global completion tracking semaphore (this is so that if you waited on // the net object's semaphore, you don't get a phantom wakeup because this function already @@ -267,12 +267,12 @@ static int32_t DN_NET2_ThreadEntryPoint_(DN_OSThread *thread) if (get_result == CURLE_OK) { request->response.status = DN_NET2RequestStatus_HTTPReceived; } else { - request->response.error = DN_Str8_InitF(&request->arena, "Failed to get HTTP response status (CURL %d): %s", msg->data.result, curl_easy_strerror(get_result)); + request->response.error = DN_Str8_FromF(&request->arena, "Failed to get HTTP response status (CURL %d): %s", msg->data.result, curl_easy_strerror(get_result)); request->response.status = DN_NET2RequestStatus_Error; } } else { request->response.status = DN_NET2RequestStatus_Error; - request->response.error = DN_Str8_InitF(&request->arena, + request->response.error = DN_Str8_FromF(&request->arena, "Net request to '%.*s' failed (CURL %d): %s", DN_STR_FMT(request->url), msg->data.result, @@ -364,7 +364,7 @@ static int32_t DN_NET2_ThreadEntryPoint_(DN_OSThread *thread) request->response.status = DN_NET2RequestStatus_WSReceived; if (receive_result != CURLE_OK) { request->response.status = DN_NET2RequestStatus_Error; - request->response.error = DN_Str8_InitF(&request->arena, + request->response.error = DN_Str8_FromF(&request->arena, "Websocket failed to receive data for '%.*s' (CURL %d): %s", DN_STR_FMT(request->url), receive_result, @@ -385,7 +385,7 @@ static void DN_NET2_Init(DN_NET2Core *net, char *ring_base, DN_USize ring_size, { net->base = base; net->base_size = base_size; - net->arena = DN_Arena_InitFromBuffer(net->base, net->base_size, DN_ArenaFlags_Nil); + net->arena = DN_Arena_FromBuffer(net->base, net->base_size, DN_ArenaFlags_Nil); net->ring.base = ring_base; net->ring.size = ring_size; net->ring_mutex = DN_OS_MutexInit(); @@ -480,7 +480,7 @@ static DN_NET2Request DN_NET2_DoRequest_(DN_NET2Core *net, DN_Str8 url, DN_Str8 if (request) { result.handle = DN_CAST(DN_U64) request; if (!request->arena.curr) - request->arena = DN_Arena_InitFromOSVMem(DN_Megabytes(1), DN_Kilobytes(1), DN_ArenaFlags_Nil); + request->arena = DN_Arena_FromVMem(DN_Megabytes(1), DN_Kilobytes(1), DN_ArenaFlags_Nil); request->type = type; request->gen = DN_Max(request->gen + 1, 1); @@ -503,7 +503,7 @@ static DN_NET2Request DN_NET2_DoRequest_(DN_NET2Core *net, DN_Str8 url, DN_Str8 } } - request->response.body = DN_Str8Builder_Init(&request->arena); + request->response.body = DN_Str8Builder_FromArena(&request->arena); request->completion_sem = DN_OS_SemaphoreInit(0); request->start_response_arena_pos = DN_Arena_Pos(&request->arena); diff --git a/Source/Extra/dn_tests.cpp b/Source/Extra/dn_tests.cpp index 8876858..f4e5809 100644 --- a/Source/Extra/dn_tests.cpp +++ b/Source/Extra/dn_tests.cpp @@ -316,7 +316,7 @@ static DN_UTCore DN_Tests_Arena() for (DN_UT_Test(&result, "Reused memory is zeroed out")) { uint8_t alignment = 1; DN_USize alloc_size = DN_Kilobytes(128); - DN_Arena arena = DN_Arena_InitFromOSVMem(0, 0, DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(0, 0, DN_ArenaFlags_Nil); DN_DEFER { DN_Arena_Deinit(&arena); @@ -345,7 +345,7 @@ static DN_UTCore DN_Tests_Arena() for (DN_UT_Test(&result, "Test arena grows naturally, 1mb + 4mb")) { // NOTE: Allocate 1mb, then 4mb, this should force the arena to grow - DN_Arena arena = DN_Arena_InitFromOSVMem(DN_Megabytes(2), DN_Megabytes(2), DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(DN_Megabytes(2), DN_Megabytes(2), DN_ArenaFlags_Nil); DN_DEFER { DN_Arena_Deinit(&arena); @@ -369,7 +369,7 @@ static DN_UTCore DN_Tests_Arena() } for (DN_UT_Test(&result, "Test arena grows naturally, 1mb, temp memory 4mb")) { - DN_Arena arena = DN_Arena_InitFromOSVMem(DN_Megabytes(2), DN_Megabytes(2), DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(DN_Megabytes(2), DN_Megabytes(2), DN_ArenaFlags_Nil); DN_DEFER { DN_Arena_Deinit(&arena); @@ -414,79 +414,79 @@ static DN_UTCore DN_Tests_Bin() DN_UT_LogF(&test, "DN_Bin\n"); { for (DN_UT_Test(&test, "Convert 0x123")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("0x123")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("0x123")); DN_UT_AssertF(&test, result == 0x123, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert 0xFFFF")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("0xFFFF")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("0xFFFF")); DN_UT_AssertF(&test, result == 0xFFFF, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert FFFF")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("FFFF")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("FFFF")); DN_UT_AssertF(&test, result == 0xFFFF, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert abCD")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("abCD")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("abCD")); DN_UT_AssertF(&test, result == 0xabCD, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert 0xabCD")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("0xabCD")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("0xabCD")); DN_UT_AssertF(&test, result == 0xabCD, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert 0x")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("0x")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("0x")); DN_UT_AssertF(&test, result == 0x0, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert 0X")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("0X")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("0X")); DN_UT_AssertF(&test, result == 0x0, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert 3")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("3")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("3")); DN_UT_AssertF(&test, result == 3, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert f")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("f")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("f")); DN_UT_AssertF(&test, result == 0xf, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert g")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("g")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("g")); DN_UT_AssertF(&test, result == 0, "result: %" PRIu64, result); } for (DN_UT_Test(&test, "Convert -0x3")) { - uint64_t result = DN_CVT_HexToU64(DN_STR8("-0x3")); + uint64_t result = DN_CVT_U64FromHex(DN_STR8("-0x3")); DN_UT_AssertF(&test, result == 0, "result: %" PRIu64, result); } uint32_t number = 0xd095f6; for (DN_UT_Test(&test, "Convert %x to string", number)) { - DN_Str8 number_hex = DN_CVT_BytesToHex(tmem.arena, &number, sizeof(number)); + DN_Str8 number_hex = DN_CVT_HexFromBytes(tmem.arena, &number, sizeof(number)); DN_UT_AssertF(&test, DN_Str8_Eq(number_hex, DN_STR8("f695d000")), "number_hex=%.*s", DN_STR_FMT(number_hex)); } number = 0xf6ed00; for (DN_UT_Test(&test, "Convert %x to string", number)) { - DN_Str8 number_hex = DN_CVT_BytesToHex(tmem.arena, &number, sizeof(number)); + DN_Str8 number_hex = DN_CVT_HexFromBytes(tmem.arena, &number, sizeof(number)); DN_UT_AssertF(&test, DN_Str8_Eq(number_hex, DN_STR8("00edf600")), "number_hex=%.*s", DN_STR_FMT(number_hex)); } DN_Str8 hex = DN_STR8("0xf6ed00"); for (DN_UT_Test(&test, "Convert %.*s to bytes", DN_STR_FMT(hex))) { - DN_Str8 bytes = DN_CVT_HexToBytes(tmem.arena, hex); + DN_Str8 bytes = DN_CVT_BytesFromHex(tmem.arena, hex); DN_UT_AssertF(&test, DN_Str8_Eq(bytes, DN_STR8("\xf6\xed\x00")), "number_hex=%.*s", - DN_STR_FMT(DN_CVT_BytesToHex(tmem.arena, bytes.data, bytes.size))); + DN_STR_FMT(DN_CVT_HexFromBytes(tmem.arena, bytes.data, bytes.size))); } } return test; @@ -808,7 +808,7 @@ static DN_UTCore DN_Tests_BaseContainers() { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); { - DN_Arena arena = DN_Arena_InitFromOSVMem(0, 0, DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(0, 0, DN_ArenaFlags_Nil); uint32_t const MAP_SIZE = 64; DN_DSMap map = DN_DSMap_Init(&arena, MAP_SIZE, DN_DSMapFlags_Nil); DN_DEFER @@ -861,7 +861,7 @@ static DN_UTCore DN_Tests_BaseContainers() } DN_ArenaTempMemScope temp_mem_scope = DN_ArenaTempMemScope(tmem.arena); - DN_Arena arena = DN_Arena_InitFromOSVMem(0, 0, DN_ArenaFlags_Nil); + DN_Arena arena = DN_Arena_FromVMem(0, 0, DN_ArenaFlags_Nil); uint32_t const MAP_SIZE = 64; DN_DSMap map = DN_DSMap_Init(&arena, MAP_SIZE, DN_DSMapFlags_Nil); DN_DEFER @@ -1332,24 +1332,6 @@ static DN_UTCore DN_Tests_BaseContainers() return result; } -static DN_UTCore DN_Tests_FStr8() -{ - DN_UTCore result = DN_UT_Init(); - DN_UT_LogF(&result, "DN_FStr8\n"); - { - for (DN_UT_Test(&result, "Append too much fails")) { - DN_FStr8<4> str = {}; - DN_UT_Assert(&result, !DN_FStr8_Add(&str, DN_STR8("abcde"))); - } - - for (DN_UT_Test(&result, "Append format string too much fails")) { - DN_FStr8<4> str = {}; - DN_UT_Assert(&result, !DN_FStr8_AddF(&str, "abcde")); - } - } - return result; -} - static DN_UTCore DN_Tests_Intrinsics() { DN_UTCore result = DN_UT_Init(); @@ -1428,8 +1410,8 @@ static DN_UTCore DN_Tests_Intrinsics() #if defined(DN_UNIT_TESTS_WITH_KECCAK) DN_GCC_WARNING_PUSH -DN_GCC_WARNING_DISABLE(-Wunused - parameter) -DN_GCC_WARNING_DISABLE(-Wsign - compare) +DN_GCC_WARNING_DISABLE(-Wunused-parameter) +DN_GCC_WARNING_DISABLE(-Wsign-compare) DN_MSVC_WARNING_PUSH DN_MSVC_WARNING_DISABLE(4244) @@ -1629,7 +1611,7 @@ DN_Str8 const DN_UT_HASH_STRING_[] = void DN_Tests_KeccakDispatch_(DN_UTCore *test, int hash_type, DN_Str8 input) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 input_hex = DN_CVT_BytesToHex(tmem.arena, input.data, input.size); + DN_Str8 input_hex = DN_CVT_HexFromBytes(tmem.arena, input.data, input.size); switch (hash_type) { case Hash_SHA3_224: { @@ -2105,7 +2087,7 @@ static DN_UTCore DN_Tests_Str8() for (DN_UT_Test(&result, "Initialise with format string")) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 string = DN_Str8_InitF(tmem.arena, "%s", "AB"); + DN_Str8 string = DN_Str8_FromF(tmem.arena, "%s", "AB"); DN_UT_AssertF(&result, string.size == 2, "size: %zu", string.size); DN_UT_AssertF(&result, string.data[0] == 'A', "string[0]: %c", string.data[0]); DN_UT_AssertF(&result, string.data[1] == 'B', "string[1]: %c", string.data[1]); @@ -2115,7 +2097,7 @@ static DN_UTCore DN_Tests_Str8() for (DN_UT_Test(&result, "Copy string")) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_Str8 string = DN_STR8("AB"); - DN_Str8 copy = DN_Str8_Copy(tmem.arena, string); + DN_Str8 copy = DN_Str8_FromStr8(tmem.arena, string); DN_UT_AssertF(&result, copy.size == 2, "size: %zu", copy.size); DN_UT_AssertF(&result, copy.data[0] == 'A', "copy[0]: %c", copy.data[0]); DN_UT_AssertF(&result, copy.data[1] == 'B', "copy[1]: %c", copy.data[1]); @@ -2190,28 +2172,28 @@ static DN_UTCore DN_Tests_Str8() DN_UT_Assert(&result, DN_CAST(bool) str_result == false); } - // NOTE: DN_Str8_BinarySplit /////////////////////////////////////////////////////////////////// + // NOTE: DN_Str8_BSplit /////////////////////////////////////////////////////////////////// { { char const *TEST_FMT = "Binary split \"%.*s\" with \"%.*s\""; DN_Str8 delimiter = DN_STR8("/"); DN_Str8 input = DN_STR8("abcdef"); for (DN_UT_Test(&result, TEST_FMT, DN_STR_FMT(input), DN_STR_FMT(delimiter))) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(input, delimiter); + DN_Str8BSplitResult split = DN_Str8_BSplit(input, delimiter); DN_UT_AssertF(&result, DN_Str8_Eq(split.lhs, DN_STR8("abcdef")), "[lhs=%.*s]", DN_STR_FMT(split.lhs)); DN_UT_AssertF(&result, DN_Str8_Eq(split.rhs, DN_STR8("")), "[rhs=%.*s]", DN_STR_FMT(split.rhs)); } input = DN_STR8("abc/def"); for (DN_UT_Test(&result, TEST_FMT, DN_STR_FMT(input), DN_STR_FMT(delimiter))) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(input, delimiter); + DN_Str8BSplitResult split = DN_Str8_BSplit(input, delimiter); DN_UT_AssertF(&result, DN_Str8_Eq(split.lhs, DN_STR8("abc")), "[lhs=%.*s]", DN_STR_FMT(split.lhs)); DN_UT_AssertF(&result, DN_Str8_Eq(split.rhs, DN_STR8("def")), "[rhs=%.*s]", DN_STR_FMT(split.rhs)); } input = DN_STR8("/abcdef"); for (DN_UT_Test(&result, TEST_FMT, DN_STR_FMT(input), DN_STR_FMT(delimiter))) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(input, delimiter); + DN_Str8BSplitResult split = DN_Str8_BSplit(input, delimiter); DN_UT_AssertF(&result, DN_Str8_Eq(split.lhs, DN_STR8("")), "[lhs=%.*s]", DN_STR_FMT(split.lhs)); DN_UT_AssertF(&result, DN_Str8_Eq(split.rhs, DN_STR8("abcdef")), "[rhs=%.*s]", DN_STR_FMT(split.rhs)); } @@ -2221,7 +2203,7 @@ static DN_UTCore DN_Tests_Str8() DN_Str8 delimiter = DN_STR8("-=-"); DN_Str8 input = DN_STR8("123-=-456"); for (DN_UT_Test(&result, "Binary split \"%.*s\" with \"%.*s\"", DN_STR_FMT(input), DN_STR_FMT(delimiter))) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(input, delimiter); + DN_Str8BSplitResult split = DN_Str8_BSplit(input, delimiter); DN_UT_AssertF(&result, DN_Str8_Eq(split.lhs, DN_STR8("123")), "[lhs=%.*s]", DN_STR_FMT(split.lhs)); DN_UT_AssertF(&result, DN_Str8_Eq(split.rhs, DN_STR8("456")), "[rhs=%.*s]", DN_STR_FMT(split.rhs)); } @@ -2474,7 +2456,6 @@ DN_TestsResult DN_Tests_RunSuite(DN_TestsPrint print) DN_Tests_Bin(), DN_Tests_BinarySearch(), DN_Tests_BaseContainers(), - DN_Tests_FStr8(), DN_Tests_Intrinsics(), #if defined(DN_UNIT_TESTS_WITH_KECCAK) DN_Tests_Keccak(), diff --git a/Source/OS/dn_os.cpp b/Source/OS/dn_os.cpp index 3a36170..a1ae50d 100644 --- a/Source/OS/dn_os.cpp +++ b/Source/OS/dn_os.cpp @@ -111,9 +111,9 @@ DN_API void DN_OS_Init(DN_OSCore *os, DN_OSInitArgs *args) { #if defined(DN_PLATFORM_EMSCRIPTEN) - os->arena = DN_Arena_InitFromOSHeap(DN_Megabytes(1), DN_ArenaFlags_NoAllocTrack); + os->arena = DN_Arena_FromHeap(DN_Megabytes(1), DN_ArenaFlags_NoAllocTrack); #else - os->arena = DN_Arena_InitFromOSVMem(DN_Megabytes(1), DN_Kilobytes(4), DN_ArenaFlags_NoAllocTrack); + os->arena = DN_Arena_FromVMem(DN_Megabytes(1), DN_Kilobytes(4), DN_ArenaFlags_NoAllocTrack); #endif #if defined(DN_PLATFORM_WIN32) @@ -298,8 +298,8 @@ DN_API DN_Str8 DN_OS_EXEDir(DN_Arena *arena) DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); DN_Str8 exe_path = DN_OS_EXEPath(tmem.arena); DN_Str8 separators[] = {DN_STR8("/"), DN_STR8("\\")}; - DN_Str8BinarySplitResult split = DN_Str8_BinarySplitLastArray(exe_path, separators, DN_ArrayCountU(separators)); - result = DN_Str8_Copy(arena, split.lhs); + DN_Str8BSplitResult split = DN_Str8_BSplitLastArray(exe_path, separators, DN_ArrayCountU(separators)); + result = DN_Str8_FromStr8(arena, split.lhs); return result; } @@ -463,7 +463,7 @@ DN_API DN_Str8 DN_OS_ReadAll(DN_Arena *arena, DN_Str8 path, DN_OSErrSink *error) result = DN_Str8_Alloc(arena, path_info.size, DN_ZeroMem_No); if (!DN_Str8_HasData(result)) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(path_info.size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(path_info.size); DN_OS_ErrSinkAppendF(error, 1 /*error_code*/, "Failed to allocate %.*s for reading file '%.*s'", DN_STR_FMT(buffer_size_str8), DN_STR_FMT(path)); DN_Arena_TempMemEnd(temp_mem); result = {}; @@ -493,7 +493,7 @@ DN_API bool DN_OS_WriteAll(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error) DN_API bool DN_OS_WriteAllFV(DN_Str8 file_path, DN_OSErrSink *error, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 buffer = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_WriteAll(file_path, buffer, error); return result; } @@ -510,7 +510,7 @@ DN_API bool DN_OS_WriteAllF(DN_Str8 file_path, DN_OSErrSink *error, DN_FMT_ATTRI DN_API bool DN_OS_WriteAllSafe(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 tmp_path = DN_Str8_InitF(tmem.arena, "%.*s.tmp", DN_STR_FMT(path)); + DN_Str8 tmp_path = DN_Str8_FromF(tmem.arena, "%.*s.tmp", DN_STR_FMT(path)); if (!DN_OS_WriteAll(tmp_path, buffer, error)) return false; if (!DN_OS_CopyFile(tmp_path, path, true /*overwrite*/, error)) @@ -523,7 +523,7 @@ DN_API bool DN_OS_WriteAllSafe(DN_Str8 path, DN_Str8 buffer, DN_OSErrSink *error DN_API bool DN_OS_WriteAllSafeFV(DN_Str8 path, DN_OSErrSink *error, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 buffer = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_WriteAllSafe(path, buffer, error); return result; } @@ -554,8 +554,8 @@ DN_API bool DN_OS_PathAddRef(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) fs_path->has_prefix_path_separator = (path.data[0] == '/'); for (;;) { - DN_Str8BinarySplitResult delimiter = DN_Str8_BinarySplitArray(path, delimiter_array, DN_ArrayCountU(delimiter_array)); - for (; delimiter.lhs.data; delimiter = DN_Str8_BinarySplitArray(delimiter.rhs, delimiter_array, DN_ArrayCountU(delimiter_array))) { + DN_Str8BSplitResult delimiter = DN_Str8_BSplitArray(path, delimiter_array, DN_ArrayCountU(delimiter_array)); + for (; delimiter.lhs.data; delimiter = DN_Str8_BSplitArray(delimiter.rhs, delimiter_array, DN_ArrayCountU(delimiter_array))) { if (delimiter.lhs.size <= 0) continue; @@ -583,7 +583,7 @@ DN_API bool DN_OS_PathAddRef(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) DN_API bool DN_OS_PathAdd(DN_Arena *arena, DN_OSPath *fs_path, DN_Str8 path) { - DN_Str8 copy = DN_Str8_Copy(arena, path); + DN_Str8 copy = DN_Str8_FromStr8(arena, path); bool result = DN_Str8_HasData(copy) ? true : DN_OS_PathAddRef(arena, fs_path, copy); return result; } @@ -592,7 +592,7 @@ DN_API bool DN_OS_PathAddF(DN_Arena *arena, DN_OSPath *fs_path, DN_FMT_ATTRIB ch { va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(arena, fmt, args); va_end(args); bool result = DN_OS_PathAddRef(arena, fs_path, path); return result; @@ -632,7 +632,7 @@ DN_API DN_Str8 DN_OS_PathToF(DN_Arena *arena, DN_Str8 path_separator, DN_FMT_ATT DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(tmem.arena, fmt, args); va_end(args); DN_Str8 result = DN_OS_PathTo(arena, path, path_separator); return result; @@ -649,7 +649,7 @@ DN_API DN_Str8 DN_OS_PathF(DN_Arena *arena, DN_FMT_ATTRIB char const *fmt, ...) DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); va_list args; va_start(args, fmt); - DN_Str8 path = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 path = DN_Str8_FromFV(tmem.arena, fmt, args); va_end(args); DN_Str8 result = DN_OS_Path(arena, path); return result; diff --git a/Source/OS/dn_os.h b/Source/OS/dn_os.h index 484482f..ff427bf 100644 --- a/Source/OS/dn_os.h +++ b/Source/OS/dn_os.h @@ -210,7 +210,7 @@ typedef DN_I32(DN_OSThreadFunc)(struct DN_OSThread *); struct DN_OSThread { - DN_FStr8<64> name; + DN_Str8x64 name; DN_OSTLS tls; DN_OSTLSInitArgs tls_init_args; void *handle; diff --git a/Source/OS/dn_os_allocator.cpp b/Source/OS/dn_os_allocator.cpp index b0a2ed0..bf44b5f 100644 --- a/Source/OS/dn_os_allocator.cpp +++ b/Source/OS/dn_os_allocator.cpp @@ -1,22 +1,25 @@ #define DN_OS_ALLOCATOR_CPP +#include "../dn_base_inc.h" +#include "../dn_os_inc.h" + static void *DN_Arena_BasicAllocFromOSHeap(DN_USize size) { void *result = DN_OS_MemAlloc(size, DN_ZeroMem_Yes); return result; } -DN_API DN_Arena DN_Arena_InitFromOSHeap(DN_U64 size, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromHeap(DN_U64 size, DN_ArenaFlags flags) { DN_ArenaMemFuncs mem_funcs = {}; mem_funcs.type = DN_ArenaMemFuncType_Basic; mem_funcs.basic_alloc = DN_Arena_BasicAllocFromOSHeap; mem_funcs.basic_dealloc = DN_OS_MemDealloc; - DN_Arena result = DN_Arena_InitFromMemFuncs(size, size, flags, mem_funcs); + DN_Arena result = DN_Arena_FromMemFuncs(size, size, flags, mem_funcs); return result; } -DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags) +DN_API DN_Arena DN_Arena_FromVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags) { DN_ArenaMemFuncs mem_funcs = {}; mem_funcs.type = DN_ArenaMemFuncType_VMem; @@ -24,7 +27,7 @@ DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaF mem_funcs.vmem_reserve = DN_OS_MemReserve; mem_funcs.vmem_commit = DN_OS_MemCommit; mem_funcs.vmem_release = DN_OS_MemRelease; - DN_Arena result = DN_Arena_InitFromMemFuncs(reserve, commit, flags, mem_funcs); + DN_Arena result = DN_Arena_FromMemFuncs(reserve, commit, flags, mem_funcs); return result; } diff --git a/Source/OS/dn_os_allocator.h b/Source/OS/dn_os_allocator.h index 8686fb2..81a74c0 100644 --- a/Source/OS/dn_os_allocator.h +++ b/Source/OS/dn_os_allocator.h @@ -1,7 +1,7 @@ #if !defined(DN_OS_ALLOCATOR_H) #define DN_OS_ALLOCATOR_H -DN_API DN_Arena DN_Arena_InitFromOSHeap(DN_U64 size, DN_ArenaFlags flags); -DN_API DN_Arena DN_Arena_InitFromOSVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromOSHeap(DN_U64 size, DN_ArenaFlags flags); +DN_API DN_Arena DN_Arena_FromVMem(DN_U64 reserve, DN_U64 commit, DN_ArenaFlags flags); #endif // !defined(DN_OS_ALLOCATOR_H) diff --git a/Source/OS/dn_os_posix.cpp b/Source/OS/dn_os_posix.cpp index ae4ca2e..f454076 100644 --- a/Source/OS/dn_os_posix.cpp +++ b/Source/OS/dn_os_posix.cpp @@ -399,8 +399,8 @@ DN_API bool DN_OS_CopyFile(DN_Str8 src, DN_Str8 dest, bool overwrite, DN_OSErrSi if (!result) { int error_code = errno; DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 file_size_str8 = DN_CVT_U64ToBytesStr8(tmem.arena, stat_existing.st_size, DN_CVTBytesType_Auto); - DN_Str8 bytes_written_str8 = DN_CVT_U64ToBytesStr8(tmem.arena, bytes_written, DN_CVTBytesType_Auto); + DN_Str8 file_size_str8 = DN_CVT_BytesStr8FromU64(tmem.arena, stat_existing.st_size, DN_CVTBytesType_Auto); + DN_Str8 bytes_written_str8 = DN_CVT_BytesStr8FromU64(tmem.arena, bytes_written, DN_CVTBytesType_Auto); DN_OS_ErrSinkAppendF(error, error_code, "Failed to copy file '%.*s' to '%.*s', we copied %.*s but the file " @@ -630,7 +630,7 @@ DN_API DN_OSFileRead DN_OS_FileRead(DN_OSFile *file, void *buffer, DN_USize size result.bytes_read = fread(buffer, 1, size, DN_CAST(FILE *) file->handle); if (feof(DN_CAST(FILE*)file->handle)) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, 1, "Failed to read %S from file", buffer_size_str8); return result; } @@ -648,7 +648,7 @@ DN_API bool DN_OS_FileWritePtr(DN_OSFile *file, void const *buffer, DN_USize siz 1 /*count*/; if (!result) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, 1, "Failed to write buffer (%s) to file handle", DN_STR_FMT(buffer_size_str8)); } return result; @@ -761,7 +761,7 @@ DN_API DN_OSExecResult DN_OS_ExecWait(DN_OSExecAsyncHandle handle, DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); if (arena && handle.stdout_read) { char buffer[4096]; - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); for (;;) { ssize_t bytes_read = read(stdout_pipe[DN_OSPipeType__Read], buffer, sizeof(buffer)); @@ -775,7 +775,7 @@ DN_API DN_OSExecResult DN_OS_ExecWait(DN_OSExecAsyncHandle handle, if (arena && handle.stderr_read) { char buffer[4096]; - DN_Str8Builder builder = DN_Str8Builder_Init(tmem.arena); + DN_Str8Builder builder = DN_Str8Builder_FromArena(tmem.arena); for (;;) { ssize_t bytes_read = read(stderr_pipe[DN_OSPipeType__Read], buffer, sizeof(buffer)); @@ -1335,7 +1335,7 @@ DN_API DN_POSIXProcSelfStatus DN_Posix_ProcSelfStatus() DN_Str8 const VM_PEAK = DN_STR8("VmPeak:"); DN_Str8 const VM_SIZE = DN_STR8("VmSize:"); DN_Str8 status_buf = DN_Str8Builder_BuildFromTLS(&builder); - DN_Slice lines = DN_Str8_SplitAllocFromTLS(status_buf, DN_STR8("\n"), DN_Str8SplitIncludeEmptyStrings_No); + DN_Slice lines = DN_Str8_SplitFromTLS(status_buf, DN_STR8("\n"), DN_Str8SplitIncludeEmptyStrings_No); for (DN_ForIt(line_it, DN_Str8, &lines)) { DN_Str8 line = DN_Str8_TrimWhitespaceAround(*line_it.data); @@ -1351,14 +1351,14 @@ DN_API DN_POSIXProcSelfStatus DN_Posix_ProcSelfStatus() } else if (DN_Str8_StartsWith(line, VM_SIZE, DN_Str8EqCase_Insensitive)) { DN_Str8 size_with_kb = DN_Str8_TrimWhitespaceAround(DN_Str8_Slice(line, VM_SIZE.size, line.size)); DN_Assert(DN_Str8_EndsWith(size_with_kb, DN_STR8("kB"))); - DN_Str8 vm_size = DN_Str8_BinarySplit(size_with_kb, DN_STR8(" ")).lhs; + DN_Str8 vm_size = DN_Str8_BSplit(size_with_kb, DN_STR8(" ")).lhs; DN_Str8ToU64Result to_u64 = DN_Str8_ToU64(vm_size, 0); result.vm_size = DN_Kilobytes(to_u64.value); DN_Assert(to_u64.success); } else if (DN_Str8_StartsWith(line, VM_PEAK, DN_Str8EqCase_Insensitive)) { DN_Str8 size_with_kb = DN_Str8_TrimWhitespaceAround(DN_Str8_Slice(line, VM_PEAK.size, line.size)); DN_Assert(DN_Str8_EndsWith(size_with_kb, DN_STR8("kB"))); - DN_Str8 vm_size = DN_Str8_BinarySplit(size_with_kb, DN_STR8(" ")).lhs; + DN_Str8 vm_size = DN_Str8_BSplit(size_with_kb, DN_STR8(" ")).lhs; DN_Str8ToU64Result to_u64 = DN_Str8_ToU64(vm_size, 0); result.vm_peak = DN_Kilobytes(to_u64.value); DN_Assert(to_u64.success); @@ -1471,7 +1471,7 @@ DN_API void DN_OS_HttpRequestAsync(DN_OSHttpResponse *response, if (method.size >= sizeof(fetch_attribs.requestMethod)) { response->error_msg = - DN_Str8_InitF(arena, + DN_Str8_FromF(arena, "Request method in EM has a size limit of 31 characters, method was " "'%.*s' which is %zu characters long", DN_STR_FMT(method), @@ -1493,7 +1493,7 @@ DN_API void DN_OS_HttpRequestAsync(DN_OSHttpResponse *response, fetch_attribs.onerror = DN_OS_HttpRequestEMFetchOnErrorCallback; fetch_attribs.userData = response; - DN_Str8 url = DN_Str8_InitF(tmem, "%.*s%.*s", DN_STR_FMT(host), DN_STR_FMT(path)); + DN_Str8 url = DN_Str8_FromF(tmem, "%.*s%.*s", DN_STR_FMT(host), DN_STR_FMT(path)); DN_LOG_InfoF("Initiating HTTP '%s' request to '%.*s' with payload '%.*s'", fetch_attribs.requestMethod, DN_STR_FMT(url), diff --git a/Source/OS/dn_os_string.cpp b/Source/OS/dn_os_string.cpp index a7c7823..844953f 100644 --- a/Source/OS/dn_os_string.cpp +++ b/Source/OS/dn_os_string.cpp @@ -1,17 +1,31 @@ #define DN_OS_STRING_CPP -// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// +#include "../dn_base_inc.h" +#include "../dn_os_inc.h" -DN_API DN_Str8 DN_Str8_InitFFromFrame(DN_FMT_ATTRIB char const *fmt, ...) +// NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// +DN_API DN_Str8 DN_Str8_FromFrameF(DN_FMT_ATTRIB char const *fmt, ...) { va_list args; va_start(args, fmt); - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSGet()->frame_arena, fmt, args); + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSGet()->frame_arena, fmt, args); va_end(args); return result; } -DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) +DN_API DN_Str8 DN_Str8_FromFrameFV(DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSGet()->frame_arena, fmt, args); + return result; +} + +DN_API DN_Str8 DN_Str8_FromFrame(DN_USize size, DN_ZeroMem zero_mem) +{ + DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSGet()->frame_arena, size, zero_mem); + return result; +} + +DN_API DN_Str8 DN_Str8_FromHeapF(DN_FMT_ATTRIB char const *fmt, ...) { va_list args; va_start(args, fmt); @@ -19,7 +33,7 @@ DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) DN_Str8 result = {}; DN_USize size = DN_CStr8_FVSize(fmt, args); if (size) { - result = DN_Str8_AllocFromOSHeap(size, DN_ZeroMem_No); + result = DN_Str8_FromHeap(size, DN_ZeroMem_No); if (DN_Str8_HasData(result)) DN_VSNPrintF(result.data, DN_SaturateCastISizeToInt(size + 1 /*null-terminator*/), fmt, args); } @@ -28,34 +42,7 @@ DN_API DN_Str8 DN_Str8_InitFFromOSHeap(DN_FMT_ATTRIB char const *fmt, ...) return result; } -DN_API DN_Str8 DN_Str8_InitFFromTLS(DN_FMT_ATTRIB char const *fmt, ...) -{ - va_list args; - va_start(args, fmt); - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSTopArena(), fmt, args); - va_end(args); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFVFromFrame(DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSGet()->frame_arena, fmt, args); - return result; -} - -DN_API DN_Str8 DN_Str8_InitFVFromTLS(DN_FMT_ATTRIB char const *fmt, va_list args) -{ - DN_Str8 result = DN_Str8_InitFV(DN_OS_TLSTopArena(), fmt, args); - return result; -} - -DN_API DN_Str8 DN_Str8_AllocFromFrame(DN_USize size, DN_ZeroMem zero_mem) -{ - DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSGet()->frame_arena, size, zero_mem); - return result; -} - -DN_API DN_Str8 DN_Str8_AllocFromOSHeap(DN_USize size, DN_ZeroMem zero_mem) +DN_API DN_Str8 DN_Str8_FromHeap(DN_USize size, DN_ZeroMem zero_mem) { DN_Str8 result = {}; result.data = DN_CAST(char *)DN_OS_MemAlloc(size + 1, zero_mem); @@ -65,31 +52,47 @@ DN_API DN_Str8 DN_Str8_AllocFromOSHeap(DN_USize size, DN_ZeroMem zero_mem) return result; } -DN_API DN_Str8 DN_Str8_AllocFromTLS(DN_USize size, DN_ZeroMem zero_mem) +DN_API DN_Str8 DN_Str8_FromTLSFV(DN_FMT_ATTRIB char const *fmt, va_list args) +{ + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSTopArena(), fmt, args); + return result; +} + + +DN_API DN_Str8 DN_Str8_FromTLSF(DN_FMT_ATTRIB char const *fmt, ...) +{ + va_list args; + va_start(args, fmt); + DN_Str8 result = DN_Str8_FromFV(DN_OS_TLSTopArena(), fmt, args); + va_end(args); + return result; +} + +DN_API DN_Str8 DN_Str8_FromTLS(DN_USize size, DN_ZeroMem zero_mem) { DN_Str8 result = DN_Str8_Alloc(DN_OS_TLSTopArena(), size, zero_mem); return result; } -DN_API DN_Str8 DN_Str8_CopyFromFrame(DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8Frame(DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(DN_OS_TLSGet()->frame_arena, string); + DN_Str8 result = DN_Str8_FromStr8(DN_OS_TLSGet()->frame_arena, string); return result; } -DN_API DN_Str8 DN_Str8_CopyFromTLS(DN_Str8 string) +DN_API DN_Str8 DN_Str8_FromStr8TLS(DN_Str8 string) { - DN_Str8 result = DN_Str8_Copy(DN_OS_TLSTopArena(), string); + DN_Str8 result = DN_Str8_FromStr8(DN_OS_TLSTopArena(), string); return result; } -DN_API DN_Slice DN_Str8_SplitAllocFromFrame(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) +DN_API DN_Slice DN_Str8_SplitFromFrame(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) { DN_Slice result = DN_Str8_SplitAlloc(DN_OS_TLSGet()->frame_arena, string, delimiter, mode); return result; } -DN_API DN_Slice DN_Str8_SplitAllocFromTLS(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) +DN_API DN_Slice DN_Str8_SplitFromTLS(DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode) { DN_Slice result = DN_Str8_SplitAlloc(DN_OS_TLSTopArena(), string, delimiter, mode); return result; @@ -171,14 +174,14 @@ DN_API DN_Str8DotTruncateResult DN_Str8_DotTruncateMiddleFromTLS(DN_Str8 str8, u DN_API DN_Str8 DN_Str8_PadNewLines(DN_Arena *arena, DN_Str8 src, DN_Str8 pad) { // TODO: Implement this without requiring TLS so it can go into base strings - DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(src, DN_STR8("\n")); + DN_Str8BSplitResult split = DN_Str8_BSplit(src, DN_STR8("\n")); while (split.lhs.size) { DN_Str8Builder_AppendRef(&builder, pad); DN_Str8Builder_AppendRef(&builder, split.lhs); - split = DN_Str8_BinarySplit(split.rhs, DN_STR8("\n")); + split = DN_Str8_BSplit(split.rhs, DN_STR8("\n")); if (split.lhs.size) DN_Str8Builder_AppendRef(&builder, DN_STR8("\n")); } @@ -233,12 +236,12 @@ DN_API DN_Str8 DN_Str8_Replace(DN_Str8 string, // TODO: Implement this without requiring TLS so it can go into base strings DN_Str8 result = {}; if (!DN_Str8_HasData(string) || !DN_Str8_HasData(find) || find.size > string.size || find.size == 0 || string.size == 0) { - result = DN_Str8_Copy(arena, string); + result = DN_Str8_FromStr8(arena, string); return result; } - DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); - DN_Str8Builder string_builder = DN_Str8Builder_Init(tmem.arena); + DN_OSTLSTMem tmem = DN_OS_TLSTMem(arena); + DN_Str8Builder string_builder = DN_Str8Builder_FromArena(tmem.arena); DN_USize max = string.size - find.size; DN_USize head = start_index; @@ -265,7 +268,7 @@ DN_API DN_Str8 DN_Str8_Replace(DN_Str8 string, if (string_builder.string_size == 0) { // NOTE: No replacement possible, so we just do a full-copy - result = DN_Str8_Copy(arena, string); + result = DN_Str8_FromStr8(arena, string); } else { DN_Str8 remainder = DN_Str8_Init(string.data + head, string.size - head); DN_Str8Builder_AppendRef(&string_builder, remainder); @@ -282,7 +285,6 @@ DN_API DN_Str8 DN_Str8_ReplaceInsensitive(DN_Str8 string, DN_Str8 find, DN_Str8 } // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// - DN_API DN_Str8 DN_Str8Builder_BuildFromOSHeap(DN_Str8Builder const *builder) { DN_Str8 result = DN_ZeroInit; diff --git a/Source/OS/dn_os_string.h b/Source/OS/dn_os_string.h index c39408c..711741f 100644 --- a/Source/OS/dn_os_string.h +++ b/Source/OS/dn_os_string.h @@ -1,24 +1,24 @@ #if !defined(DN_OS_STRING_H) #define DN_OS_STRING_H +#include "../dn_base_inc.h" +#include "../dn_os_inc.h" + // NOTE: DN_Str8 /////////////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8 DN_Str8_InitFFromFrame (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFFromOSHeap (DN_FMT_ATTRIB char const *fmt, ...); -DN_API DN_Str8 DN_Str8_InitFFromTLS (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFrameFV (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromFrameF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromFrame (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromHeapF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromHeap (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromTLSFV (DN_FMT_ATTRIB char const *fmt, va_list args); +DN_API DN_Str8 DN_Str8_FromTLSF (DN_FMT_ATTRIB char const *fmt, ...); +DN_API DN_Str8 DN_Str8_FromTLS (DN_USize size, DN_ZeroMem zero_mem); +DN_API DN_Str8 DN_Str8_FromStr8Frame (DN_Str8 string); +DN_API DN_Str8 DN_Str8_FromStr8TLS (DN_Str8 string); -DN_API DN_Str8 DN_Str8_InitFVFromFrame (DN_FMT_ATTRIB char const *fmt, va_list args); -DN_API DN_Str8 DN_Str8_InitFVFromTLS (DN_FMT_ATTRIB char const *fmt, va_list args); - -DN_API DN_Str8 DN_Str8_AllocFromFrame (DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_AllocFromOSHeap (DN_USize size, DN_ZeroMem zero_mem); -DN_API DN_Str8 DN_Str8_AllocFromTLS (DN_USize size, DN_ZeroMem zero_mem); - -DN_API DN_Str8 DN_Str8_CopyFromFrame (DN_Arena *arena, DN_Str8 string); -DN_API DN_Str8 DN_Str8_CopyFromTLS (DN_Arena *arena, DN_Str8 string); - -DN_API DN_Slice DN_Str8_SplitAllocFromFrame (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); -DN_API DN_Slice DN_Str8_SplitAllocFromTLS (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitFromFrame (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); +DN_API DN_Slice DN_Str8_SplitFromTLS (DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); DN_API DN_Str8 DN_Str8_SegmentFromFrame (DN_Str8 src, DN_USize segment_size, char segment_char); DN_API DN_Str8 DN_Str8_SegmentFromTLS (DN_Str8 src, DN_USize segment_size, char segment_char); @@ -50,19 +50,19 @@ DN_API DN_Str8 DN_Str8_ReplaceInsensitive (DN_Str8 s // NOTE: DN_Str8Builder //////////////////////////////////////////////////////////////////////////// -DN_API DN_Str8Builder DN_Str8Builder_InitFromFrame () { return DN_Str8Builder_Init(DN_OS_TLSGet()->frame_arena); } -DN_API DN_Str8Builder DN_Str8Builder_InitFromTLS () { return DN_Str8Builder_Init(DN_OS_TLSTopArena()); } +DN_API DN_Str8Builder DN_Str8Builder_FromArena () { return DN_Str8Builder_FromArena(DN_OS_TLSGet()->frame_arena); } +DN_API DN_Str8Builder DN_Str8Builder_FromTLS () { return DN_Str8Builder_FromArena(DN_OS_TLSTopArena()); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRefFromFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayRef(DN_OS_TLSGet()->frame_arena, strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayRefFromTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayRef(DN_OS_TLSTopArena(), strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopyFromFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayCopy(DN_OS_TLSGet()->frame_arena, strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_InitArrayCopyFromTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_InitArrayCopy(DN_OS_TLSTopArena(), strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRefFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrRef(DN_OS_TLSGet()->frame_arena, strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrRefTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrRef(DN_OS_TLSTopArena(), strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopyFrame (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrCopy(DN_OS_TLSGet()->frame_arena, strings, size); } +DN_API DN_Str8Builder DN_Str8Builder_FromStr8PtrCopyTLS (DN_Str8 const *strings, DN_USize size) { return DN_Str8Builder_FromStr8PtrCopy(DN_OS_TLSTopArena(), strings, size); } -DN_API DN_Str8Builder DN_Str8Builder_CopyFromFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_Copy(DN_OS_TLSGet()->frame_arena, builder); } -DN_API DN_Str8Builder DN_Str8Builder_CopyFromTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_Copy(DN_OS_TLSTopArena(), builder); } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilderFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_FromBuilder(DN_OS_TLSGet()->frame_arena, builder); } +DN_API DN_Str8Builder DN_Str8Builder_FromBuilderTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_FromBuilder(DN_OS_TLSTopArena(), builder); } DN_API DN_Str8 DN_Str8Builder_BuildFromFrame (DN_Str8Builder const *builder) { return DN_Str8Builder_Build(builder, DN_OS_TLSGet()->frame_arena); } -DN_API DN_Str8 DN_Str8Builder_BuildFromOSHeap (DN_Str8Builder const *builder, DN_Arena *arena); +DN_API DN_Str8 DN_Str8Builder_BuildFromHeap (DN_Str8Builder const *builder, DN_Arena *arena); DN_API DN_Str8 DN_Str8Builder_BuildFromTLS (DN_Str8Builder const *builder) { return DN_Str8Builder_Build(builder, DN_OS_TLSTopArena()); } DN_API DN_Str8 DN_Str8Builder_BuildDelimitedFromFrame(DN_Str8Builder const *builder, DN_Str8 delimiter) { return DN_Str8Builder_BuildDelimited(builder, delimiter, DN_OS_TLSGet()->frame_arena); } diff --git a/Source/OS/dn_os_tls.cpp b/Source/OS/dn_os_tls.cpp index e413de0..0a4a827 100644 --- a/Source/OS/dn_os_tls.cpp +++ b/Source/OS/dn_os_tls.cpp @@ -38,8 +38,8 @@ DN_API void DN_OS_TLSInit(DN_OSTLS *tls, DN_OSTLSInitArgs args) for (DN_ForItCArray(it, DN_Arena, tls->arenas)) { DN_Arena *arena = it.data; switch (DN_CAST(DN_OSTLSArena) it.index) { - default: *arena = DN_Arena_InitFromOSVMem(reserve, commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; - case DN_OSTLSArena_ErrorSink: *arena = DN_Arena_InitFromOSVMem(err_sink_reserve, err_sink_commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; + default: *arena = DN_Arena_FromVMem(reserve, commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; + case DN_OSTLSArena_ErrorSink: *arena = DN_Arena_FromVMem(err_sink_reserve, err_sink_commit, DN_ArenaFlags_AllocCanLeak | DN_ArenaFlags_NoAllocTrack); break; case DN_OSTLSArena_Count: DN_InvalidCodePath; break; } } @@ -166,7 +166,7 @@ DN_API DN_OSErrSink *DN_OS_ErrSinkBegin_(DN_OSErrSinkMode mode, DN_CallSite call DN_USize arena_pos = DN_Arena_Pos(result->arena); if (tls->err_sink.stack_size == DN_ArrayCountU(err->stack)) { - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); DN_USize counter = 0; for (DN_ForItSize(it, DN_OSErrSinkNode, err->stack, err->stack_size)) { DN_MSVC_WARNING_PUSH @@ -222,9 +222,9 @@ DN_API DN_OSErrSinkMsg *DN_OS_ErrSinkEnd(DN_Arena *arena, DN_OSErrSink *err) DN_OSErrSinkMsg *prev = nullptr; for (DN_OSErrSinkMsg *it = node->msg_sentinel->next; it != node->msg_sentinel; it = it->next) { DN_OSErrSinkMsg *entry = DN_Arena_New(arena, DN_OSErrSinkMsg, DN_ZeroMem_Yes); - entry->msg = DN_Str8_Copy(arena, it->msg); - entry->call_site = it->call_site; - entry->error_code = it->error_code; + entry->msg = DN_Str8_FromStr8(arena, it->msg); + entry->call_site = it->call_site; + entry->error_code = it->error_code; if (!result) result = entry; // Assign first entry if we haven't yet if (prev) @@ -280,7 +280,7 @@ DN_API DN_Str8 DN_OS_ErrSinkEndStr8(DN_Arena *arena, DN_OSErrSink *err) // NOTE: Walk the list and allocate it onto the user's arena DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(arena); - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); DN_OSErrSinkNode *node = err->stack + (err->stack_size - 1); DN_OS_ErrSinkAddMsgToStr8Builder_(&builder, node->msg_sentinel->next, node->msg_sentinel); @@ -310,7 +310,7 @@ DN_API bool DN_OS_ErrSinkEndAndLogError_(DN_OSErrSink *err, DN_CallSite call_sit if (!msg) return false; - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); if (DN_Str8_HasData(err_msg)) { DN_Str8Builder_AppendRef(&builder, err_msg); DN_Str8Builder_AppendRef(&builder, DN_STR8(":")); @@ -333,7 +333,7 @@ DN_API bool DN_OS_ErrSinkEndAndLogError_(DN_OSErrSink *err, DN_CallSite call_sit DN_API bool DN_OS_ErrSinkEndAndLogErrorFV_(DN_OSErrSink *err, DN_CallSite call_site, DN_FMT_ATTRIB char const *fmt, va_list args) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 log = DN_Str8_InitFV(tmem.arena, fmt, args); + DN_Str8 log = DN_Str8_FromFV(tmem.arena, fmt, args); bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); return result; } @@ -343,8 +343,8 @@ DN_API bool DN_OS_ErrSinkEndAndLogErrorF_(DN_OSErrSink *err, DN_CallSite call_si va_list args; va_start(args, fmt); DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); - DN_Str8 log = DN_Str8_InitFV(tmem.arena, fmt, args); - bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); + DN_Str8 log = DN_Str8_FromFV(tmem.arena, fmt, args); + bool result = DN_OS_ErrSinkEndAndLogError_(err, call_site, log); va_end(args); return result; } @@ -375,7 +375,7 @@ DN_API void DN_OS_ErrSinkAppendFV_(DN_OSErrSink *err, DN_U32 error_code, DN_FMT_ DN_OSErrSinkMsg *msg = DN_Arena_New(err->arena, DN_OSErrSinkMsg, DN_ZeroMem_Yes); if (DN_Check(msg)) { - msg->msg = DN_Str8_InitFV(err->arena, fmt, args); + msg->msg = DN_Str8_FromFV(err->arena, fmt, args); msg->error_code = error_code; msg->call_site = DN_OS_TLSGet()->call_site; DN_DLList_Prepend(node->msg_sentinel, msg); diff --git a/Source/OS/dn_os_w32.cpp b/Source/OS/dn_os_w32.cpp index 5dc0a20..f1883ff 100644 --- a/Source/OS/dn_os_w32.cpp +++ b/Source/OS/dn_os_w32.cpp @@ -596,7 +596,7 @@ DN_API DN_OSFileRead DN_OS_FileRead(DN_OSFile *file, void *buffer, DN_USize size DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); if (!DN_Check(size <= (unsigned long)-1)) { - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF( err, 1 /*error_code*/, @@ -652,7 +652,7 @@ DN_API bool DN_OS_FileWritePtr(DN_OSFile *file, void const *buffer, DN_USize siz if (!result) { DN_OSTLSTMem tmem = DN_OS_TLSTMem(nullptr); DN_W32Error win_error = DN_W32_LastError(tmem.arena); - DN_Str8 buffer_size_str8 = DN_CVT_U64ToBytesStr8AutoFromTLS(size); + DN_Str8 buffer_size_str8 = DN_CVT_BytesStr8FromU64AutoTLS(size); DN_OS_ErrSinkAppendF(err, win_error.code, "Failed to write buffer (%.*s) to file handle: %.*s", DN_STR_FMT(buffer_size_str8), DN_STR_FMT(win_error.msg)); } return result; @@ -855,7 +855,7 @@ DN_API DN_OSExecAsyncHandle DN_OS_ExecAsync(DN_Slice cmd_line, DN_OSExe DN_Str16 cmd16 = DN_W32_Str8ToStr16(tmem.arena, cmd_rendered); DN_Str16 working_dir16 = DN_W32_Str8ToStr16(tmem.arena, args->working_dir); - DN_Str8Builder env_builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder env_builder = DN_Str8Builder_FromTLS(); DN_Str8Builder_AppendArrayRef(&env_builder, args->environment.data, args->environment.size); if (env_builder.string_size) DN_Str8Builder_AppendRef(&env_builder, DN_STR8("\0")); @@ -1277,7 +1277,7 @@ DN_API void DN_W32_ThreadSetName(DN_Str8 name) #pragma pack(pop) - DN_Str8 copy = DN_Str8_Copy(tmem.arena, name); + DN_Str8 copy = DN_Str8_FromStr8(tmem.arena, name); DN_W32ThreadNameInfo info = {}; info.dwType = 0x1000; info.szName = (char *)copy.data; @@ -1685,7 +1685,7 @@ DN_API DN_Str8 DN_W32_Str16ToStr8FromHeap(DN_Str16 src) // NOTE: Str8 allocate ensures there's one extra byte for // null-termination already so no-need to +1 the required size - DN_Str8 buffer = DN_Str8_AllocFromOSHeap(required_size, DN_ZeroMem_No); + DN_Str8 buffer = DN_Str8_FromHeap(required_size, DN_ZeroMem_No); if (!DN_Str8_HasData(buffer)) return result; diff --git a/Source/SIMD/dn_simd_avx512f.cpp b/Source/SIMD/dn_simd_avx512f.cpp index 24373cc..07a8794 100644 --- a/Source/SIMD/dn_simd_avx512f.cpp +++ b/Source/SIMD/dn_simd_avx512f.cpp @@ -207,9 +207,9 @@ DN_API DN_Str8FindResult DN_SIMD_Str8FindLastAVX512F(DN_Str8 string, DN_Str8 fin return result; } -DN_API DN_Str8BinarySplitResult DN_SIMD_Str8BinarySplitAVX512F(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_SIMD_Str8BSplitAVX512F(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; DN_Str8FindResult find_result = DN_SIMD_Str8FindAVX512F(string, find); if (find_result.found) { result.lhs.data = string.data; @@ -222,9 +222,9 @@ DN_API DN_Str8BinarySplitResult DN_SIMD_Str8BinarySplitAVX512F(DN_Str8 string, D return result; } -DN_API DN_Str8BinarySplitResult DN_SIMD_Str8BinarySplitLastAVX512F(DN_Str8 string, DN_Str8 find) +DN_API DN_Str8BSplitResult DN_SIMD_Str8BSplitLastAVX512F(DN_Str8 string, DN_Str8 find) { - DN_Str8BinarySplitResult result = {}; + DN_Str8BSplitResult result = {}; DN_Str8FindResult find_result = DN_SIMD_Str8FindLastAVX512F(string, find); if (find_result.found) { result.lhs.data = string.data; @@ -243,10 +243,10 @@ DN_API DN_USize DN_SIMD_Str8SplitAVX512F(DN_Str8 string, DN_Str8 delimiter, DN_S if (!DN_Str8_HasData(string) || !DN_Str8_HasData(delimiter) || delimiter.size <= 0) return result; - DN_Str8BinarySplitResult split = {}; + DN_Str8BSplitResult split = {}; DN_Str8 first = string; do { - split = DN_SIMD_Str8BinarySplitAVX512F(first, delimiter); + split = DN_SIMD_Str8BSplitAVX512F(first, delimiter); if (split.lhs.size || mode == DN_Str8SplitIncludeEmptyStrings_Yes) { if (splits && result < splits_count) splits[result] = split.lhs; diff --git a/Source/SIMD/dn_simd_avx512f.h b/Source/SIMD/dn_simd_avx512f.h index 4c1a434..73e7a98 100644 --- a/Source/SIMD/dn_simd_avx512f.h +++ b/Source/SIMD/dn_simd_avx512f.h @@ -20,8 +20,8 @@ DN_API DN_Str8FindResult DN_Str8_FindStr8AVX512F (DN_Str8 string, DN_Str8 find); DN_API DN_Str8FindResult DN_Str8_FindLastStr8AVX512F (DN_Str8 string, DN_Str8 find); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitAVX512F (DN_Str8 string, DN_Str8 find); -DN_API DN_Str8BinarySplitResult DN_Str8_BinarySplitLastAVX512F(DN_Str8 string, DN_Str8 find); +DN_API DN_Str8BSplitResult DN_Str8_BSplitAVX512F (DN_Str8 string, DN_Str8 find); +DN_API DN_Str8BSplitResult DN_Str8_BSplitLastAVX512F(DN_Str8 string, DN_Str8 find); DN_API DN_USize DN_Str8_SplitAVX512F (DN_Str8 string, DN_Str8 delimiter, DN_Str8 *splits, DN_USize splits_count, DN_Str8SplitIncludeEmptyStrings mode); DN_API DN_Slice DN_Str8_SplitAllocAVX512F (DN_Arena *arena, DN_Str8 string, DN_Str8 delimiter, DN_Str8SplitIncludeEmptyStrings mode); diff --git a/Source/Standalone/dn_keccak.h b/Source/Standalone/dn_keccak.h index fd44e4a..90c7f44 100644 --- a/Source/Standalone/dn_keccak.h +++ b/Source/Standalone/dn_keccak.h @@ -245,10 +245,10 @@ DN_KCBytes64 DN_KC_Keccak512Str8(DN_Str8 string); // Convert a binary buffer into its hex representation into dest. The dest // buffer must be large enough to contain the hex representation, i.e. // atleast src_size * 2). This function does *not* null-terminate the buffer. -void DN_KC_BytesToHex(void const *src, uint64_t src_size, char *dest, uint64_t dest_size); +void DN_KC_HexFromBytes(void const *src, uint64_t src_size, char *dest, uint64_t dest_size); // Converts a fixed amount of bytes into a hexadecimal string. Helper functions -// that call into DN_KCBytesToHex. +// that call into DN_KCHexFromBytes. // return: The hexadecimal string of the bytes, null-terminated. DN_KCString56 DN_KC_Bytes28ToHex(DN_KCBytes28 const *bytes); DN_KCString64 DN_KC_Bytes32ToHex(DN_KCBytes32 const *bytes); @@ -581,7 +581,7 @@ DN_KCBytes64 DN_KC_Keccak512Str8(DN_Str8 string) #endif // DN_BASE_STRING_H // NOTE: Helper functions ////////////////////////////////////////////////////////////////////////// -void DN_KC_BytesToHex(void const *src, size_t src_size, char *dest, size_t dest_size) +void DN_KC_HexFromBytes(void const *src, size_t src_size, char *dest, size_t dest_size) { (void)src_size; (void)dest_size; DN_KC_ASSERT(dest_size >= src_size * 2); @@ -600,7 +600,7 @@ void DN_KC_BytesToHex(void const *src, size_t src_size, char *dest, size_t dest_ DN_KCString56 DN_KC_Bytes28ToHex(DN_KCBytes28 const *bytes) { DN_KCString56 result; - DN_KC_BytesToHex(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); + DN_KC_HexFromBytes(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); result.data[sizeof(result.data) - 1] = 0; return result; } @@ -608,7 +608,7 @@ DN_KCString56 DN_KC_Bytes28ToHex(DN_KCBytes28 const *bytes) DN_KCString64 DN_KC_Bytes32ToHex(DN_KCBytes32 const *bytes) { DN_KCString64 result; - DN_KC_BytesToHex(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); + DN_KC_HexFromBytes(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); result.data[sizeof(result.data) - 1] = 0; return result; } @@ -616,7 +616,7 @@ DN_KCString64 DN_KC_Bytes32ToHex(DN_KCBytes32 const *bytes) DN_KCString96 DN_KC_Bytes48ToHex(DN_KCBytes48 const *bytes) { DN_KCString96 result; - DN_KC_BytesToHex(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); + DN_KC_HexFromBytes(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); result.data[sizeof(result.data) - 1] = 0; return result; } @@ -624,7 +624,7 @@ DN_KCString96 DN_KC_Bytes48ToHex(DN_KCBytes48 const *bytes) DN_KCString128 DN_KC_Bytes64ToHex(DN_KCBytes64 const *bytes) { DN_KCString128 result; - DN_KC_BytesToHex(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); + DN_KC_HexFromBytes(bytes->data, sizeof(bytes->data), result.data, sizeof(result.data)); result.data[sizeof(result.data) - 1] = 0; return result; } @@ -659,7 +659,7 @@ DN_KCBytes32 DN_KC_Hex64ToBytes(DN_Str8 hex) { DN_KC_ASSERT(hex.size == 64); DN_KCBytes32 result; - DN_CVT_HexToBytesPtr(hex, result.data, sizeof(result)); + DN_CVT_BytesFromHexPtr(hex, result.data, sizeof(result)); return result; } #endif // DN_BASE_STRING_H diff --git a/single_header_generator.cpp b/single_header_generator.cpp index 42524c7..8045bcb 100644 --- a/single_header_generator.cpp +++ b/single_header_generator.cpp @@ -1,4 +1,4 @@ -#define USE_SINGLE_HEADER 0 +#define USE_SINGLE_HEADER 1 #if USE_SINGLE_HEADER #include "Single_Header/dn_single_header.h" @@ -36,7 +36,7 @@ static void AppendCppFileLineByLine(DN_Str8Builder *dest, DN_Str8 cpp_path) DN_OS_ErrSinkEndAndExitIfErrorF(err, -1, "Failed to load file from '%S' for appending", cpp_path); for (DN_Str8 inc_walker = buffer;;) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(inc_walker, DN_STR8("\n")); + DN_Str8BSplitResult split = DN_Str8_BSplit(inc_walker, DN_STR8("\n")); if (!DN_Str8_HasData(split.lhs)) break; inc_walker = split.rhs; @@ -48,7 +48,7 @@ static void AppendCppFileLineByLine(DN_Str8Builder *dest, DN_Str8 cpp_path) DN_Str8FindResult find = DN_Str8_FindStr8(line, DN_STR8("#include \"../dn_"), DN_Str8EqCase_Sensitive); { if (find.found) { - line = DN_Str8_InitFFromTLS("%S// DN: Single header generator commented out this header => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); + line = DN_Str8_FromTLSF("%S// DN: Single header generator commented out this header => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); // The only time we use '../dn_.*' is for LSP purposes, so we // don't care about inlining it, hence we don't set 'include_file' @@ -61,7 +61,7 @@ static void AppendCppFileLineByLine(DN_Str8Builder *dest, DN_Str8 cpp_path) if (!find.found) { find = DN_Str8_FindStr8(line, DN_STR8("#include \""), DN_Str8EqCase_Sensitive); if (find.found) { - line = DN_Str8_InitFFromTLS("%S// DN: Single header generator commented out this header => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); + line = DN_Str8_FromTLSF("%S// DN: Single header generator commented out this header => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); DN_Str8 rel_include_path = DN_Str8_TrimWhitespaceAround(find.after_match_to_end_of_buffer); DN_Str8 root_dir = DN_Str8_FileDirectoryFromPath(cpp_path); extra_include_path = DN_OS_PathFFromTLS("%S/%S", root_dir, DN_Str8_TrimSuffix(rel_include_path, DN_STR8("\""))); @@ -88,8 +88,8 @@ int main(int argc, char **argv) return -1; } - DN_Str8 dn_root_dir = DN_Str8_InitCStr8(argv[1]); - DN_Str8 output_dir = DN_Str8_InitCStr8(argv[2]); + DN_Str8 dn_root_dir = DN_Str8_FromCStr8(argv[1]); + DN_Str8 output_dir = DN_Str8_FromCStr8(argv[2]); if (!DN_OS_MakeDir(output_dir)) { DN_OS_PrintErrF("Failed to make requested output directory: %S", output_dir); return -1; @@ -106,7 +106,7 @@ int main(int argc, char **argv) for (DN_ForIndexU(type, FileType_Count)) { DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); - DN_Str8Builder builder = DN_Str8Builder_InitFromTLS(); + DN_Str8Builder builder = DN_Str8Builder_FromTLS(); for (DN_ForItCArray(it, File const, FILES)) { if (it.data->type != type) continue; @@ -120,7 +120,7 @@ int main(int argc, char **argv) // NOTE: Walk the top-level dn_*_inc.[h|cpp] files for (DN_Str8 walker = file_buffer;;) { - DN_Str8BinarySplitResult split = DN_Str8_BinarySplit(walker, DN_STR8("\n")); + DN_Str8BSplitResult split = DN_Str8_BSplit(walker, DN_STR8("\n")); if (!DN_Str8_HasData(split.lhs)) break; @@ -134,8 +134,8 @@ int main(int argc, char **argv) DN_Str8FindResult find = DN_Str8_FindStr8(line, DN_STR8("#include \""), DN_Str8EqCase_Sensitive); { if (find.found && DN_Str8_FindStr8(line, DN_STR8("dn_"), DN_Str8EqCase_Sensitive).found) { - line = DN_Str8_InitFFromTLS("%S// DN: Single header generator inlined this file => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); - include_file = DN_Str8_BinarySplit(find.after_match_to_end_of_buffer, DN_STR8("\"")).lhs; + line = DN_Str8_FromTLSF("%S// DN: Single header generator inlined this file => %S", find.start_to_before_match, DN_Str8_TrimWhitespaceAround(find.match_to_end_of_buffer)); + include_file = DN_Str8_BSplit(find.after_match_to_end_of_buffer, DN_STR8("\"")).lhs; DN_Assert(include_file.size); } }