From a0f95174b22d35c95dbee294b4b0279b7774e007 Mon Sep 17 00:00:00 2001 From: Musa Mahmood Date: Mon, 1 Dec 2025 07:34:37 -0500 Subject: [PATCH] Minor fixes to string builder, examples --- lib/Base/Arena_Array.h | 8 +++++--- lib/Base/Expandable_Arena.cpp | 3 ++- lib/Base/Expandable_Arena.h | 2 +- lib/Base/Logger.cpp | 4 ++-- lib/Base/Serializer.cpp | 2 +- lib/Base/String.cpp | 14 +++++++++----- lib/Base/String.h | 4 ++-- lib/OS/OS_Win32.cpp | 7 ++++--- src/Base_Entry_Point.cpp | 20 +++++++++++++------- 9 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lib/Base/Arena_Array.h b/lib/Base/Arena_Array.h index 2ec2b7b..3b41b8d 100644 --- a/lib/Base/Arena_Array.h +++ b/lib/Base/Arena_Array.h @@ -101,7 +101,7 @@ template ArrayView to_view (ArenaArray& array, s64 start_offs template void array_add (ArenaArray& array, ArrayView items) { T* current_point = &array.data[array.count]; - s64 final_count = array.allocated + items.count; + s64 final_count = array.count + items.count; if (array.allocated < final_count) { array_reserve(array, final_count); @@ -188,7 +188,7 @@ template void init_range (T* ptr, s64 start_offset, s64 end_offset) } } -template void poison_range (ArenaArray& array, s64 start, s64 count) { +template void array_poison_range (ArenaArray& array, s64 start, s64 count) { #if BUILD_DEBUG Assert(start >= 0 && start < array.count); Assert(start + count <= array.count); @@ -202,7 +202,9 @@ template force_inline void array_reset (ArenaArray& array) { // reset backing array: arena_reset(array.arena); array.count = 0; - array.allocated = 0; + // should be # of bytes committed / sizeof(T): + s64 committed_bytes = (s64)(array.arena->first_uncommitted_page - array.data); + array.allocated = committed_bytes / sizeof(T); } template force_inline void reset_keeping_memory (ArenaArray& array) { diff --git a/lib/Base/Expandable_Arena.cpp b/lib/Base/Expandable_Arena.cpp index e331232..f37c9fe 100644 --- a/lib/Base/Expandable_Arena.cpp +++ b/lib/Base/Expandable_Arena.cpp @@ -1,6 +1,7 @@ ExpandableArena* expandable_arena_new (Arena_Reserve starting_reserve, s32 commit_page_count) { ExpandableArena* new_arena = (ExpandableArena*)bootstrap_arena(starting_reserve, commit_page_count); - // Note: beyond first 32 bytes ExpandableArena will not be initialized, so we do it here: + // Note: beyond first 32 bytes (sizeof(Arena)) ExpandableArena will not be initialized, + // so we do it here: new_arena->current = (Arena*)new_arena; new_arena->current_point = expandable_arena_start(new_arena); diff --git a/lib/Base/Expandable_Arena.h b/lib/Base/Expandable_Arena.h index b0e516f..7d396db 100644 --- a/lib/Base/Expandable_Arena.h +++ b/lib/Base/Expandable_Arena.h @@ -13,7 +13,7 @@ struct ExpandableArena { Arena_Reserve reserve_size = Arena_Reserve::Size_64K; Arena_Flags flags = Arena_Flags::None; u32 initial_commit_page_count = ARENA_DEFAULT_COMMIT_PAGE_COUNT; - // Note that this downcasts to Arena, so can be initialized in the same way. + // Note that this downcasts to Arena*, so can be initialized in the same way. Arena* current; Array next_arenas; }; diff --git a/lib/Base/Logger.cpp b/lib/Base/Logger.cpp index 0682ab3..6f9eadb 100644 --- a/lib/Base/Logger.cpp +++ b/lib/Base/Logger.cpp @@ -18,7 +18,7 @@ void log_error (string fmt, ...) { Logger* logger = context_logger(); logger->proc(message, Log_Level::Error, logger->data); - reset_string_builder(sb); + reset_string_builder(sb, true); } void log (string fmt, ...) { @@ -41,7 +41,7 @@ void log (string fmt, ...) { Logger* logger = context_logger(); logger->proc(message, Log_Level::None, logger->data); - reset_string_builder(sb); + reset_string_builder(sb, true); } void print (string message) { diff --git a/lib/Base/Serializer.cpp b/lib/Base/Serializer.cpp index e77a68a..49977b1 100644 --- a/lib/Base/Serializer.cpp +++ b/lib/Base/Serializer.cpp @@ -3,7 +3,7 @@ force_inline Serializer* new_serializer (Arena_Reserve new_reserve) { } force_inline void reset_serializer (Serializer* serializer) { - poison_range(*serializer, 0, serializer->count); + array_poison_range(*serializer, 0, serializer->count); reset_keeping_memory(*serializer); } diff --git a/lib/Base/String.cpp b/lib/Base/String.cpp index 4168faa..ee589dc 100644 --- a/lib/Base/String.cpp +++ b/lib/Base/String.cpp @@ -200,7 +200,7 @@ force_inline void append_no_add (String_Builder* sb, string s) { // Unfortunately this follows the printf format, which is annoying. // I'd rather have something like fmt:: void print_to_builder (String_Builder* sb, string format, va_list args) { - s64 expected_final_count = sb->count + format.count + 4096; + s64 expected_final_count = max_array_size(*sb);// amount to reserve if (sb->allocated < expected_final_count) { array_reserve(*sb, expected_final_count); @@ -215,7 +215,7 @@ void print_to_builder (String_Builder* sb, string format, va_list args) { } void print_to_builder (String_Builder* sb, string format, ...) { - s64 expected_final_count = sb->count + format.count + 4096; + s64 expected_final_count = max_array_size(*sb); if (sb->allocated < expected_final_count) { array_reserve(*sb, expected_final_count); @@ -239,9 +239,13 @@ string string_view (String_Builder* sb) { } // for when we want to keep the string builder around and recycle the memory. -internal force_inline void reset_string_builder (String_Builder* sb) { - poison_range(*sb, 0, sb->count); - reset_keeping_memory(*sb); +internal force_inline void reset_string_builder (String_Builder* sb, bool keep_memory) { + array_poison_range(*sb, 0, sb->count); + if (keep_memory) { + reset_keeping_memory(*sb); + } else { + array_reset(*sb); + } } force_inline string builder_to_string (String_Builder* sb) { diff --git a/lib/Base/String.h b/lib/Base/String.h index 387e816..1326ee4 100644 --- a/lib/Base/String.h +++ b/lib/Base/String.h @@ -113,12 +113,12 @@ typedef ArenaArray String_Builder; // struct String_Builder force_inline String_Builder* new_string_builder (Arena_Reserve new_reserve=Arena_Reserve::Size_64K); force_inline void append (String_Builder* sb, string s); void append (String_Builder* sb, ArrayView strings); +// This should probably be called append_but_do_not_increment_count internal force_inline void append_no_add (String_Builder* sb, string s); // for appending null terminators, does not increment count. void print_to_builder (String_Builder* sb, string format, ...); void print_to_builder (String_Builder* sb, string format, va_list args); string string_view (String_Builder* sb); -internal force_inline void reset_string_builder (String_Builder* sb); +internal force_inline void reset_string_builder (String_Builder* sb, bool keep_memory=false); force_inline string builder_to_string (String_Builder* sb); // returns string view internal force_inline void free_string_builder (String_Builder* sb); - diff --git a/lib/OS/OS_Win32.cpp b/lib/OS/OS_Win32.cpp index eb2fbb2..0eae892 100644 --- a/lib/OS/OS_Win32.cpp +++ b/lib/OS/OS_Win32.cpp @@ -469,7 +469,7 @@ internal ArrayView read_entire_file (File file) { } internal ArrayView read_entire_file (string file_path, bool log_errors) { - File f = file_open(file_path, log_errors=log_errors); + File f = file_open(file_path, false, false, log_errors); if (!file_is_valid(f)) return {}; ArrayView file_data = read_entire_file(f); @@ -504,8 +504,9 @@ internal bool write_entire_file (string file_path, ArrayView file_data) { return write_entire_file(file_path, file_data.data, file_data.count); } -// #window_creation -Window_Type create_window (string new_window_name) { +// #window_creation -> put API in OS_Win32.h +// void initialize_window_class(float background_color[3]) {} +Window_Type create_window (string new_window_name, bool center_window) { return 0; } diff --git a/src/Base_Entry_Point.cpp b/src/Base_Entry_Point.cpp index 71b94b0..b8e3976 100644 --- a/src/Base_Entry_Point.cpp +++ b/src/Base_Entry_Point.cpp @@ -222,14 +222,20 @@ internal void Main_Entry_Point (int argc, WCHAR **argv) { log("Hello. There are %s things here\n", string_literal_example.data); print("Hello, I am just a printed message to stdout\n\n"); + + + // Testing file writes and reads: + print("Writing some nonsense to a file.\n"); + bool success = write_entire_file("D:/TempLocal/junk.txt", to_view(result)); + log("Done. Success: %d\n", success); + + // push_allocator(allocator(thread_context()->arena)); + push_allocator(GPAllocator()); + string file_path = "D:/Work/OpenBCI/ToolZ/prototyping-gui-main/modules/native-proto-lib/native-sdk-prototyping/src/SignalProcessing.cpp"; + ArrayView file_data = read_entire_file(file_path, true); + log("file_data: \n"); + log("%s\n", file_data.data); } - // { string s = "hello I am cool"; - // wstring sw = utf8_to_wide(s); - // printf("testing operator overload: %d\n", !s); - // printf("testing utf8_to_wide: %ls\n", (wchar_t*)sw.data); - // } - // debug_break(); - // ImGui_Application(); // #TODO: #Main - `Main_Entry_Point`