From 706b7dc6174f690f72ea8040195466602460c7d3 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 23 Feb 2017 21:30:29 -0500 Subject: [PATCH] new mark setting system setup, not finished testing new write_character --- 4coder_API/app_functions.h | 28 ++++++ 4coder_API/types.h | 8 +- 4coder_base_commands.cpp | 14 ++- 4coder_helper/4coder_helper.h | 41 +++++--- 4ed_api_implementation.cpp | 60 +++++++++++ 4ed_doubly_linked_list.cpp | 1 + 4ed_file_view.cpp | 68 +++++++++---- 4ed_site.ctm | Bin 1220 -> 1236 bytes file/4coder_buffer.cpp | 69 +++++++++---- file/4coder_file.cpp | 155 +++++++++++++++++++++++++---- file/4coder_working_set.cpp | 24 ++--- meta/4tech_file_moving.h | 15 +-- meta/build.cpp | 6 +- string/4coder_string_build_num.txt | 2 +- string/_4coder_string.ctm | Bin 2548 -> 2564 bytes win32_4ed.cpp | 2 +- 16 files changed, 392 insertions(+), 101 deletions(-) diff --git a/4coder_API/app_functions.h b/4coder_API/app_functions.h index d0ae16b2..5f1ab6f7 100644 --- a/4coder_API/app_functions.h +++ b/4coder_API/app_functions.h @@ -13,6 +13,10 @@ struct Application_Links; #define BUFFER_REPLACE_RANGE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len) #define BUFFER_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out) #define BUFFER_BATCH_EDIT_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type) +#define BUFFER_ADD_MARKERS_SIG(n) Marker_Handle n(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count) +#define BUFFER_SET_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) +#define BUFFER_GET_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) +#define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker) #define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out) #define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value) #define BUFFER_TOKEN_COUNT_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer) @@ -80,6 +84,10 @@ typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function); typedef BUFFER_COMPUTE_CURSOR_SIG(Buffer_Compute_Cursor_Function); typedef BUFFER_BATCH_EDIT_SIG(Buffer_Batch_Edit_Function); +typedef BUFFER_ADD_MARKERS_SIG(Buffer_Add_Markers_Function); +typedef BUFFER_SET_MARKERS_SIG(Buffer_Set_Markers_Function); +typedef BUFFER_GET_MARKERS_SIG(Buffer_Get_Markers_Function); +typedef BUFFER_REMOVE_MARKERS_SIG(Buffer_Remove_Markers_Function); typedef BUFFER_GET_SETTING_SIG(Buffer_Get_Setting_Function); typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function); typedef BUFFER_TOKEN_COUNT_SIG(Buffer_Token_Count_Function); @@ -149,6 +157,10 @@ Buffer_Read_Range_Function *buffer_read_range; Buffer_Replace_Range_Function *buffer_replace_range; Buffer_Compute_Cursor_Function *buffer_compute_cursor; Buffer_Batch_Edit_Function *buffer_batch_edit; +Buffer_Add_Markers_Function *buffer_add_markers; +Buffer_Set_Markers_Function *buffer_set_markers; +Buffer_Get_Markers_Function *buffer_get_markers; +Buffer_Remove_Markers_Function *buffer_remove_markers; Buffer_Get_Setting_Function *buffer_get_setting; Buffer_Set_Setting_Function *buffer_set_setting; Buffer_Token_Count_Function *buffer_token_count; @@ -217,6 +229,10 @@ Buffer_Read_Range_Function *buffer_read_range_; Buffer_Replace_Range_Function *buffer_replace_range_; Buffer_Compute_Cursor_Function *buffer_compute_cursor_; Buffer_Batch_Edit_Function *buffer_batch_edit_; +Buffer_Add_Markers_Function *buffer_add_markers_; +Buffer_Set_Markers_Function *buffer_set_markers_; +Buffer_Get_Markers_Function *buffer_get_markers_; +Buffer_Remove_Markers_Function *buffer_remove_markers_; Buffer_Get_Setting_Function *buffer_get_setting_; Buffer_Set_Setting_Function *buffer_set_setting_; Buffer_Token_Count_Function *buffer_token_count_; @@ -293,6 +309,10 @@ app_links->buffer_read_range_ = Buffer_Read_Range;\ app_links->buffer_replace_range_ = Buffer_Replace_Range;\ app_links->buffer_compute_cursor_ = Buffer_Compute_Cursor;\ app_links->buffer_batch_edit_ = Buffer_Batch_Edit;\ +app_links->buffer_add_markers_ = Buffer_Add_Markers;\ +app_links->buffer_set_markers_ = Buffer_Set_Markers;\ +app_links->buffer_get_markers_ = Buffer_Get_Markers;\ +app_links->buffer_remove_markers_ = Buffer_Remove_Markers;\ app_links->buffer_get_setting_ = Buffer_Get_Setting;\ app_links->buffer_set_setting_ = Buffer_Set_Setting;\ app_links->buffer_token_count_ = Buffer_Token_Count;\ @@ -361,6 +381,10 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range(app, buffer, start, end, str, len));} static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor(app, buffer, seek, cursor_out));} static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit(app, buffer, str, str_len, edits, edit_count, type));} +static inline Marker_Handle buffer_add_markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count){return(app->buffer_add_markers(app, buffer, marker_count));} +static inline bool32 buffer_set_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers(app, buffer, marker, first_marker_index, marker_count, source_markers));} +static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers(app, buffer, marker, first_marker_index, marker_count, markers_out));} +static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers(app, buffer, marker));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));} static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count(app, buffer));} @@ -429,6 +453,10 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range_(app, buffer, start, end, str, len));} static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor_(app, buffer, seek, cursor_out));} static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit_(app, buffer, str, str_len, edits, edit_count, type));} +static inline Marker_Handle buffer_add_markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count){return(app->buffer_add_markers_(app, buffer, marker_count));} +static inline bool32 buffer_set_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers_(app, buffer, marker, first_marker_index, marker_count, source_markers));} +static inline bool32 buffer_get_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers_(app, buffer, marker, first_marker_index, marker_count, markers_out));} +static inline bool32 buffer_remove_markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){return(app->buffer_remove_markers_(app, buffer, marker));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));} static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count_(app, buffer));} diff --git a/4coder_API/types.h b/4coder_API/types.h index 16613b58..291f40fb 100644 --- a/4coder_API/types.h +++ b/4coder_API/types.h @@ -1,5 +1,4 @@ - #if !defined(FCODER_TYPES_H) #define FCODER_TYPES_H @@ -609,6 +608,13 @@ STRUCT Buffer_Summary{ GLOBAL_VAR Buffer_Summary null_buffer_summary = {0}; +STRUCT Marker{ + int32_t pos; + bool32 lean_right; +}; + +typedef void* Marker_Handle; + STRUCT i32_Rect{ int32_t x0; int32_t y0; diff --git a/4coder_base_commands.cpp b/4coder_base_commands.cpp index 0dd14732..453bffe1 100644 --- a/4coder_base_commands.cpp +++ b/4coder_base_commands.cpp @@ -34,8 +34,20 @@ CUSTOM_COMMAND_SIG(write_character){ if (length != 0){ Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); int32_t pos = view.cursor.pos; + + Marker next_cursor_marker = {0}; + next_cursor_marker.pos = character_pos_to_pos(app, &view, &buffer, view.cursor.character_pos); + next_cursor_marker.lean_right = true; + + Marker_Handle handle = buffer_add_markers(app, &buffer, 1); + buffer_set_markers(app, &buffer, handle, 0, 1, &next_cursor_marker); + buffer_replace_range(app, &buffer, pos, pos, (char*)character, length); - view_set_cursor(app, &view, seek_character_pos(view.cursor.character_pos + 1), true); + + buffer_get_markers(app, &buffer, handle, 0, 1, &next_cursor_marker); + buffer_remove_markers(app, &buffer, handle); + + view_set_cursor(app, &view, seek_pos(next_cursor_marker.pos), true); } } diff --git a/4coder_helper/4coder_helper.h b/4coder_helper/4coder_helper.h index 882cc93c..d8e48b38 100644 --- a/4coder_helper/4coder_helper.h +++ b/4coder_helper/4coder_helper.h @@ -7,12 +7,12 @@ #include "4coder_seek_types.h" -inline void +static void exec_command(Application_Links *app, Custom_Command_Function *func){ func(app); } -inline void +static void exec_command(Application_Links *app, Generic_Command cmd){ if (cmd.cmdid < cmdid_count){ exec_command(app, cmd.cmdid); @@ -22,7 +22,7 @@ exec_command(Application_Links *app, Generic_Command cmd){ } } -inline View_Summary +static View_Summary get_first_view_with_buffer(Application_Links *app, int32_t buffer_id){ View_Summary result = {}; View_Summary test = {}; @@ -45,7 +45,7 @@ get_first_view_with_buffer(Application_Links *app, int32_t buffer_id){ return(result); } -inline int32_t +static int32_t key_is_unmodified(Key_Event_Data *key){ char *mods = key->modifiers; int32_t unmodified = !mods[MDFR_CONTROL_INDEX] && !mods[MDFR_ALT_INDEX]; @@ -135,19 +135,19 @@ query_user_general(Application_Links *app, Query_Bar *bar, bool32 force_number){ return(success); } -inline int32_t +static int32_t query_user_string(Application_Links *app, Query_Bar *bar){ int32_t success = query_user_general(app, bar, false); return(success); } -inline int32_t +static int32_t query_user_number(Application_Links *app, Query_Bar *bar){ int32_t success = query_user_general(app, bar, true); return(success); } -inline char +static char buffer_get_char(Application_Links *app, Buffer_Summary *buffer, int32_t pos){ char result = ' '; *buffer = get_buffer(app, buffer->buffer_id, AccessAll); @@ -157,7 +157,7 @@ buffer_get_char(Application_Links *app, Buffer_Summary *buffer, int32_t pos){ return(result); } -inline Buffer_Identifier +static Buffer_Identifier buffer_identifier(char *str, int32_t len){ Buffer_Identifier identifier; identifier.name = str; @@ -166,7 +166,7 @@ buffer_identifier(char *str, int32_t len){ return(identifier); } -inline Buffer_Identifier +static Buffer_Identifier buffer_identifier(int32_t id){ Buffer_Identifier identifier; identifier.name = 0; @@ -187,7 +187,7 @@ create_buffer(Application_Links *app, char *filename, int32_t filename_len, Buff return(buffer); } -inline Range +static Range make_range(int32_t p1, int32_t p2){ Range range; if (p1 < p2){ @@ -211,6 +211,17 @@ adjust_all_buffer_wrap_widths(Application_Links *app, int32_t wrap_width, int32_ } } +// TODO(allen): Setup buffer seeking to do character_pos and get View_Summary out of this parameter list. +static int32_t +character_pos_to_pos(Application_Links *app, View_Summary *view, Buffer_Summary *buffer, int32_t character_pos){ + int32_t result = 0; + Full_Cursor cursor = {0}; + if (view_compute_cursor(app, view, seek_character_pos(character_pos), &cursor)){ + result = cursor.pos; + } + return(result); +} + struct Buffer_Rect{ int32_t char0, line0; int32_t char1, line1; @@ -220,7 +231,7 @@ struct Buffer_Rect{ #define Swap(T,a,b) do{ T t = a; a = b; b = t; } while(0) #endif -inline Buffer_Rect +static Buffer_Rect get_rect(View_Summary *view){ Buffer_Rect rect = {0}; @@ -240,7 +251,7 @@ get_rect(View_Summary *view){ return(rect); } -inline i32_Rect +static i32_Rect get_line_x_rect(View_Summary *view){ i32_Rect rect = {0}; @@ -371,7 +382,7 @@ refresh_view(Application_Links *app, View_Summary *view){ *view = get_view(app, view->view_id, AccessAll); } -inline float +static float get_view_y(View_Summary *view){ float y = view->cursor.wrapped_y; if (view->unwrapped_lines){ @@ -380,7 +391,7 @@ get_view_y(View_Summary *view){ return(y); } -inline float +static float get_view_x(View_Summary *view){ float x = view->cursor.wrapped_x; if (view->unwrapped_lines){ @@ -389,7 +400,7 @@ get_view_x(View_Summary *view){ return(x); } -inline Range +static Range get_range(View_Summary *view){ Range range = make_range(view->cursor.pos, view->mark.pos); return(range); diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 9644ff86..76394559 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -702,6 +702,66 @@ DOC_SEE(Buffer_Batch_Edit_Type) return(result); } +API_EXPORT Marker_Handle +Buffer_Add_Markers(Application_Links *app, Buffer_Summary *buffer, uint32_t marker_count){ + Command_Data *cmd = (Command_Data*)app->cmd_context; + Models *models = cmd->models; + Editing_File *file = imp_get_file(cmd, buffer); + + Marker_Handle result = 0; + if (file != 0){ + result = allocate_markers_state(&models->mem.general, file, marker_count); + } + + return(result); +} + +API_EXPORT bool32 +Buffer_Set_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){ + Command_Data *cmd = (Command_Data*)app->cmd_context; + Editing_File *file = imp_get_file(cmd, buffer); + + bool32 result = false; + if (file != 0){ + if (markers_set(file, marker, first_marker_index, marker_count, source_markers)){ + result = true; + } + } + + return(result); +} + +API_EXPORT bool32 +Buffer_Get_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){ + Command_Data *cmd = (Command_Data*)app->cmd_context; + Editing_File *file = imp_get_file(cmd, buffer); + + bool32 result = false; + if (file != 0){ + if (markers_get(file, marker, first_marker_index, marker_count, markers_out)){ + result = true; + } + } + + return(result); +} + +API_EXPORT bool32 +Buffer_Remove_Markers(Application_Links *app, Buffer_Summary *buffer, Marker_Handle marker){ + Command_Data *cmd = (Command_Data*)app->cmd_context; + Models *models = cmd->models; + Editing_File *file = imp_get_file(cmd, buffer); + + bool32 result = false; + if (file != 0){ + if (markers_free(&models->mem.general, file, marker)){ + result = true; + } + } + + return(result); +} + API_EXPORT bool32 Buffer_Get_Setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out) /* diff --git a/4ed_doubly_linked_list.cpp b/4ed_doubly_linked_list.cpp index 9ff3b768..a2cd7052 100644 --- a/4ed_doubly_linked_list.cpp +++ b/4ed_doubly_linked_list.cpp @@ -13,6 +13,7 @@ #define dll_init_sentinel(s) do{ (s)->next=(s); (s)->prev=(s); }while(0) #define dll_insert(p,v) do{ (v)->next=(p)->next; (v)->prev=(p); (p)->next=(v); (v)->next->prev=(v); }while(0) +#define dll_back_insert(p,v) do{ (v)->prev=(p)->prev; (v)->next=(p); (p)->prev=(v); (v)->prev->next=(v); }while(0) #define dll_remove(v) do{ (v)->next->prev = (v)->prev; (v)->prev->next = (v)->next; }while(0) // for(dll_items(iterator, sentinel_ptr)){...} diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index 299e2dd8..7990ddd9 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -3096,17 +3096,19 @@ struct Cursor_Fix_Descriptor{ }; internal void -file_edit_cursor_fix(System_Functions *system, Models *models, - Editing_File *file, Editing_Layout *layout, - Cursor_Fix_Descriptor desc){ +file_edit_cursor_fix(System_Functions *system, Models *models, Editing_File *file, Editing_Layout *layout, Cursor_Fix_Descriptor desc){ Partition *part = &models->mem.part; Temp_Memory cursor_temp = begin_temp_memory(part); - i32 cursor_max = layout->panel_max_count * 2; + i32 cursor_max = layout->panel_max_count * 3; + cursor_max += file->markers.marker_count; Cursor_With_Index *cursors = push_array(part, Cursor_With_Index, cursor_max); + Cursor_With_Index *r_cursors = push_array(part, Cursor_With_Index, cursor_max); + Assert(cursors != 0); i32 cursor_count = 0; + i32 r_cursor_count = 0; View *view = 0; Panel *panel = 0, *used_panels = &layout->used_sentinel; @@ -3120,20 +3122,37 @@ file_edit_cursor_fix(System_Functions *system, Models *models, } } + Marker_Array *marker_it = 0; + Marker_Array *marker_sent = &file->markers.sentinel; + for (dll_items(marker_it, marker_sent)){ + u32 count = marker_it->count; + Marker *markers = &marker_it->marker_0; + for (u32 i = 0; i < count; ++i){ + if (markers[i].lean_right){ + write_cursor_with_index(r_cursors, &r_cursor_count, markers[i].pos); + } + else{ + write_cursor_with_index(cursors, &cursor_count, markers[i].pos); + } + } + } + + // TODO(NAME): dump all the markers in the file and then read them back out. + // Make a plan for "right leaning" markers. if (cursor_count > 0){ buffer_sort_cursors(cursors, cursor_count); if (desc.is_batch){ - buffer_batch_edit_update_cursors(cursors, cursor_count, - desc.batch, desc.batch_size); + buffer_batch_edit_update_cursors(cursors, cursor_count, desc.batch, desc.batch_size, false); + buffer_batch_edit_update_cursors(r_cursors, r_cursor_count, desc.batch, desc.batch_size, true); } else{ - buffer_update_cursors(cursors, cursor_count, - desc.start, desc.end, - desc.shift_amount + (desc.end - desc.start)); + buffer_update_cursors(cursors, cursor_count, desc.start, desc.end, desc.shift_amount + (desc.end - desc.start), false); + buffer_update_cursors(r_cursors, r_cursor_count, desc.start, desc.end, desc.shift_amount + (desc.end - desc.start), true); } buffer_unsort_cursors(cursors, cursor_count); cursor_count = 0; + r_cursor_count = 0; for (dll_items(panel, used_panels)){ view = panel->view; if (view->file_data.file == file){ @@ -3167,6 +3186,19 @@ file_edit_cursor_fix(System_Functions *system, Models *models, scroll); } } + + for (dll_items(marker_it, marker_sent)){ + u32 count = marker_it->count; + Marker *markers = &marker_it->marker_0; + for (u32 i = 0; i < count; ++i){ + if (markers[i].lean_right){ + markers[i].pos = r_cursors[r_cursor_count++].pos; + } + else{ + markers[i].pos = cursors[cursor_count++].pos; + } + } + } } end_temp_memory(cursor_temp); @@ -3245,11 +3277,10 @@ file_do_single_edit(System_Functions *system, Models *models, Editing_File *file file_measure_wraps(models, file, (f32)font->height, font->codepoint_advance_data, font->byte_advance); // NOTE(allen): cursor fixing - Cursor_Fix_Descriptor desc = {}; + Cursor_Fix_Descriptor desc = {0}; desc.start = start; desc.end = end; desc.shift_amount = shift_amount; - file_edit_cursor_fix(system, models, file, layout, desc); } @@ -3368,8 +3399,7 @@ file_do_batch_edit(System_Functions *system, Models *models, Editing_File *file, } inline void -file_replace_range(System_Functions *system, Models *models, Editing_File *file, - i32 start, i32 end, char *str, i32 len){ +file_replace_range(System_Functions *system, Models *models, Editing_File *file, i32 start, i32 end, char *str, i32 len){ Edit_Spec spec = {}; spec.step.type = ED_NORMAL; spec.step.edit.start = start; @@ -3413,9 +3443,7 @@ main_style(Models *models){ } internal void -apply_history_edit(System_Functions *system, Models *models, - Editing_File *file, View *view, - Edit_Stack *stack, Edit_Step step, History_Mode history_mode){ +apply_history_edit(System_Functions *system, Models *models, Editing_File *file, View *view, Edit_Stack *stack, Edit_Step step, History_Mode history_mode){ Edit_Spec spec = {}; spec.step = step; @@ -3929,13 +3957,13 @@ internal void kill_file(System_Functions *system, Models *models, Editing_File *file){ Working_Set *working_set = &models->working_set; - if (file && !file->settings.never_kill){ + if (file != 0 && !file->settings.never_kill){ buffer_unbind_name(working_set, file); if (file->canon.name.size != 0){ buffer_unbind_file(system, working_set, file); } file_close(system, &models->mem.general, file); - working_set_free_file(working_set, file); + working_set_free_file(&models->mem.general, working_set, file); File_Node *used = &models->working_set.used_sentinel; File_Node *node = used->next; @@ -3958,9 +3986,7 @@ kill_file(System_Functions *system, Models *models, Editing_File *file){ internal void kill_file_by_name(System_Functions *system, Models *models, String name){ Editing_File *file = working_set_name_contains(&models->working_set, name); - if (file){ - kill_file(system, models, file); - } + kill_file(system, models, file); } internal void diff --git a/4ed_site.ctm b/4ed_site.ctm index 1b1c5a2aba38a4df8c48f8752e7957db948cd3f0..417f0e38601bdf2b8e27231040305109e7f89bf4 100644 GIT binary patch delta 24 gcmX@Yd4+Ss5f%ZdroHEk`z|puGcYjZb1^Ug0CblJY5)KL delta 7 Ocmcb@d4zMr5f%UqodY8P diff --git a/file/4coder_buffer.cpp b/file/4coder_buffer.cpp index 8c3ede72..f4705dc2 100644 --- a/file/4coder_buffer.cpp +++ b/file/4coder_buffer.cpp @@ -77,12 +77,26 @@ buffer_unsort_cursors(Cursor_With_Index *positions, i32 count){ } internal void -buffer_update_cursors(Cursor_With_Index *sorted_positions, i32 count, i32 start, i32 end, i32 len){ +buffer_update_cursors(Cursor_With_Index *sorted_positions, i32 count, i32 start, i32 end, i32 len, b32 lean_right){ i32 shift_amount = (len - (end - start)); Cursor_With_Index *position = sorted_positions + count - 1; - for (; position >= sorted_positions && position->pos > end; --position) position->pos += shift_amount; - for (; position >= sorted_positions && position->pos >= start; --position) position->pos = start; + if (lean_right){ + for (; position >= sorted_positions && position->pos > end; --position){ + position->pos += shift_amount; + } + for (; position >= sorted_positions && position->pos >= start; --position){ + position->pos = start + len; + } + } + else{ + for (; position >= sorted_positions && position->pos > end; --position){ + position->pos += shift_amount; + } + for (; position >= sorted_positions && position->pos >= start; --position){ + position->pos = start; + } + } } internal i32 @@ -109,34 +123,55 @@ buffer_batch_edit_max_shift(Buffer_Edit *sorted_edits, i32 edit_count){ Buffer_Edit *edit = sorted_edits; for (i = 0; i < edit_count; ++i, ++edit){ shift_total += (edit->len - (edit->end - edit->start)); - if (shift_total > shift_max) shift_max = shift_total; + if (shift_total > shift_max){ + shift_max = shift_total; + } } return(shift_max); } internal i32 -buffer_batch_edit_update_cursors(Cursor_With_Index *sorted_positions, i32 count, Buffer_Edit *sorted_edits, i32 edit_count){ +buffer_batch_edit_update_cursors(Cursor_With_Index *sorted_positions, i32 count, Buffer_Edit *sorted_edits, i32 edit_count, b32 lean_right){ Cursor_With_Index *position = sorted_positions; Cursor_With_Index *end_position = sorted_positions + count; Buffer_Edit *edit = sorted_edits; Buffer_Edit *end_edit = sorted_edits + edit_count; i32 shift_amount = 0; - i32 start = 0, end = 0; - for (; edit < end_edit && position < end_position; ++edit){ - start = edit->start; - end = edit->end; - - for (; position->pos < start && position < end_position; ++position){ - position->pos += shift_amount; + if (lean_right){ + for (; edit < end_edit && position < end_position; ++edit){ + i32 start = edit->start; + i32 end = edit->end; + + for (; position->pos < start && position < end_position; ++position){ + position->pos += shift_amount; + } + + i32 new_end = start + edit->len + shift_amount; + for (; position->pos <= end && position < end_position; ++position){ + position->pos = new_end; + } + + shift_amount += (edit->len - (end - start)); } - - for (; position->pos <= end && position < end_position; ++position){ - position->pos = start + shift_amount; + } + else{ + for (; edit < end_edit && position < end_position; ++edit){ + i32 start = edit->start; + i32 end = edit->end; + + for (; position->pos < start && position < end_position; ++position){ + position->pos += shift_amount; + } + + i32 new_end = start + shift_amount; + for (; position->pos <= end && position < end_position; ++position){ + position->pos = new_end; + } + + shift_amount += (edit->len - (end - start)); } - - shift_amount += (edit->len - (end - start)); } for (; position < end_position; ++position){ diff --git a/file/4coder_file.cpp b/file/4coder_file.cpp index 1a057770..e6558cbe 100644 --- a/file/4coder_file.cpp +++ b/file/4coder_file.cpp @@ -48,6 +48,7 @@ edit_pos_set_scroll(File_Edit_Positions *edit_pos, GUI_Scroll_Vars scroll){ } +// TODO(NAME): Replace this with markers over time. // // Highlighting Information // @@ -58,11 +59,35 @@ struct Text_Effect{ f32 seconds_down, seconds_max; }; - // // Editing_File // +union Buffer_Slot_ID{ + i32 id; + i16 part[2]; +}; +inline Buffer_Slot_ID +to_file_id(i32 id){ + Buffer_Slot_ID result; + result.id = id; + return(result); +} + +struct Marker_Array{ + Marker_Array *next, *prev; + Buffer_Slot_ID buffer_id; + u32 count, sim_max, max; + Marker marker_0; +}; +global_const u32 sizeof_marker_array = sizeof(Marker_Array) - sizeof(Marker); + +struct Editing_File_Markers{ + Marker_Array sentinel; + u32 array_count; + u32 marker_count; +}; + struct Editing_File_Settings{ i32 base_map_id; i32 display_width; @@ -78,7 +103,7 @@ struct Editing_File_Settings{ b8 read_only; b8 never_kill; }; -static Editing_File_Settings null_editing_file_settings = {0}; +global_const Editing_File_Settings null_editing_file_settings = {0}; struct Editing_File_State{ Gap_Buffer buffer; @@ -115,7 +140,7 @@ struct Editing_File_State{ File_Edit_Positions *edit_poss[16]; i32 edit_poss_count; }; -static Editing_File_State null_editing_file_state = {0}; +global_const Editing_File_State null_editing_file_state = {0}; struct Editing_File_Name{ char live_name_[256]; @@ -135,35 +160,122 @@ struct File_Node{ File_Node *next, *prev; }; -union Buffer_Slot_ID{ - i32 id; - i16 part[2]; -}; - -inline Buffer_Slot_ID -to_file_id(i32 id){ - Buffer_Slot_ID result; - result.id = id; - return(result); -} - struct Editing_File{ // NOTE(allen): node must be the first member of Editing_File! File_Node node; Editing_File_Settings settings; - struct{ - b32 is_loading; - b32 is_dummy; - Editing_File_State state; - }; + b32 is_loading; + b32 is_dummy; + Editing_File_State state; + Editing_File_Markers markers; Editing_File_Name name; Editing_File_Canon_Name canon; Buffer_Slot_ID id; - u64 unique_buffer_id; + //u64 unique_buffer_id; }; static Editing_File null_editing_file = {0}; +// +// Handling a file's Marker Arrays +// + +internal void +init_file_markers_state(Editing_File_Markers *markers){ + Marker_Array *sentinel = &markers->sentinel; + dll_init_sentinel(sentinel); + markers->array_count = 0; + markers->marker_count = 0; +} + +internal void +clear_file_markers_state(General_Memory *general, Editing_File_Markers *markers){ + Marker_Array *sentinel = &markers->sentinel; + for (Marker_Array *marker_array = sentinel->next; + marker_array != sentinel; + marker_array = sentinel->next){ + dll_remove(marker_array); + general_memory_free(general, marker_array); + } + Assert(sentinel->next == sentinel); + Assert(sentinel->prev == sentinel); + markers->array_count = 0; + markers->marker_count = 0; +} + +internal void* +allocate_markers_state(General_Memory *general, Editing_File *file, u32 new_array_max){ + u32 memory_size = sizeof_marker_array + sizeof(Marker)*new_array_max; + memory_size = l_round_up_u32(memory_size, KB(4)); + u32 real_max = (memory_size - sizeof_marker_array)/sizeof(Marker); + Marker_Array *array = (Marker_Array*)general_memory_allocate(general, memory_size); + + dll_back_insert(&file->markers.sentinel, array); + array->buffer_id = file->id; + array->count = 0; + array->sim_max = new_array_max; + array->max = real_max; + + ++file->markers.array_count; + + return(array); +} + +internal b32 +markers_set(Editing_File *file, void *handle, u32 first_index, u32 count, Marker *source){ + Assert(file != 0); + b32 result = false; + if (handle != 0){ + Marker_Array *markers = (Marker_Array*)handle; + if (markers->buffer_id.id == file->id.id){ + if (first_index + count <= markers->sim_max){ + u32 new_count = first_index + count; + if (new_count > markers->count){ + file->markers.marker_count += new_count - markers->count; + markers->count = new_count; + } + Marker *dst = &markers->marker_0; + memcpy(dst + first_index, source, sizeof(Marker)*count); + result = true; + } + } + } + return(result); +} + +internal b32 +markers_get(Editing_File *file, void *handle, u32 first_index, u32 count, Marker *output){ + Assert(file != 0); + b32 result = false; + if (handle != 0){ + Marker_Array *markers = (Marker_Array*)handle; + if (markers->buffer_id.id == file->id.id){ + if (first_index + count <= markers->count){ + Marker *src = &markers->marker_0; + memcpy(output, src + first_index, sizeof(Marker)*count); + result = true; + } + } + } + return(result); +} + +internal b32 +markers_free(General_Memory *general, Editing_File *file, void *handle){ + Assert(file != 0); + b32 result = false; + if (handle != 0){ + Marker_Array *markers = (Marker_Array*)handle; + if (markers->buffer_id.id == file->id.id){ + dll_remove(markers); + file->markers.marker_count -= markers->count; + --file->markers.array_count; + general_memory_free(general, markers); + } + } + return(result); +} + // // Manipulating a file's Edit_Pos array // @@ -390,3 +502,4 @@ file_get_sync(Editing_File *file){ // BOTTOM + diff --git a/file/4coder_working_set.cpp b/file/4coder_working_set.cpp index a11af95e..6c103056 100644 --- a/file/4coder_working_set.cpp +++ b/file/4coder_working_set.cpp @@ -38,7 +38,7 @@ struct Working_Set{ i32 clipboard_size, clipboard_max_size; i32 clipboard_current, clipboard_rolling; - u64 unique_file_counter; + //u64 unique_file_counter; File_Node *sync_check_iter; @@ -104,11 +104,12 @@ working_set_alloc(Working_Set *working_set){ Buffer_Slot_ID id = result->id; *result = null_editing_file; result->id = id; - result->unique_buffer_id = ++working_set->unique_file_counter; + //result->unique_buffer_id = ++working_set->unique_file_counter; dll_insert(&working_set->used_sentinel, node); result->settings.display_width = working_set->default_display_width; result->settings.minimum_base_display_width = working_set->default_minimum_base_display_width; result->settings.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge; + init_file_markers_state(&result->markers); ++working_set->file_count; } @@ -118,29 +119,23 @@ working_set_alloc(Working_Set *working_set){ internal Editing_File* working_set_alloc_always(Working_Set *working_set, General_Memory *general){ Editing_File *result = 0; - Editing_File *new_chunk; - i32 full_new_count = working_set->file_max; - i16 new_count; - - if (full_new_count > max_i16) new_count = max_i16; - else new_count = (i16)full_new_count; - - if (working_set->file_count == working_set->file_max &&working_set->array_count < working_set->array_max){ - new_chunk = gen_array(general, Editing_File, new_count); + if (working_set->file_count == working_set->file_max && working_set->array_count < working_set->array_max){ + i16 new_count = (i16)clamp_top(working_set->file_max, max_i16); + Editing_File *new_chunk = gen_array(general, Editing_File, new_count); working_set_extend_memory(working_set, new_chunk, new_count); } result = working_set_alloc(working_set); - return(result); } inline void -working_set_free_file(Working_Set *working_set, Editing_File *file){ +working_set_free_file(General_Memory *general, Working_Set *working_set, Editing_File *file){ if (working_set->sync_check_iter == &file->node){ working_set->sync_check_iter = working_set->sync_check_iter->next; } file->is_dummy = 1; + clear_file_markers_state(general, &file->markers); dll_remove(&file->node); dll_insert(&working_set->free_sentinel, &file->node); --working_set->file_count; @@ -198,6 +193,8 @@ working_set_init(Working_Set *working_set, Partition *partition, General_Memory Editing_File *files = push_array(partition, Editing_File, init_count); working_set_extend_memory(working_set, files, init_count); + // TODO(NAME): Unclear that this is still needed. But double check that the buffer id 0 does not start getting used by the next real buffer when this is removed before actually removing it. Buffer id cannot be allowed to be zero on real buffers. +#if 1 // NOTE(allen): init null file { Editing_File *null_file = working_set_index(working_set, 0); @@ -205,6 +202,7 @@ working_set_init(Working_Set *working_set, Partition *partition, General_Memory null_file->is_dummy = 1; ++working_set->file_count; } +#endif // NOTE(allen): init canon table { diff --git a/meta/4tech_file_moving.h b/meta/4tech_file_moving.h index c83c7d3a..333dcdc9 100644 --- a/meta/4tech_file_moving.h +++ b/meta/4tech_file_moving.h @@ -64,16 +64,17 @@ static char platform_correct_slash = '/'; #endif -static char cmd[4096]; +static char SF_CMD[4096]; static i32 error_state = 0; static i32 prev_error = 0; -#define systemf(...) do{ \ - int32_t n = snprintf(cmd, sizeof(cmd), __VA_ARGS__); \ - AllowLocal(n); \ - Assert(n < sizeof(cmd)); \ - prev_error = system(cmd); \ - if (prev_error != 0) error_state = 1; \ +#define systemf(...) do{ \ + int32_t n = snprintf(SF_CMD, sizeof(SF_CMD), __VA_ARGS__); \ + AllowLocal(n); \ + Assert(n < sizeof(SF_CMD)); \ + /** printf("%s\n", SF_CMD); /**/ \ + prev_error = system(SF_CMD); \ + if (prev_error != 0) error_state = 1; \ }while(0) static void init_time_system(); diff --git a/meta/build.cpp b/meta/build.cpp index a5161363..383f1c4c 100644 --- a/meta/build.cpp +++ b/meta/build.cpp @@ -190,14 +190,12 @@ build_cl(u32 flags, char *code_path, char *code_file, char *out_path, char *out_ build_ap(line, "/DFRED_KEEP_ASSERT"); } - swap_ptr(&line.build_options, &line.build_options_prev); - if (flags & X86){ build_ap(link_line, CL_X86); } if (flags & DEBUG_INFO){ - build_ap(link_line, "/DEBUG "); + build_ap(link_line, "/DEBUG"); } char link_type_string[1024]; @@ -210,6 +208,8 @@ build_cl(u32 flags, char *code_path, char *code_file, char *out_path, char *out_ } build_ap(link_line, "%s", link_type_string); + swap_ptr(&line.build_options, &line.build_options_prev); + swap_ptr(&link_line.build_options, &link_line.build_options_prev); Temp_Dir temp = pushdir(out_path); systemf("cl %s %s\\%s /Fe%s /link /INCREMENTAL:NO %s", line.build_options, code_path, code_file, out_file, link_line.build_options); popdir(temp); diff --git a/string/4coder_string_build_num.txt b/string/4coder_string_build_num.txt index fb61d50d..c6b47a06 100644 --- a/string/4coder_string_build_num.txt +++ b/string/4coder_string_build_num.txt @@ -1,5 +1,5 @@ 1 0 -61 +62 diff --git a/string/_4coder_string.ctm b/string/_4coder_string.ctm index 8a06400b423fad6fc3dd9f1cd405a59a4257c17c..00a9bc88ae56b8c26857080431de755093742252 100644 GIT binary patch delta 24 gcmew&+#<5!3#Wiv<=L~weU})S85kJ8Gchm#0DS@oMgRZ+ delta 7 OcmZn>`69gG3nu^#ECWpd diff --git a/win32_4ed.cpp b/win32_4ed.cpp index b0635a68..87ecb5df 100644 --- a/win32_4ed.cpp +++ b/win32_4ed.cpp @@ -1462,7 +1462,7 @@ Font_Load_Sig(system_draw_font_load){ #if SUPPORT_DPI pt_size = round32(pt_size * size_change(win32vars.dpi_x, win32vars.dpi_y)); #endif - + for (b32 success = 0; success == 0;){ #if USE_WIN32_FONTS