Seems this strat is still fine...

This commit is contained in:
ed
2025-02-06 11:39:43 -05:00
parent 4221064785
commit bfef61bd0b
5 changed files with 260 additions and 187 deletions
+30 -30
View File
@@ -20,44 +20,44 @@
#define MACHINE_EPSILON64 4.94065645841247e-324; #define MACHINE_EPSILON64 4.94065645841247e-324;
#define U8_MIN 0u #define MIN_U8 0u
#define U8_MAX 0xffu #define MAX_U8 0xffu
#define S8_MIN ( -0x7f - 1 ) #define MIN_S8 ( -0x7f - 1 )
#define S8_MAX 0x7f #define MAX_S8 0x7f
#define U16_MIN 0u #define MIN_U16 0u
#define U16_MAX 0xffffu #define MAX_U16 0xffffu
#define S16_MIN ( -0x7fff - 1 ) #define MIN_S16 ( -0x7fff - 1 )
#define S16_MAX 0x7fff #define MAX_S16 0x7fff
#define U32_MIN 0u #define MIN_U32 0u
#define U32_MAX 0xffffffffu #define MAX_U32 0xffffffffu
#define S32_MIN ( -0x7fffffff - 1 ) #define MIN_S32 ( -0x7fffffff - 1 )
#define S32_MAX 0x7fffffff #define MAX_S32 0x7fffffff
#define U64_MIN 0ull #define MIN_U64 0ull
#define U64_MAX 0xffffffffffffffffull #define MAX_U64 0xffffffffffffffffull
#define S64_MIN ( -0x7fffffffffffffffll - 1 ) #define MIN_S64 ( -0x7fffffffffffffffll - 1 )
#define S64_MAX 0x7fffffffffffffffll #define MAX_S64 0x7fffffffffffffffll
#if defined( ARCH_32_BIT ) #if ARCH_32BIT
# define USIZE_MIN U32_MIN # define MIN_USIZE U32_MIN
# define USIZE_MAX U32_MAX # define MAX_USIZE U32_MAX
# define ISIZE_MIN S32_MIN # define MIN_ISIZE S32_MIN
# define ISIZE_MAX S32_MAX # define MAX_ISIZE S32_MAX
#elif defined( ARCH_64_BIT ) #elif ARCH_64BIT
# define USIZE_MIN U64_MIN # define MIN_USIZE U64_MIN
# define USIZE_MAX U64_MAX # define MAX_USIZE U64_MAX
# define ISIZE_MIN S64_MIN # define MIN_ISIZE S64_MIN
# define ISIZE_MAX S64_MAX # define MAX_ISIZE S64_MAX
#else #else
# error Unknown architecture size. This library only supports 32 bit and 64 bit architectures. # error Unknown architecture size. This library only supports 32 bit and 64 bit architectures.
#endif #endif
#define F32_MIN 1.17549435e-38f #define MIN_F32 1.17549435e-38f
#define F32_MAX 3.40282347e+38f #define MAX_F32 3.40282347e+38f
#define F64_MIN 2.2250738585072014e-308 #define MIN_F64 2.2250738585072014e-308
#define F64_MAX 1.7976931348623157e+308 #define MAX_F64 1.7976931348623157e+308
#define BITMASK1 0x00000001 #define BITMASK1 0x00000001
#define BITMASK2 0x00000003 #define BITMASK2 0x00000003
+56 -28
View File
@@ -226,7 +226,7 @@ VArena varena__alloc(VArenaParams params)
} }
#endif #endif
SPTR header_size = size_of(VArena); SPTR header_size = align_pow2(size_of(VArena), MD_DEFAULT_MEMORY_ALIGNMENT);
asan_unpoison_memory_region(base, header_size); asan_unpoison_memory_region(base, header_size);
VArena* vm = rcast(VArena*, base); VArena* vm = rcast(VArena*, base);
@@ -257,15 +257,10 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
{ {
assert(requested_size != 0); assert(requested_size != 0);
UPTR alignment_offset = 0; requested_size = align_pow2(requested_size, alignment);
UPTR current_offset = vm->reserve_start + vm->commit_used; UPTR current_offset = vm->reserve_start + vm->commit_used;
UPTR mask = scast(UPTR, alignment) - 1; UPTR size_to_allocate = requested_size;
if ((current_offset & mask) != 0) {
alignment_offset = alignment - (current_offset & mask);
}
UPTR size_to_allocate = requested_size + alignment_offset;
UPTR to_be_used = vm->commit_used + size_to_allocate; UPTR to_be_used = vm->commit_used + size_to_allocate;
UPTR header_offset = vm->reserve_start - scast(UPTR, vm); UPTR header_offset = vm->reserve_start - scast(UPTR, vm);
@@ -275,7 +270,13 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
if (needs_more_commited) if (needs_more_commited)
{ {
SPTR reserve_left = vm->reserve - vm->committed; SPTR reserve_left = vm->reserve - vm->committed;
UPTR next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2( -reserve_left, os_get_system_info()->page_size)); UPTR next_commit_size;
if (vm->flags & VArenaFlag_LargePages) {
next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2( -reserve_left, os_get_system_info()->large_page_size));
}
else {
next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2(abs(reserve_left), os_get_system_info()->page_size));
}
if (next_commit_size) { if (next_commit_size) {
B32 commit_result = os_commit(vm, next_commit_size); B32 commit_result = os_commit(vm, next_commit_size);
if (commit_result == false) { if (commit_result == false) {
@@ -284,7 +285,7 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
} }
} }
allocated_mem = rcast(void*, current_offset + alignment_offset); allocated_mem = rcast(void*, current_offset + size_to_allocate);
vm->commit_used += size_to_allocate vm->commit_used += size_to_allocate
} }
break; break;
@@ -306,15 +307,22 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
assert(old_size > 0); assert(old_size > 0);
assert_msg(old_size == requested_size, "Requested resize when none needed"); assert_msg(old_size == requested_size, "Requested resize when none needed");
UPTR alignment_offset = scast(UPTR, old_memory) & (scast(UPTR, alignment) - 1); requested_size = align_pow2(requested_size, alignment);
assert_msg(alignment_offset != 0 && requested_size >= old_size, "Requested shrink from VArena"); old_size = align_pow2(old_size, alignment);
UPTR old_memory_offset = scast(UPTR, old_memory) + scast(UPTR, old_size); UPTR old_memory_offset = scast(UPTR, old_memory) + scast(UPTR, old_size);
UPTR current_offset = scast(UPTR, vm->reserve_start) + scast(UPTR, vm->commit_used); UPTR current_offset = scast(UPTR, vm->reserve_start) + scast(UPTR, vm->commit_used);
assert_msg(old_memory_offset == current_offset, "Cannot resize existing allocation in VArena to a larger size unless it was the last allocated"); assert_msg(old_memory_offset == current_offset, "Cannot resize existing allocation in VArena unless it was the last allocated");
UPTR size_to_allocate = requested_size - old_size + alignment_offset; B32 requested_shrink = requested_size >= old_size;
if (requested_shrink) {
vm->commit_used -= rcast(UPTR, align_pow2(requested_size, alignment));
allocated_mem = old_memory;
break;
}
UPTR size_to_allocate = requested_size - old_size, alignment;
UPTR header_offset = vm->reserve_start - scast(UPTR, vm); UPTR header_offset = vm->reserve_start - scast(UPTR, vm);
UPTR commit_left = vm->committed - vm->commit_used - header_offset; UPTR commit_left = vm->committed - vm->commit_used - header_offset;
@@ -322,7 +330,13 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
if (needs_more_commited) if (needs_more_commited)
{ {
SPTR reserve_left = vm->reserve - vm->committed; SPTR reserve_left = vm->reserve - vm->committed;
UPTR next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2( -reserve_left, os_get_system_info()->page_size)); UPTR next_commit_size;
if (vm->flags & VArenaFlag_LargePages) {
next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2( -reserve_left, os_get_system_info()->large_page_size));
}
else {
next_commit_size = reserve_left > 0 ? vm->commit_size : scast(UPTR, align_pow2(abs(reserve_left), os_get_system_info()->page_size));
}
if (next_commit_size) { if (next_commit_size) {
B32 commit_result = os_commit(vm, next_commit_size); B32 commit_result = os_commit(vm, next_commit_size);
if (commit_result == false) { if (commit_result == false) {
@@ -331,21 +345,14 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ
} }
} }
allocated_mem = old_memory; allocated_mem = old_memory;
vm->commit_used += size_to_allocate vm->commit_used += size_to_allocate
} }
break; break;
// case AllocatorMode_Pop: // case AllocatorMode_Pop:
// {
// }
// break; // break;
// case AllocatorMode_Pop_To: // case AllocatorMode_Pop_To:
// {
// }
// break; // break;
case AllocatorMode_QueryType: case AllocatorMode_QueryType:
@@ -378,10 +385,11 @@ void* farena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size
SSIZE total_size = align_pow2(size, alignment); SSIZE total_size = align_pow2(size, alignment);
if (arena->used + total_size > arena->slice.len ) { if (arena->used + total_size > arena->slice.len ) {
// Out of memory
return allocated_mem; return allocated_mem;
} }
allocated_mem = align_pow2(end, alignment); allocated_mem = end;
arena->used += total_size; arena->used += total_size;
} }
break; break;
@@ -399,13 +407,33 @@ void* farena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size
case AllocatorMode_Resize: case AllocatorMode_Resize:
{ {
allocated_mem = default_resize_align(farena_allocator(arena), old_memory, old_size, size, alignment); assert(old_memory != nullptr);
assert(old_size > 0);
assert_msg(old_size == size, "Requested resize when none needed");
size = align_pow2(size, alignment);
old_size = align_pow2(size, alignment);
SPTR old_memory_offset = scast(SPTR, old_memory) + old_size;
SPTR current_offset = scast(SPTR, arena->slice.data) + arena->used;
assert_msg(old_memory_offset == current_offset, "Cannot resize existing allocation in VArena unless it was the last allocated");
B32 requested_shrink = size >= old_size;
if (requested_shrink) {
arena->used -= size;
allocated_mem = old_memory;
break;
}
allocated_mem = old_memory;
arena->used += size;
} }
break; break;
// case AllocatorMode_Pop: // case AllocatorMode_Pop:
// break; // break;
// case AllocatorMode_Pop_To: // case AllocatorMode_Pop_To:
// break; // break;
@@ -414,7 +442,7 @@ void* farena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size
break; break;
case AllocatorMode_QuerySupport: case AllocatorMode_QuerySupport:
return (void*) (AllocatorQuery_Alloc | AllocatorQuery_Free | AllocatorQuery_FreeAll | AllocatorQuery_Resize return (void*) (AllocatorQuery_Alloc | AllocatorQuery_FreeAll | AllocatorQuery_Resize
// | AllocatorQuery_Pop | AllocatorQuery_Pop_To // | AllocatorQuery_Pop | AllocatorQuery_Pop_To
); );
break; break;
+46 -23
View File
@@ -163,6 +163,7 @@ str8_skip_chop_whitespace(String8 string)
String8 String8
push_str8_cat(Arena* arena, String8 s1, String8 s2) push_str8_cat(Arena* arena, String8 s1, String8 s2)
{ {
#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL
String8 str; String8 str;
str.size = s1.size + s2.size; str.size = s1.size + s2.size;
str.str = push_array_no_zero(arena, U8, str.size + 1); str.str = push_array_no_zero(arena, U8, str.size + 1);
@@ -170,20 +171,28 @@ push_str8_cat(Arena* arena, String8 s1, String8 s2)
memory_copy(str.str + s1.size, s2.str, s2.size); memory_copy(str.str + s1.size, s2.str, s2.size);
str.str[str.size] = 0; str.str[str.size] = 0;
return(str); return(str);
#else
return str8_cat(arena_allocator(arena), s1, s2);
#endif
} }
String8 String8
push_str8_copy(Arena *arena, String8 s){ push_str8_copy(Arena* arena, String8 s){
#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL
String8 str; String8 str;
str.size = s.size; str.size = s.size;
str.str = push_array_no_zero(arena, U8, str.size + 1); str.str = push_array_no_zero(arena, U8, str.size + 1);
memory_copy(str.str, s.str, s.size); memory_copy(str.str, s.str, s.size);
str.str[str.size] = 0; str.str[str.size] = 0;
return(str); return(str);
#else
return str8_copy(arena_allocator(arena), s);
#endif
} }
String8 String8
push_str8fv(Arena *arena, char *fmt, va_list args){ push_str8fv(Arena* arena, char* fmt, va_list args){
#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL
va_list args2; va_list args2;
va_copy(args2, args); va_copy(args2, args);
U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1;
@@ -193,6 +202,9 @@ push_str8fv(Arena *arena, char *fmt, va_list args){
result.str[result.size] = 0; result.str[result.size] = 0;
va_end(args2); va_end(args2);
return(result); return(result);
#else
return str8fv(arena_allocator(arena), fmt, args);
#endif
} }
String8 String8
@@ -200,7 +212,7 @@ str8_cat(AllocatorInfo ainfo, String8 s1, String8 s2)
{ {
String8 str; String8 str;
str.size = s1.size + s2.size; str.size = s1.size + s2.size;
str.str = alloc_array(ainfo, U8, str.size + 1); str.str = alloc_array_no_zero(ainfo, U8, str.size + 1);
memory_copy(str.str, s1.str, s1.size); memory_copy(str.str, s1.str, s1.size);
memory_copy(str.str + s1.size, s2.str, s2.size); memory_copy(str.str + s1.size, s2.str, s2.size);
str.str[str.size] = 0; str.str[str.size] = 0;
@@ -212,7 +224,7 @@ str8_copy(AllocatorInfo ainfo, String8 s)
{ {
String8 str; String8 str;
str.size = s.size; str.size = s.size;
str.str = alloc_array(ainfo, U8, str.size + 1); str.str = alloc_array_no_zero(ainfo, U8, str.size + 1);
memory_copy(str.str, s.str, s.size); memory_copy(str.str, s.str, s.size);
str.str[str.size] = 0; str.str[str.size] = 0;
return(str); return(str);
@@ -313,7 +325,8 @@ try_u64_from_str8_c_rules(String8 string, U64 *x)
//- rjf: integer -> string //- rjf: integer -> string
String8 String8
str8_from_memory_size(Arena *arena, U64 z) { str8_from_memory_size(Arena* arena, U64 z) {
#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL
String8 result = {0}; String8 result = {0};
if (z < KB(1)) { if (z < KB(1)) {
result = push_str8f(arena, "%llu b", z); result = push_str8f(arena, "%llu b", z);
@@ -328,6 +341,9 @@ str8_from_memory_size(Arena *arena, U64 z) {
result = push_str8f(arena, "%llu.%02llu Gb", z/GB(1), ((100*z)/GB(1))%100); result = push_str8f(arena, "%llu.%02llu Gb", z/GB(1), ((100*z)/GB(1))%100);
} }
return(result); return(result);
#else
return str8_from_allocator_size(arena_allocator(arena), z);
#endif
} }
String8 String8
@@ -349,8 +365,9 @@ str8__from_allocator_size(AllocatorInfo ainfo, U64 z) {
} }
String8 String8
str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) str8_from_u64(Arena* arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator)
{ {
#if 0
String8 result = {0}; String8 result = {0};
{ {
// rjf: prefix // rjf: prefix
@@ -435,10 +452,12 @@ str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_se
} }
} }
return result; return result;
#endif
return str8_from_allocator_u64(arena_allocator(arena), u64, radix, min_digits, digit_group_separator);
} }
String8 String8
str8__from_allocator_u64(AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) str8_from_allocator_u64(AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator)
{ {
String8 result = {0}; String8 result = {0};
{ {
@@ -488,7 +507,7 @@ str8__from_allocator_u64(AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits,
} }
} }
result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits;
result.str = alloc_array(ainfo, U8, result.size + 1); result.str = alloc_array_no_zero(ainfo, U8, result.size + 1);
result.str[result.size] = 0; result.str[result.size] = 0;
} }
@@ -529,6 +548,7 @@ str8__from_allocator_u64(AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits,
String8 String8
str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator)
{ {
#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL
String8 result = {0}; String8 result = {0};
// TODO(rjf): preeeeetty sloppy... // TODO(rjf): preeeeetty sloppy...
if(s64 < 0) { if(s64 < 0) {
@@ -541,20 +561,23 @@ str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_se
result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator);
} }
return result; return result;
#else
return str8_from_alloctor_s64(arena_allocator(arena), s64, radix, min_digits, digit_group_separator);
#endif
} }
String8 String8
str8__from_alloctor_s64(AllocatorInfo ainfo, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) str8_from_alloctor_s64(AllocatorInfo ainfo, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator)
{ {
String8 result = {0}; String8 result = {0};
if(s64 < 0) { if(s64 < 0) {
U8 bytes[KB(8)]; U8 bytes[KB(8)];
FArena scratch = farena_from_memory(bytes, size_of(bytes)); FArena scratch = farena_from_memory(bytes, size_of(bytes));
String8 numeric_part = str8__from_allocator_u64((U64)(-s64), radix, min_digits, digit_group_separator, farena_allocator(scratch)); String8 numeric_part = str8__from_allocator_u64(farena_allocator(scratch), (U64)(-s64), radix, min_digits, digit_group_separator);
result = str8f(ainfo, "-%S", numeric_part); result = str8f(ainfo, "-%S", numeric_part);
} }
else { else {
result = str8__from_allocator_u64((U64)s64, radix, min_digits, digit_group_separator, ainfo); result = str8__from_allocator_u64(ainfo, (U64)s64, radix, min_digits, digit_group_separator);
} }
return result; return result;
} }
@@ -620,7 +643,7 @@ str8_list_concat_in_place(String8List* list, String8List* to_push) {
else { else {
*list = *to_push; *list = *to_push;
} }
MemoryZeroStruct(to_push); memory_zero_struct(to_push);
} }
} }
@@ -653,7 +676,7 @@ str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align)
String8Node* String8Node*
str8_list_aligner(AllocatorInfo ainfo, String8List* list, U64 min, U64 align) { str8_list_aligner(AllocatorInfo ainfo, String8List* list, U64 min, U64 align) {
String8Node* node = alloc_array(ainfo, String8Node, 1); String8Node* node = alloc_array_no_zero(ainfo, String8Node, 1);
U64 new_size = list->total_size + min; U64 new_size = list->total_size + min;
U64 increase_size = 0; U64 increase_size = 0;
@@ -1086,7 +1109,7 @@ read_only global U8 utf8_class[32] = {
internal UnicodeDecode internal UnicodeDecode
utf8_decode(U8 *str, U64 max){ utf8_decode(U8 *str, U64 max){
UnicodeDecode result = {1, max_U32}; UnicodeDecode result = {1, MAX_U32};
U8 byte = str[0]; U8 byte = str[0];
U8 byte_class = utf8_class[byte >> 3]; U8 byte_class = utf8_class[byte >> 3];
switch (byte_class) switch (byte_class)
@@ -1102,8 +1125,8 @@ utf8_decode(U8 *str, U64 max){
U8 cont_byte = str[1]; U8 cont_byte = str[1];
if (utf8_class[cont_byte >> 3] == 0) if (utf8_class[cont_byte >> 3] == 0)
{ {
result.codepoint = (byte & bitmask5) << 6; result.codepoint = (byte & BITMASK5) << 6;
result.codepoint |= (cont_byte & bitmask6); result.codepoint |= (cont_byte & BITMASK6);
result.inc = 2; result.inc = 2;
} }
} }
@@ -1116,9 +1139,9 @@ utf8_decode(U8 *str, U64 max){
if (utf8_class[cont_byte[0] >> 3] == 0 && if (utf8_class[cont_byte[0] >> 3] == 0 &&
utf8_class[cont_byte[1] >> 3] == 0) utf8_class[cont_byte[1] >> 3] == 0)
{ {
result.codepoint = (byte & bitmask4) << 12; result.codepoint = (byte & BITMASK4) << 12;
result.codepoint |= ((cont_byte[0] & bitmask6) << 6); result.codepoint |= ((cont_byte[0] & BITMASK6) << 6);
result.codepoint |= (cont_byte[1] & bitmask6); result.codepoint |= (cont_byte[1] & BITMASK6);
result.inc = 3; result.inc = 3;
} }
} }
@@ -1132,10 +1155,10 @@ utf8_decode(U8 *str, U64 max){
utf8_class[cont_byte[1] >> 3] == 0 && utf8_class[cont_byte[1] >> 3] == 0 &&
utf8_class[cont_byte[2] >> 3] == 0) utf8_class[cont_byte[2] >> 3] == 0)
{ {
result.codepoint = (byte & bitmask3) << 18; result.codepoint = (byte & BITMASK3) << 18;
result.codepoint |= ((cont_byte[0] & bitmask6) << 12); result.codepoint |= ((cont_byte[0] & BITMASK6) << 12);
result.codepoint |= ((cont_byte[1] & bitmask6) << 6); result.codepoint |= ((cont_byte[1] & BITMASK6) << 6);
result.codepoint |= (cont_byte[2] & bitmask6); result.codepoint |= (cont_byte[2] & BITMASK6);
result.inc = 4; result.inc = 4;
} }
} }
+18 -14
View File
@@ -307,6 +307,10 @@ inline String8 upper_from_str8 (Arena* arena, String8 string) { string = pu
inline String8 lower_from_str8 (Arena* arena, String8 string) { string = push_str8_copy(arena, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_to_lower(string.str[idx]); } return string; } inline String8 lower_from_str8 (Arena* arena, String8 string) { string = push_str8_copy(arena, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_to_lower(string.str[idx]); } return string; }
inline String8 backslashed_from_str8(Arena *arena, String8 string) { string = push_str8_copy(arena, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; } return string; } inline String8 backslashed_from_str8(Arena *arena, String8 string) { string = push_str8_copy(arena, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; } return string; }
inline String8 upper_from_str8_alloc (AllocatorInfo ainfo, String8 string) { string = str8_copy(ainfo, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_to_upper(string.str[idx]); } return string; }
inline String8 lower_from_str8_alloc (AllocatorInfo ainfo, String8 string) { string = str8_copy(ainfo, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_to_lower(string.str[idx]); } return string; }
inline String8 backslashed_from_str8_alloc(AllocatorInfo ainfo, String8 string) { string = str8_copy(ainfo, string); for(U64 idx = 0; idx < string.size; idx += 1) { string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; } return string; }
//////////////////////////////// ////////////////////////////////
//~ rjf: String <=> Integer Conversions //~ rjf: String <=> Integer Conversions
@@ -319,11 +323,11 @@ MD_API B32 try_u64_from_str8_c_rules(String8 string, U64* x);
B32 try_s64_from_str8_c_rules(String8 string, S64* x); B32 try_s64_from_str8_c_rules(String8 string, S64* x);
//- rjf: integer -> string //- rjf: integer -> string
MD_API String8 str8_from_memory_size(Arena *arena, U64 z); MD_API String8 str8_from_memory_size(Arena* arena, U64 z);
MD_API String8 str8_from_u64 (Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); MD_API String8 str8_from_u64 (Arena* arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator);
MD_API String8 str8_from_s64 (Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); MD_API String8 str8_from_s64 (Arena* arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator);
String8 str8_from_allocator_size(U64 z, AllocatorInfo ainfo); String8 str8_from_allocator_size(AllocatorInfo ainfo, U64 z);
String8 str8_from_allocator_u64 (AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); String8 str8_from_allocator_u64 (AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator);
String8 str8_from_alloctor_s64 (AllocatorInfo ainfo, S64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); String8 str8_from_alloctor_s64 (AllocatorInfo ainfo, S64 u64, U32 radix, U8 min_digits, U8 digit_group_separator);
@@ -370,7 +374,7 @@ String8Node* str8_list_push_node (String8List* list, String8Node
String8Node* str8_list_push_node_set_string (String8List* list, String8Node* node, String8 string); String8Node* str8_list_push_node_set_string (String8List* list, String8Node* node, String8 string);
String8Node* str8_list_push_node_front (String8List* list, String8Node* node); String8Node* str8_list_push_node_front (String8List* list, String8Node* node);
String8Node* str8_list_push_node_front_set_string(String8List* list, String8Node* node, String8 string); String8Node* str8_list_push_node_front_set_string(String8List* list, String8Node* node, String8 string);
void str8_list_concat_in_place (String8List *list, String8List* to_push); void str8_list_concat_in_place (String8List* list, String8List* to_push);
inline String8Node* inline String8Node*
str8_list_push_node(String8List* list, String8Node* node){ str8_list_push_node(String8List* list, String8Node* node){
@@ -441,16 +445,16 @@ String8List str8_split_arena(Arena *arena, String8 string, U8 *split_chars, U64
// String8List str8__split_ainfo(String8 string, U8* split_chars, U64 split_char_count, StringSplitFlags flags, AllocatorInfo allocator); // String8List str8__split_ainfo(String8 string, U8* split_chars, U64 split_char_count, StringSplitFlags flags, AllocatorInfo allocator);
// #define str8_split_ainfo(string, split_chars, split_char_count, flags, ...) str8__split_ainfo(string, split_chars, split_char_count, flags, (AllocatorInfo){__VA_ARGS__}); // #define str8_split_ainfo(string, split_chars, split_char_count, flags, ...) str8__split_ainfo(string, split_chars, split_char_count, flags, (AllocatorInfo){__VA_ARGS__});
internal String8List str8_split_by_string_chars (Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); internal String8List str8_split_by_string_chars (Arena* arena, String8 string, String8 split_chars, StringSplitFlags flags);
internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); internal String8List str8_list_split_by_string_chars(Arena* arena, String8List list, String8 split_chars, StringSplitFlags flags);
internal String8 str8_list_join (Arena *arena, String8List *list, StringJoin *optional_params); internal String8 str8_list_join (Arena* arena, String8List* list, StringJoin* optional_params);
internal void str8_list_from_flags (Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); internal void str8_list_from_flags (Arena* arena, String8List* list, U32 flags, String8 *flag_string_table, U32 flag_string_count);
//////////////////////////////// ////////////////////////////////
//~ rjf; String Arrays //~ rjf; String Arrays
internal String8Array str8_array_from_list(Arena *arena, String8List *list); internal String8Array str8_array_from_list(Arena* arena, String8List* list);
internal String8Array str8_array_reserve (Arena *arena, U64 count); internal String8Array str8_array_reserve (Arena* arena, U64 count);
//////////////////////////////// ////////////////////////////////
//~ rjf: String Path Helpers //~ rjf: String Path Helpers
@@ -461,9 +465,9 @@ internal String8 str8_chop_last_dot (String8 string);
internal String8 str8_skip_last_dot (String8 string); internal String8 str8_skip_last_dot (String8 string);
internal PathStyle path_style_from_str8 (String8 string); internal PathStyle path_style_from_str8 (String8 string);
internal String8List str8_split_path (Arena *arena, String8 string); internal String8List str8_split_path (Arena* arena, String8 string);
internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); internal void str8_path_list_resolve_dots_in_place(String8List* path, PathStyle style);
internal String8 str8_path_list_join_by_style (Arena *arena, String8List *path, PathStyle style); internal String8 str8_path_list_join_by_style (Arena* arena, String8List* path, PathStyle style);
//////////////////////////////// ////////////////////////////////
//~ rjf: UTF-8 & UTF-16 Decoding/Encoding //~ rjf: UTF-8 & UTF-16 Decoding/Encoding
+110 -92
View File
@@ -1,154 +1,172 @@
#ifdef INTELLISENSE_DIRECTIVES
# include "os_core.h"
#endif
// Copyright (c) 2024 Epic Games Tools // Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/) // Licensed under the MIT license (https://opensource.org/license/mit/)
//////////////////////////////// ////////////////////////////////
//~ rjf: Handle Type Functions (Helpers, Implemented Once) //~ rjf: Handle Type Functions (Helpers, Implemented Once)
internal OS_Handle OS_Handle
os_handle_zero(void) os_handle_zero(void)
{ {
OS_Handle handle = {0}; OS_Handle handle = {0};
return handle; return handle;
} }
internal B32 B32
os_handle_match(OS_Handle a, OS_Handle b) os_handle_match(OS_Handle a, OS_Handle b)
{ {
return a.u64[0] == b.u64[0]; return a.u64[0] == b.u64[0];
} }
internal void void
os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle)
{ {
OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); OS_HandleNode *n = push_array(arena, OS_HandleNode, 1);
n->v = handle; n->v = handle;
SLLQueuePush(handles->first, handles->last, n); SLLQueuePush(handles->first, handles->last, n);
handles->count += 1; handles->count += 1;
} }
internal OS_HandleArray OS_HandleArray
os_handle_array_from_list(Arena *arena, OS_HandleList *list) os_handle_array_from_list(Arena *arena, OS_HandleList *list)
{ {
OS_HandleArray result = {0}; OS_HandleArray result = {0};
result.count = list->count; result.count = list->count;
result.v = push_array_no_zero(arena, OS_Handle, result.count); result.v = push_array_no_zero(arena, OS_Handle, result.count);
U64 idx = 0; U64 idx = 0;
for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1)
{ {
result.v[idx] = n->v; result.v[idx] = n->v;
} }
return result; return result;
} }
//////////////////////////////// ////////////////////////////////
//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) //~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once)
internal String8List String8List
os_string_list_from_argcv(Arena *arena, int argc, char **argv) os_string_list_from_argcv(Arena *arena, int argc, char **argv)
{ {
String8List result = {0}; String8List result = {0};
for(int i = 0; i < argc; i += 1) for(int i = 0; i < argc; i += 1)
{ {
String8 str = str8_cstring(argv[i]); String8 str = str8_cstring(argv[i]);
str8_list_push(arena, &result, str); str8_list_push(arena, &result, str);
} }
return result; return result;
} }
//////////////////////////////// ////////////////////////////////
//~ rjf: Filesystem Helpers (Helpers, Implemented Once) //~ rjf: Filesystem Helpers (Helpers, Implemented Once)
internal String8 String8
os_data_from_file_path(Arena *arena, String8 path) os_data_from_file_path(Arena *arena, String8 path)
{ {
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
FileProperties props = os_properties_from_file(file); FileProperties props = os_properties_from_file(file);
String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size));
os_file_close(file); os_file_close(file);
return data; return data;
} }
internal B32 B32
os_write_data_to_file_path(String8 path, String8 data) os_write_data_to_file_path(String8 path, String8 data)
{ {
B32 good = 0; B32 good = 0;
OS_Handle file = os_file_open(OS_AccessFlag_Write, path); OS_Handle file = os_file_open(OS_AccessFlag_Write, path);
if(!os_handle_match(file, os_handle_zero())) if(!os_handle_match(file, os_handle_zero()))
{ {
good = 1; good = 1;
os_file_write(file, r1u64(0, data.size), data.str); os_file_write(file, r1u64(0, data.size), data.str);
os_file_close(file); os_file_close(file);
} }
return good; return good;
} }
internal B32 B32
os_write_data_list_to_file_path(String8 path, String8List list) os_write_data_list_to_file_path(String8 path, String8List list)
{ {
B32 good = 0; B32 good = 0;
OS_Handle file = os_file_open(OS_AccessFlag_Write, path); OS_Handle file = os_file_open(OS_AccessFlag_Write, path);
if(!os_handle_match(file, os_handle_zero())) if( ! os_handle_match(file, os_handle_zero()))
{ {
good = 1; good = 1;
U64 off = 0; U64 off = 0;
for(String8Node *n = list.first; n != 0; n = n->next) for(String8Node* n = list.first; n != 0; n = n->next)
{ {
os_file_write(file, r1u64(off, off+n->string.size), n->string.str); os_file_write(file, r1u64(off, off+n->string.size), n->string.str);
off += n->string.size; off += n->string.size;
} }
os_file_close(file); os_file_close(file);
} }
return good; return good;
} }
internal B32 B32
os_append_data_to_file_path(String8 path, String8 data) os_append_data_to_file_path(String8 path, String8 data)
{ {
B32 good = 0; B32 good = 0;
if(data.size != 0) if(data.size != 0)
{ {
OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path);
if(!os_handle_match(file, os_handle_zero())) if( ! os_handle_match(file, os_handle_zero()))
{ {
good = 1; good = 1;
U64 pos = os_properties_from_file(file).size; U64 pos = os_properties_from_file(file).size;
os_file_write(file, r1u64(pos, pos+data.size), data.str); os_file_write(file, r1u64(pos, pos+data.size), data.str);
os_file_close(file); os_file_close(file);
} }
} }
return good; return good;
} }
internal OS_FileID OS_FileID
os_id_from_file_path(String8 path) os_id_from_file_path(String8 path)
{ {
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
OS_FileID id = os_id_from_file(file); OS_FileID id = os_id_from_file(file);
os_file_close(file); os_file_close(file);
return id; return id;
} }
internal S64 S64
os_file_id_compare(OS_FileID a, OS_FileID b) os_file_id_compare(OS_FileID a, OS_FileID b)
{ {
S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); S64 cmp = memory_compare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v));
return cmp; return cmp;
} }
internal String8 String8
os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range)
{ {
U64 pre_pos = arena_pos(arena); U64 pre_pos = arena_pos(arena);
String8 result; String8 result;
result.size = dim_1u64(range); result.size = dim_1u64(range);
result.str = push_array_no_zero(arena, U8, result.size); result.str = push_array_no_zero(arena, U8, result.size);
U64 actual_read_size = os_file_read(file, range, result.str); U64 actual_read_size = os_file_read(file, range, result.str);
if(actual_read_size < result.size) if(actual_read_size < result.size)
{ {
arena_pop_to(arena, pre_pos + actual_read_size); arena_pop_to(arena, pre_pos + actual_read_size);
result.size = actual_read_size; result.size = actual_read_size;
} }
return result; return result;
}
String8
os_string_from_file_range_alloc(AllocatorInfo ainfo, OS_Handle file, Rng1U64 range) {
String8 result;
result.size = dim_1u64(range);
result.str = alloc_array_no_zero(ainfo, U8, result.size);
U64 actual_read_size = os_file_read(file, range, result.str);
if(actual_read_size < result.size)
{
resize(ainfo, result.str, result.size, result.str + actual_read_size);
result.size = actual_read_size;
}
return result;
} }
//////////////////////////////// ////////////////////////////////