Seems this strat is still fine...

This commit is contained in:
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 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
+56 -28
View File
@@ -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;
+46 -23
View File
@@ -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;
}
}
+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 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
+110 -92
View File
@@ -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;
}
////////////////////////////////