From bfef61bd0b948976ad4203dfe70e964b6bcc21c1 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Thu, 6 Feb 2025 11:39:43 -0500 Subject: [PATCH] Seems this strat is still fine... --- code/base/constants.h | 60 +++++------ code/base/memory_substrate.c | 84 ++++++++++----- code/base/strings.c | 69 ++++++++---- code/base/strings.h | 32 +++--- code/os/core/os_core.c | 202 +++++++++++++++++++---------------- 5 files changed, 260 insertions(+), 187 deletions(-) diff --git a/code/base/constants.h b/code/base/constants.h index 858a337..f3f3875 100644 --- a/code/base/constants.h +++ b/code/base/constants.h @@ -20,44 +20,44 @@ #define MACHINE_EPSILON64 4.94065645841247e-324; -#define U8_MIN 0u -#define U8_MAX 0xffu -#define S8_MIN ( -0x7f - 1 ) -#define S8_MAX 0x7f +#define MIN_U8 0u +#define MAX_U8 0xffu +#define MIN_S8 ( -0x7f - 1 ) +#define MAX_S8 0x7f -#define U16_MIN 0u -#define U16_MAX 0xffffu -#define S16_MIN ( -0x7fff - 1 ) -#define S16_MAX 0x7fff +#define MIN_U16 0u +#define MAX_U16 0xffffu +#define MIN_S16 ( -0x7fff - 1 ) +#define MAX_S16 0x7fff -#define U32_MIN 0u -#define U32_MAX 0xffffffffu -#define S32_MIN ( -0x7fffffff - 1 ) -#define S32_MAX 0x7fffffff +#define MIN_U32 0u +#define MAX_U32 0xffffffffu +#define MIN_S32 ( -0x7fffffff - 1 ) +#define MAX_S32 0x7fffffff -#define U64_MIN 0ull -#define U64_MAX 0xffffffffffffffffull -#define S64_MIN ( -0x7fffffffffffffffll - 1 ) -#define S64_MAX 0x7fffffffffffffffll +#define MIN_U64 0ull +#define MAX_U64 0xffffffffffffffffull +#define MIN_S64 ( -0x7fffffffffffffffll - 1 ) +#define MAX_S64 0x7fffffffffffffffll -#if defined( ARCH_32_BIT ) -# define USIZE_MIN U32_MIN -# define USIZE_MAX U32_MAX -# define ISIZE_MIN S32_MIN -# define ISIZE_MAX S32_MAX -#elif defined( ARCH_64_BIT ) -# define USIZE_MIN U64_MIN -# define USIZE_MAX U64_MAX -# define ISIZE_MIN S64_MIN -# define ISIZE_MAX S64_MAX +#if ARCH_32BIT +# define MIN_USIZE U32_MIN +# define MAX_USIZE U32_MAX +# define MIN_ISIZE S32_MIN +# define MAX_ISIZE S32_MAX +#elif ARCH_64BIT +# define MIN_USIZE U64_MIN +# define MAX_USIZE U64_MAX +# define MIN_ISIZE S64_MIN +# define MAX_ISIZE S64_MAX #else # error Unknown architecture size. This library only supports 32 bit and 64 bit architectures. #endif -#define F32_MIN 1.17549435e-38f -#define F32_MAX 3.40282347e+38f -#define F64_MIN 2.2250738585072014e-308 -#define F64_MAX 1.7976931348623157e+308 +#define MIN_F32 1.17549435e-38f +#define MAX_F32 3.40282347e+38f +#define MIN_F64 2.2250738585072014e-308 +#define MAX_F64 1.7976931348623157e+308 #define BITMASK1 0x00000001 #define BITMASK2 0x00000003 diff --git a/code/base/memory_substrate.c b/code/base/memory_substrate.c index 4b0b7be..d6f9a72 100644 --- a/code/base/memory_substrate.c +++ b/code/base/memory_substrate.c @@ -226,7 +226,7 @@ VArena varena__alloc(VArenaParams params) } #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); VArena* vm = rcast(VArena*, base); @@ -257,15 +257,10 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ { 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 mask = scast(UPTR, alignment) - 1; - - if ((current_offset & mask) != 0) { - alignment_offset = alignment - (current_offset & mask); - } - - UPTR size_to_allocate = requested_size + alignment_offset; + UPTR size_to_allocate = requested_size; UPTR to_be_used = vm->commit_used + size_to_allocate; 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) { 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) { B32 commit_result = os_commit(vm, next_commit_size); 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 } break; @@ -306,15 +307,22 @@ void* varena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE requ assert(old_size > 0); assert_msg(old_size == requested_size, "Requested resize when none needed"); - UPTR alignment_offset = scast(UPTR, old_memory) & (scast(UPTR, alignment) - 1); - assert_msg(alignment_offset != 0 && requested_size >= old_size, "Requested shrink from VArena"); + requested_size = align_pow2(requested_size, alignment); + old_size = align_pow2(old_size, alignment); 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); - 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 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) { 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) { B32 commit_result = os_commit(vm, next_commit_size); 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 } break; // case AllocatorMode_Pop: - // { - - // } // break; - // case AllocatorMode_Pop_To: - // { - - // } // break; 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); if (arena->used + total_size > arena->slice.len ) { + // Out of memory return allocated_mem; } - allocated_mem = align_pow2(end, alignment); + allocated_mem = end; arena->used += total_size; } break; @@ -399,13 +407,33 @@ void* farena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size 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; // case AllocatorMode_Pop: // break; - // case AllocatorMode_Pop_To: // break; @@ -414,7 +442,7 @@ void* farena_allocator_proc(void* allocator_data, AllocatorMode mode, SSIZE size break; 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 ); break; diff --git a/code/base/strings.c b/code/base/strings.c index d67ee7f..819274c 100644 --- a/code/base/strings.c +++ b/code/base/strings.c @@ -163,6 +163,7 @@ str8_skip_chop_whitespace(String8 string) String8 push_str8_cat(Arena* arena, String8 s1, String8 s2) { +#if MD_DONT_MAP_ANREA_TO_ALLOCATOR_IMPL String8 str; str.size = s1.size + s2.size; 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); str.str[str.size] = 0; return(str); +#else + return str8_cat(arena_allocator(arena), s1, s2); +#endif } 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; str.size = s.size; str.str = push_array_no_zero(arena, U8, str.size + 1); memory_copy(str.str, s.str, s.size); str.str[str.size] = 0; return(str); +#else + return str8_copy(arena_allocator(arena), s); +#endif } 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_copy(args2, args); 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; va_end(args2); return(result); +#else + return str8fv(arena_allocator(arena), fmt, args); +#endif } String8 @@ -200,7 +212,7 @@ str8_cat(AllocatorInfo ainfo, String8 s1, String8 s2) { String8 str; 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.size, s2.str, s2.size); str.str[str.size] = 0; @@ -212,7 +224,7 @@ str8_copy(AllocatorInfo ainfo, String8 s) { String8 str; 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); str.str[str.size] = 0; return(str); @@ -313,7 +325,8 @@ try_u64_from_str8_c_rules(String8 string, U64 *x) //- rjf: integer -> string 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}; if (z < KB(1)) { 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); } return(result); +#else + return str8_from_allocator_size(arena_allocator(arena), z); +#endif } String8 @@ -349,8 +365,9 @@ str8__from_allocator_size(AllocatorInfo ainfo, U64 z) { } 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}; { // rjf: prefix @@ -435,10 +452,12 @@ str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_se } } return result; + #endif + return str8_from_allocator_u64(arena_allocator(arena), u64, radix, min_digits, digit_group_separator); } 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}; { @@ -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.str = alloc_array(ainfo, U8, result.size + 1); + result.str = alloc_array_no_zero(ainfo, U8, result.size + 1); result.str[result.size] = 0; } @@ -529,6 +548,7 @@ str8__from_allocator_u64(AllocatorInfo ainfo, U64 u64, U32 radix, U8 min_digits, String8 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}; // TODO(rjf): preeeeetty sloppy... 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); } return result; +#else + return str8_from_alloctor_s64(arena_allocator(arena), s64, radix, min_digits, digit_group_separator); +#endif } 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}; if(s64 < 0) { U8 bytes[KB(8)]; 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); } 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; } @@ -620,7 +643,7 @@ str8_list_concat_in_place(String8List* list, String8List* to_push) { else { *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* 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 increase_size = 0; @@ -1086,7 +1109,7 @@ read_only global U8 utf8_class[32] = { internal UnicodeDecode utf8_decode(U8 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; + UnicodeDecode result = {1, MAX_U32}; U8 byte = str[0]; U8 byte_class = utf8_class[byte >> 3]; switch (byte_class) @@ -1102,8 +1125,8 @@ utf8_decode(U8 *str, U64 max){ U8 cont_byte = str[1]; if (utf8_class[cont_byte >> 3] == 0) { - result.codepoint = (byte & bitmask5) << 6; - result.codepoint |= (cont_byte & bitmask6); + result.codepoint = (byte & BITMASK5) << 6; + result.codepoint |= (cont_byte & BITMASK6); result.inc = 2; } } @@ -1116,9 +1139,9 @@ utf8_decode(U8 *str, U64 max){ if (utf8_class[cont_byte[0] >> 3] == 0 && utf8_class[cont_byte[1] >> 3] == 0) { - result.codepoint = (byte & bitmask4) << 12; - result.codepoint |= ((cont_byte[0] & bitmask6) << 6); - result.codepoint |= (cont_byte[1] & bitmask6); + result.codepoint = (byte & BITMASK4) << 12; + result.codepoint |= ((cont_byte[0] & BITMASK6) << 6); + result.codepoint |= (cont_byte[1] & BITMASK6); result.inc = 3; } } @@ -1132,10 +1155,10 @@ utf8_decode(U8 *str, U64 max){ utf8_class[cont_byte[1] >> 3] == 0 && utf8_class[cont_byte[2] >> 3] == 0) { - result.codepoint = (byte & bitmask3) << 18; - result.codepoint |= ((cont_byte[0] & bitmask6) << 12); - result.codepoint |= ((cont_byte[1] & bitmask6) << 6); - result.codepoint |= (cont_byte[2] & bitmask6); + result.codepoint = (byte & BITMASK3) << 18; + result.codepoint |= ((cont_byte[0] & BITMASK6) << 12); + result.codepoint |= ((cont_byte[1] & BITMASK6) << 6); + result.codepoint |= (cont_byte[2] & BITMASK6); result.inc = 4; } } diff --git a/code/base/strings.h b/code/base/strings.h index 390da26..ca6eb45 100644 --- a/code/base/strings.h +++ b/code/base/strings.h @@ -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 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 @@ -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); //- rjf: integer -> string -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_s64 (Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); +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_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_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_front (String8List* list, String8Node* node); 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* 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); // #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_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 void str8_list_from_flags (Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); +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 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); //////////////////////////////// //~ rjf; String Arrays -internal String8Array str8_array_from_list(Arena *arena, String8List *list); -internal String8Array str8_array_reserve (Arena *arena, U64 count); +internal String8Array str8_array_from_list(Arena* arena, String8List* list); +internal String8Array str8_array_reserve (Arena* arena, U64 count); //////////////////////////////// //~ 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 PathStyle path_style_from_str8 (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 String8 str8_path_list_join_by_style (Arena *arena, String8List *path, PathStyle style); +internal String8List str8_split_path (Arena* arena, String8 string); +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); //////////////////////////////// //~ rjf: UTF-8 & UTF-16 Decoding/Encoding diff --git a/code/os/core/os_core.c b/code/os/core/os_core.c index c1bade5..d983035 100644 --- a/code/os/core/os_core.c +++ b/code/os/core/os_core.c @@ -1,154 +1,172 @@ +#ifdef INTELLISENSE_DIRECTIVES +# include "os_core.h" +#endif + // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// //~ rjf: Handle Type Functions (Helpers, Implemented Once) -internal OS_Handle +OS_Handle os_handle_zero(void) { - OS_Handle handle = {0}; - return handle; + OS_Handle handle = {0}; + return handle; } -internal B32 +B32 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_HandleNode *n = push_array(arena, OS_HandleNode, 1); - n->v = handle; - SLLQueuePush(handles->first, handles->last, n); - handles->count += 1; + OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); + n->v = handle; + SLLQueuePush(handles->first, handles->last, n); + handles->count += 1; } -internal OS_HandleArray +OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list) { - OS_HandleArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, OS_Handle, result.count); - U64 idx = 0; - for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; + OS_HandleArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, OS_Handle, result.count); + U64 idx = 0; + for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; } //////////////////////////////// //~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) -internal String8List +String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv) { - String8List result = {0}; - for(int i = 0; i < argc; i += 1) - { - String8 str = str8_cstring(argv[i]); - str8_list_push(arena, &result, str); - } - return result; + String8List result = {0}; + for(int i = 0; i < argc; i += 1) + { + String8 str = str8_cstring(argv[i]); + str8_list_push(arena, &result, str); + } + return result; } //////////////////////////////// //~ rjf: Filesystem Helpers (Helpers, Implemented Once) -internal String8 +String8 os_data_from_file_path(Arena *arena, String8 path) { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); - os_file_close(file); - return data; + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + FileProperties props = os_properties_from_file(file); + String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); + os_file_close(file); + return data; } -internal B32 +B32 os_write_data_to_file_path(String8 path, String8 data) { - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - os_file_write(file, r1u64(0, data.size), data.str); - os_file_close(file); - } - return good; + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + os_file_write(file, r1u64(0, data.size), data.str); + os_file_close(file); + } + return good; } -internal B32 +B32 os_write_data_list_to_file_path(String8 path, String8List list) { - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 off = 0; - for(String8Node *n = list.first; n != 0; n = n->next) - { - os_file_write(file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - os_file_close(file); - } - return good; + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if( ! os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 off = 0; + for(String8Node* n = list.first; n != 0; n = n->next) + { + os_file_write(file, r1u64(off, off+n->string.size), n->string.str); + off += n->string.size; + } + os_file_close(file); + } + return good; } -internal B32 +B32 os_append_data_to_file_path(String8 path, String8 data) { - B32 good = 0; - if(data.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 pos = os_properties_from_file(file).size; - os_file_write(file, r1u64(pos, pos+data.size), data.str); - os_file_close(file); - } - } - return good; + B32 good = 0; + if(data.size != 0) + { + OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); + if( ! os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 pos = os_properties_from_file(file).size; + os_file_write(file, r1u64(pos, pos+data.size), data.str); + os_file_close(file); + } + } + return good; } -internal OS_FileID +OS_FileID os_id_from_file_path(String8 path) { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - OS_FileID id = os_id_from_file(file); - os_file_close(file); - return id; + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); + OS_FileID id = os_id_from_file(file); + os_file_close(file); + return id; } -internal S64 +S64 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; } -internal String8 +String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) { - U64 pre_pos = arena_pos(arena); - String8 result; - result.size = dim_1u64(range); - result.str = push_array_no_zero(arena, U8, result.size); - U64 actual_read_size = os_file_read(file, range, result.str); - if(actual_read_size < result.size) - { - arena_pop_to(arena, pre_pos + actual_read_size); - result.size = actual_read_size; - } - return result; + U64 pre_pos = arena_pos(arena); + String8 result; + result.size = dim_1u64(range); + result.str = push_array_no_zero(arena, U8, result.size); + U64 actual_read_size = os_file_read(file, range, result.str); + if(actual_read_size < result.size) + { + arena_pop_to(arena, pre_pos + actual_read_size); + result.size = actual_read_size; + } + 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; } ////////////////////////////////