mirror of
https://github.com/Ed94/metadesk.git
synced 2026-06-12 23:51:37 -07:00
Seems this strat is still fine...
This commit is contained in:
+30
-30
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user