From 89516d827bbf6c1ff6cb5b0b07450c723dfd3aac Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 27 Nov 2018 20:36:09 -0800 Subject: [PATCH] Push string/push string copy in string library --- 4coder_API/4coder_custom.h | 2 ++ 4coder_default_include.cpp | 7 ++--- 4coder_generated/remapping.h | 4 +-- 4coder_lib/4coder_arena.cpp | 20 ------------- 4coder_lib/4coder_arena.h | 6 ---- 4coder_lib/4coder_string.h | 39 +++++++++++++++++++++----- 4ed_app_target.cpp | 11 ++------ meta/4ed_metagen.cpp | 2 +- platform_linux/linux_4ed.cpp | 4 +-- platform_mac/mac_4ed.cpp | 9 +++--- platform_win32/win32_4ed.cpp | 29 ++++++++++--------- platform_win32/win32_library_wrapper.h | 2 +- string/4coder_string_build_num.txt | 2 +- string/4ed_string_builder.cpp | 25 +++++++++-------- string/internal_4coder_string.cpp | 33 ++++++++++++++++++---- 15 files changed, 109 insertions(+), 86 deletions(-) diff --git a/4coder_API/4coder_custom.h b/4coder_API/4coder_custom.h index 36419201..8faf3ae1 100644 --- a/4coder_API/4coder_custom.h +++ b/4coder_API/4coder_custom.h @@ -9,6 +9,8 @@ #include +#include "4coder_lib/4coder_arena.h" +#include "4coder_lib/4coder_heap.h" #include "4coder_lib/4coder_string.h" #include "4coder_lib/4cpp_lexer_types.h" #include "4coder_API/4coder_version.h" diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 00175e89..b7383b4f 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -15,16 +15,15 @@ #include "4coder_generated/command_metadata.h" +#include "4coder_lib/4coder_arena.cpp" +#include "4coder_lib/4coder_heap.cpp" + #define FSTRING_IMPLEMENTATION #include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_table.h" -#include "4coder_lib/4coder_arena.h" -#include "4coder_lib/4coder_heap.h" #include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4cpp_lexer.h" -#include "4coder_lib/4coder_arena.cpp" -#include "4coder_lib/4coder_heap.cpp" #include "4coder_ui_helper.h" #include "4coder_helper.h" diff --git a/4coder_generated/remapping.h b/4coder_generated/remapping.h index 48a950f0..68d0e9ff 100644 --- a/4coder_generated/remapping.h +++ b/4coder_generated/remapping.h @@ -176,7 +176,7 @@ bind(context, key_up, MDFR_NONE, lister__move_up); bind(context, 'k', MDFR_ALT, lister__move_up); bind(context, key_page_up, MDFR_NONE, lister__move_up); bind(context, key_down, MDFR_NONE, lister__move_down); -bind(context, 'j', MDFR_ALT, lister__move_up); +bind(context, 'j', MDFR_ALT, lister__move_down); bind(context, key_page_down, MDFR_NONE, lister__move_down); bind(context, key_mouse_wheel, MDFR_NONE, lister__wheel_scroll); bind(context, key_mouse_left, MDFR_NONE, lister__mouse_press); @@ -576,7 +576,7 @@ static Meta_Key_Bind fcoder_binds_for_default_default_lister_ui_map[16] = { {0, 107, 2, "lister__move_up", 15, LINK_PROCS(lister__move_up)}, {0, 55305, 0, "lister__move_up", 15, LINK_PROCS(lister__move_up)}, {0, 55298, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)}, -{0, 106, 2, "lister__move_up", 15, LINK_PROCS(lister__move_up)}, +{0, 106, 2, "lister__move_down", 17, LINK_PROCS(lister__move_down)}, {0, 55306, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)}, {0, 55312, 0, "lister__wheel_scroll", 20, LINK_PROCS(lister__wheel_scroll)}, {0, 55308, 0, "lister__mouse_press", 19, LINK_PROCS(lister__mouse_press)}, diff --git a/4coder_lib/4coder_arena.cpp b/4coder_lib/4coder_arena.cpp index e7259803..0a767891 100644 --- a/4coder_lib/4coder_arena.cpp +++ b/4coder_lib/4coder_arena.cpp @@ -81,26 +81,6 @@ end_temp_memory(Temp_Memory temp){ ((Partition*)temp.handle)->pos = temp.pos; } -inline Tail_Temp_Partition -begin_tail_part(Partition *data, i32_4tech size){ - Tail_Temp_Partition result = {}; - if (data->pos + size <= data->max){ - result.handle = data; - result.old_max = data->max; - data->max -= size; - result.part = make_part(data->base + data->max, size); - } - return(result); -} - -inline void -end_tail_part(Tail_Temp_Partition temp){ - if (temp.handle){ - Partition *part = (Partition*)temp.handle; - part->max = temp.old_max; - } -} - #define reset_temp_memory end_temp_memory // BOTTOM diff --git a/4coder_lib/4coder_arena.h b/4coder_lib/4coder_arena.h index 4190d001..454954f9 100644 --- a/4coder_lib/4coder_arena.h +++ b/4coder_lib/4coder_arena.h @@ -55,12 +55,6 @@ struct Temp_Memory{ i32_4tech pos; }; -struct Tail_Temp_Partition{ - Partition part; - void *handle; - i32_4tech old_max; -}; - #endif // BOTTOM diff --git a/4coder_lib/4coder_string.h b/4coder_lib/4coder_string.h index 00d573d7..115e8f0b 100644 --- a/4coder_lib/4coder_string.h +++ b/4coder_lib/4coder_string.h @@ -1,5 +1,5 @@ /* -4coder_string.h - Version 1.0.114 +4coder_string.h - Version 1.0.116 no warranty implied; use at your own risk This software is in the public domain. Where that dedication is not @@ -217,6 +217,8 @@ FSTRING_LINK String get_first_double_line(String source); FSTRING_LINK String get_next_double_line(String source, String line); FSTRING_LINK String get_next_word(String source, String prev_word); FSTRING_LINK String get_first_word(String source); +FSTRING_LINK String string_push(Partition *part, i32_4tech size); +FSTRING_LINK String string_push_copy(Partition *part, String str); #endif @@ -487,11 +489,7 @@ make_string_cap(void *str, i32_4tech size, i32_4tech mem_size){ #if !defined(FSTRING_GUARD) FSTRING_INLINE String make_string(void *str, i32_4tech size){ - String result; - result.str = (char*)str; - result.size = size; - result.memory_size = size; - return(result); + return(make_string(str, size, size)); } #endif @@ -976,6 +974,7 @@ compare_ss(String a, String b){ // Finding Characters and Substrings // + #if defined(FSTRING_IMPLEMENTATION) FSTRING_LINK i32_4tech find_c_char(char *str, i32_4tech start, char character){ @@ -1476,7 +1475,8 @@ append_padding(String *dest, char c, i32_4tech target_size){ #if defined(FSTRING_IMPLEMENTATION) FSTRING_LINK void -string_interpret_escapes(String src, char *dst){ +string_interpret_escapes(String src, char *dst) +{ i32_4tech mode = 0; i32_4tech j = 0; for (i32_4tech i = 0; i < src.size; ++i){ @@ -2295,6 +2295,31 @@ get_first_word(String source){ } #endif +#if defined(FSTRING_IMPLEMENTATION) +FSTRING_LINK String +string_push(Partition *part, i32_4tech size){ + String result = {}; + result.str = push_array(part, char, size); + if (result.str != 0){ + result.memory_size = size; + } + return(result); +} +#endif + +#if defined(FSTRING_IMPLEMENTATION) +FSTRING_LINK String +string_push_copy(Partition *part, String str){ + String result = {}; + result.str = push_array(part, char, str.size + 1); + if (result.str != 0){ + result.memory_size = str.size + 1; + copy(&result, str); + } + return(result); +} +#endif + // TODO(allen): eliminate this. #ifndef FSTRING_EXPERIMENTAL #define FSTRING_EXPERIMENTAL diff --git a/4ed_app_target.cpp b/4ed_app_target.cpp index 339dd934..f4e93397 100644 --- a/4ed_app_target.cpp +++ b/4ed_app_target.cpp @@ -12,21 +12,19 @@ // TODO(allen): get away from string.h #include -#include "4ed_defines.h" - #include "4coder_API/4coder_custom.h" +#include "4ed_defines.h" #include "4ed_math.h" #include "4ed_font.h" #include "4ed_system.h" #define PREFERRED_ALIGNMENT 8 +#include "4coder_lib/4coder_arena.cpp" +#include "4coder_lib/4coder_heap.cpp" #define FSTRING_IMPLEMENTATION -#define FSTRING_C #include "4coder_lib/4coder_string.h" -#include "4coder_lib/4coder_arena.h" -#include "4coder_lib/4coder_heap.h" #include "4coder_lib/4coder_table.h" #include "4coder_lib/4coder_utf8.h" @@ -35,9 +33,6 @@ struct Mem_Options{ Heap heap; }; -#include "4coder_lib/4coder_arena.cpp" -#include "4coder_lib/4coder_heap.cpp" - #include "4ed_render_target.h" #include "4ed_render_format.h" #include "4ed.h" diff --git a/meta/4ed_metagen.cpp b/meta/4ed_metagen.cpp index 494b705f..ab73444b 100644 --- a/meta/4ed_metagen.cpp +++ b/meta/4ed_metagen.cpp @@ -629,7 +629,7 @@ generate_remapping_code_and_data(Partition *part){ bind(part, mappings, 'k' , MDFR_ALT , lister__move_up); bind(part, mappings, key_page_up , MDFR_NONE, lister__move_up); bind(part, mappings, key_down , MDFR_NONE, lister__move_down); - bind(part, mappings, 'j' , MDFR_ALT , lister__move_up); + bind(part, mappings, 'j' , MDFR_ALT , lister__move_down); bind(part, mappings, key_page_down, MDFR_NONE, lister__move_down); bind(part, mappings, key_mouse_wheel , MDFR_NONE, lister__wheel_scroll); bind(part, mappings, key_mouse_left , MDFR_NONE, lister__mouse_press); diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 1fac8885..cbc9a7b4 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -23,10 +23,10 @@ # include "4coder_API/4coder_keycodes.h" # include "4coder_API/4coder_style.h" -# define FSTRING_IMPLEMENTATION -# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_arena.h" # include "4coder_lib/4coder_arena.cpp" +# define FSTRING_IMPLEMENTATION +# include "4coder_lib/4coder_string.h" # include "4coder_API/4coder_types.h" diff --git a/platform_mac/mac_4ed.cpp b/platform_mac/mac_4ed.cpp index 3b0a2029..78a2b471 100644 --- a/platform_mac/mac_4ed.cpp +++ b/platform_mac/mac_4ed.cpp @@ -17,14 +17,13 @@ #include "4coder_lib/4coder_utf8.h" #if defined(FRED_SUPER) -# include "4coder_API/4coder_keycodes.h" -# include "4coder_API/4coder_style.h" - -# define FSTRING_IMPLEMENTATION -# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_arena.h" # include "4coder_lib/4coder_arena.cpp" +# define FSTRING_IMPLEMENTATION +# include "4coder_lib/4coder_string.h" +# include "4coder_API/4coder_keycodes.h" +# include "4coder_API/4coder_style.h" # include "4coder_API/4coder_types.h" #else diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index ef1c5643..c16de0d1 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -28,16 +28,14 @@ #include "4coder_lib/4coder_utf8.h" #if defined(FRED_SUPER) -# include "4coder_API/4coder_keycodes.h" -# include "4coder_API/4coder_style.h" - -# define FSTRING_IMPLEMENTATION -# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_arena.h" # include "4coder_lib/4coder_arena.cpp" +# define FSTRING_IMPLEMENTATION +# include "4coder_lib/4coder_string.h" +# include "4coder_API/4coder_keycodes.h" +# include "4coder_API/4coder_style.h" # include "4coder_API/4coder_types.h" - #else # include "4coder_default_bindings.cpp" #endif @@ -59,8 +57,13 @@ ////////////////////////////// +enum{ + ErrorString_UseLog = 0, + ErrorString_UseErrorBox = 1, +}; + internal void -win32_output_error_string(b32 use_error_box = true); +win32_output_error_string(i32 error_string_type); ////////////////////////////// @@ -293,7 +296,7 @@ internal void win32_post_clipboard(char *text, i32 len){ if (OpenClipboard(win32vars.window_handle)){ if (!EmptyClipboard()){ - win32_output_error_string(false); + win32_output_error_string(ErrorString_UseLog); } HANDLE memory_handle = GlobalAlloc(GMEM_MOVEABLE, len + 1); if (memory_handle){ @@ -789,24 +792,24 @@ win32_init_gl(HDC hdc){ format.iLayerType = PFD_MAIN_PLANE; i32 suggested_format_index = ChoosePixelFormat(hwgldc, &format); if (suggested_format_index == 0){ - win32_output_error_string(); + win32_output_error_string(ErrorString_UseErrorBox); GLInitFail("ChoosePixelFormat"); } DescribePixelFormat(hwgldc, suggested_format_index, sizeof(format), &format); if (!SetPixelFormat(hwgldc, suggested_format_index, &format)){ - win32_output_error_string(); + win32_output_error_string(ErrorString_UseErrorBox); GLInitFail("SetPixelFormat"); } HGLRC wglcontext = wglCreateContext(hwgldc); if (wglcontext == 0){ - win32_output_error_string(); + win32_output_error_string(ErrorString_UseErrorBox); GLInitFail("wglCreateContext"); } if (!wglMakeCurrent(hwgldc, wglcontext)){ - win32_output_error_string(); + win32_output_error_string(ErrorString_UseErrorBox); GLInitFail("wglMakeCurrent"); } @@ -1326,7 +1329,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS LOG("Initializing clipboard\n"); if (!AddClipboardFormatListener(win32vars.window_handle)){ - win32_output_error_string(false); + win32_output_error_string(ErrorString_UseLog); } win32vars.clip_max = KB(16); diff --git a/platform_win32/win32_library_wrapper.h b/platform_win32/win32_library_wrapper.h index dc28c5e3..3f4a1b59 100644 --- a/platform_win32/win32_library_wrapper.h +++ b/platform_win32/win32_library_wrapper.h @@ -20,7 +20,7 @@ system_load_library_direct(Library *library, char *name){ library->lib = LoadLibraryA(name); b32 success = (library->lib != 0); if (!success){ - win32_output_error_string(false); + win32_output_error_string(ErrorString_UseLog); } return(success); } diff --git a/string/4coder_string_build_num.txt b/string/4coder_string_build_num.txt index eaffcff3..68ade6f2 100644 --- a/string/4coder_string_build_num.txt +++ b/string/4coder_string_build_num.txt @@ -1,5 +1,5 @@ 1 0 -116 +117 diff --git a/string/4ed_string_builder.cpp b/string/4ed_string_builder.cpp index aa5ca098..74a56a95 100644 --- a/string/4ed_string_builder.cpp +++ b/string/4ed_string_builder.cpp @@ -18,9 +18,11 @@ #define BACKUP_FOLDER ".." SLASH ".." SLASH "string_backup" -#include "../4coder_lib/4cpp_lexer.h" +#include "../4coder_lib/4coder_arena.h" +#include "../4coder_lib/4coder_arena.cpp" #define FSTRING_IMPLEMENTATION #include "../4coder_lib/4coder_string.h" +#include "../4coder_lib/4cpp_lexer.h" #include "../4ed_defines.h" #include "../meta/4ed_meta_defines.h" @@ -149,17 +151,18 @@ print_function_body_code(String *out, Parse_Context *context, i32 start){ } internal void -file_move(char *path, char *file_name){ - fm_copy_file(fm_str(file_name), fm_str(path, "/", file_name)); +file_move(Partition *part, char *path, char *file_name){ + fm_copy_file(fm_str(part, file_name), fm_str(part, path, "/", file_name)); } int main(){ META_BEGIN(); - fm_init_system(); + Partition part_ = fm_init_system(); + Partition *part = &part_; // NOTE(allen): Parse the internal string file. char *string_files[] = { INTERNAL_STRING, 0 }; - Meta_Unit string_unit = compile_meta_unit(".", string_files, ExpandArray(meta_keywords)); + Meta_Unit string_unit = compile_meta_unit(part, ".", string_files, ExpandArray(meta_keywords)); if (string_unit.parse == 0){ Assert(!"Missing one or more input files!"); @@ -191,7 +194,7 @@ int main(){ } // NOTE(allen): String Library - String out = str_alloc(10 << 20); + String out = str_alloc(part, 10 << 20); Cpp_Token *token = 0; i32 start = 0; @@ -212,7 +215,7 @@ int main(){ append(&out, "/*\n"); - append(&out, GENERATED_FILE " - Version "V_MAJ"."V_MIN"."); + append(&out, GENERATED_FILE " - Version " V_MAJ "." V_MIN "."); append_int_to_str(&out, build_number); append(&out, "\n"); @@ -436,11 +439,11 @@ int main(){ // NOTE(allen): Publish the new file. (Would like to be able to automatically test the result before publishing). { - fm_make_folder_if_missing(BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN); - file_move(BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN, INTERNAL_STRING); - file_move(BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN, GENERATED_FILE); + fm_make_folder_if_missing(part, BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN); + file_move(part, BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN, INTERNAL_STRING); + file_move(part, BACKUP_FOLDER SLASH V_MAJ SLASH V_MIN, GENERATED_FILE); fm_delete_file(GENERATED_FILE); - printf("published "GENERATED_FILE": v%d.%d.%d\n", major_number, minor_number, build_number); + printf("published " GENERATED_FILE ": v%d.%d.%d\n", major_number, minor_number, build_number); save_build_number(BUILD_NUMBER_FILE, major_number, minor_number, build_number + 1); } diff --git a/string/internal_4coder_string.cpp b/string/internal_4coder_string.cpp index 1d80b1b7..c6ca8fd1 100644 --- a/string/internal_4coder_string.cpp +++ b/string/internal_4coder_string.cpp @@ -201,11 +201,7 @@ does not specify the size of the memory it is also assumed that this size is the of the memory.) DOC(This call returns the String created from the parameters.) */{ - String result; - result.str = (char*)str; - result.size = size; - result.memory_size = size; - return(result); + return(make_string(str, size, size)); } API_EXPORT_MACRO @@ -2126,6 +2122,33 @@ DOC_SEE(get_next_word) return(word); } +API_EXPORT FSTRING_LINK String +string_push(Partition *part, i32_4tech size)/* +DOC_PARAM(part, A partition on which the string will be allocated.) +DOC_PARAM(size, The number of bytes to allocated for the new string.) +DOC_RETURN(If successfull returns an empty string with capacity equal to the size parameter, otherwise returns a null string.)*/{ + String result = {}; + result.str = push_array(part, char, size); + if (result.str != 0){ + result.memory_size = size; + } + return(result); +} + +API_EXPORT FSTRING_LINK String +string_push_copy(Partition *part, String str)/* +DOC_PARAM(part, A partition on which the string will be allocated.) +DOC_PARAM(str, The source string to copy into the new string. The copy includes a null terminator whther or not the source does.) +DOC_RETURN(If successfull returns a string copy of str, otherwise returns a null string.)*/{ + String result = {}; + result.str = push_array(part, char, str.size + 1); + if (result.str != 0){ + result.memory_size = str.size + 1; + copy(&result, str); + } + return(result); +} + // TODO(allen): eliminate this. #ifndef FSTRING_EXPERIMENTAL #define FSTRING_EXPERIMENTAL