From 016d07cce40ec046414cbded6cf5b1a014273a26 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 23 Jun 2016 22:53:33 -0400 Subject: [PATCH] eliminated some undo bug-prone nonsense --- 4coder_custom.h | 6 +-- 4coder_custom_api.h | 8 ++-- 4coder_default_include.cpp | 59 ++++++++++++++++------------- 4ed_api_implementation.cpp | 76 ++++++++++++++++++++------------------ 4ed_file.cpp | 2 - 4ed_file_view.cpp | 25 +++---------- custom_api_spec.cpp | 2 +- 7 files changed, 87 insertions(+), 91 deletions(-) diff --git a/4coder_custom.h b/4coder_custom.h index 12045c7e..4ef717c1 100644 --- a/4coder_custom.h +++ b/4coder_custom.h @@ -305,9 +305,9 @@ enum Command_Line_Input_Flag{ CLI_CursorAtEnd = 0x4, }; -enum Auto_Tab_Flag{ - AutoTab_ClearLine = 0x1, - AutoTab_UseTab = 0x2 +enum Auto_Indent_Flag{ + AutoIndent_ClearLine = 0x1, + AutoIndent_UseTab = 0x2 }; enum Input_Type_Flag{ diff --git a/4coder_custom_api.h b/4coder_custom_api.h index 2aef1a3b..78d96b29 100644 --- a/4coder_custom_api.h +++ b/4coder_custom_api.h @@ -17,6 +17,7 @@ #define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out) #define BUFFER_REPLACE_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len) #define BUFFER_SET_SETTING_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int setting, int value) +#define BUFFER_AUTO_INDENT_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags) #define CREATE_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, char *filename, int filename_len, unsigned int flags) #define SAVE_BUFFER_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags) #define KILL_BUFFER_SIG(n) int n(Application_Links *app, Buffer_Identifier buffer, int view_id, unsigned int flags) @@ -24,7 +25,6 @@ #define GET_VIEW_NEXT_SIG(n) void n(Application_Links *app, View_Summary *view, unsigned int access) #define GET_VIEW_SIG(n) View_Summary n(Application_Links *app, int view_id, unsigned int access) #define GET_ACTIVE_VIEW_SIG(n) View_Summary n(Application_Links *app, unsigned int access) -#define VIEW_AUTO_TAB_SIG(n) int n(Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags) #define VIEW_COMPUTE_CURSOR_SIG(n) Full_Cursor n(Application_Links *app, View_Summary *view, Buffer_Seek seek) #define VIEW_SET_CURSOR_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x) #define VIEW_SET_MARK_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Seek seek) @@ -64,6 +64,7 @@ extern "C"{ typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function); typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function); typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function); + typedef BUFFER_AUTO_INDENT_SIG(Buffer_Auto_Indent_Function); typedef CREATE_BUFFER_SIG(Create_Buffer_Function); typedef SAVE_BUFFER_SIG(Save_Buffer_Function); typedef KILL_BUFFER_SIG(Kill_Buffer_Function); @@ -71,7 +72,6 @@ extern "C"{ typedef GET_VIEW_NEXT_SIG(Get_View_Next_Function); typedef GET_VIEW_SIG(Get_View_Function); typedef GET_ACTIVE_VIEW_SIG(Get_Active_View_Function); - typedef VIEW_AUTO_TAB_SIG(View_Auto_Tab_Function); typedef VIEW_COMPUTE_CURSOR_SIG(View_Compute_Cursor_Function); typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function); typedef VIEW_SET_MARK_SIG(View_Set_Mark_Function); @@ -114,6 +114,7 @@ struct Application_Links{ Buffer_Read_Range_Function *buffer_read_range; Buffer_Replace_Range_Function *buffer_replace_range; Buffer_Set_Setting_Function *buffer_set_setting; + Buffer_Auto_Indent_Function *buffer_auto_indent; Create_Buffer_Function *create_buffer; Save_Buffer_Function *save_buffer; Kill_Buffer_Function *kill_buffer; @@ -121,7 +122,6 @@ struct Application_Links{ Get_View_Next_Function *get_view_next; Get_View_Function *get_view; Get_Active_View_Function *get_active_view; - View_Auto_Tab_Function *view_auto_tab; View_Compute_Cursor_Function *view_compute_cursor; View_Set_Cursor_Function *view_set_cursor; View_Set_Mark_Function *view_set_mark; @@ -166,6 +166,7 @@ app_links->buffer_seek = external_buffer_seek;\ app_links->buffer_read_range = external_buffer_read_range;\ app_links->buffer_replace_range = external_buffer_replace_range;\ app_links->buffer_set_setting = external_buffer_set_setting;\ +app_links->buffer_auto_indent = external_buffer_auto_indent;\ app_links->create_buffer = external_create_buffer;\ app_links->save_buffer = external_save_buffer;\ app_links->kill_buffer = external_kill_buffer;\ @@ -173,7 +174,6 @@ app_links->get_view_first = external_get_view_first;\ app_links->get_view_next = external_get_view_next;\ app_links->get_view = external_get_view;\ app_links->get_active_view = external_get_active_view;\ -app_links->view_auto_tab = external_view_auto_tab;\ app_links->view_compute_cursor = external_view_compute_cursor;\ app_links->view_set_cursor = external_view_set_cursor;\ app_links->view_set_mark = external_view_set_mark;\ diff --git a/4coder_default_include.cpp b/4coder_default_include.cpp index 3c7292c7..f583c82b 100644 --- a/4coder_default_include.cpp +++ b/4coder_default_include.cpp @@ -650,16 +650,16 @@ long_braces(Application_Links *app, char *text, int size){ unsigned int access = AccessOpen; View_Summary view = app->get_active_view(app, access); Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access); - int pos; + int pos = view.cursor.pos; - pos = view.cursor.pos; app->buffer_replace_range(app, &buffer, pos, pos, text, size); app->view_set_cursor(app, &view, seek_pos(pos + 2), true); - app->view_auto_tab(app, &view, - pos, pos + size, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + pos, pos + size, + DEF_TAB_WIDTH, + 0); + // TODO(allen): set cursor position } CUSTOM_COMMAND_SIG(open_long_braces){ @@ -705,10 +705,11 @@ CUSTOM_COMMAND_SIG(if0_off){ app->buffer_replace_range(app, &buffer, pos, pos, text1, size1); - app->view_auto_tab(app, &view, - pos, pos, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + pos, pos, + DEF_TAB_WIDTH, + 0); + // TODO(allen): place cursor refresh_view(app, &view); range = get_range(&view); @@ -716,10 +717,11 @@ CUSTOM_COMMAND_SIG(if0_off){ app->buffer_replace_range(app, &buffer, pos, pos, text2, size2); - app->view_auto_tab(app, &view, - pos, pos, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + pos, pos, + DEF_TAB_WIDTH, + 0); + // TODO(allen): place cursor } CUSTOM_COMMAND_SIG(backspace_word){ @@ -1298,11 +1300,13 @@ CUSTOM_COMMAND_SIG(build_search){ CUSTOM_COMMAND_SIG(auto_tab_line_at_cursor){ unsigned int access = AccessOpen; View_Summary view = app->get_active_view(app, access); + Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access); - app->view_auto_tab(app, &view, - view.cursor.pos, view.cursor.pos, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + view.cursor.pos, view.cursor.pos, + DEF_TAB_WIDTH, + 0); + // TODO(allen): place cursor } CUSTOM_COMMAND_SIG(auto_tab_whole_file){ @@ -1310,21 +1314,24 @@ CUSTOM_COMMAND_SIG(auto_tab_whole_file){ View_Summary view = app->get_active_view(app, access); Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access); - app->view_auto_tab(app, &view, - 0, buffer.size, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + 0, buffer.size, + DEF_TAB_WIDTH, + 0); + // TODO(allen): place cursor } CUSTOM_COMMAND_SIG(auto_tab_range){ unsigned int access = AccessOpen; View_Summary view = app->get_active_view(app, access); + Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access); Range range = get_range(&view); - app->view_auto_tab(app, &view, - range.min, range.max, - DEF_TAB_WIDTH, - 0); + app->buffer_auto_indent(app, &buffer, + range.min, range.max, + DEF_TAB_WIDTH, + 0); + // TODO(allen): place cursor } CUSTOM_COMMAND_SIG(write_and_auto_tab){ diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index a0ac811e..9f8aedde 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -792,6 +792,46 @@ DOC_SEE(Buffer_Setting_ID) return(result); } +BUFFER_AUTO_INDENT_SIG(external_buffer_auto_indent)/* +DOC_PARAM(buffer, the buffer in which to apply the auto indenting) +DOC_PARAM(start, the position to start the auto indenting) +DOC_PARAM(end, the position to end the auto indenting) +DOC_PARAM(tab_width, the number of spaces to place as a tab) +DOC_PARAM(flags, the auto tab behavior flags) +DOC_RETURN(returns non-zero when the call succeeds) +DOC +( +Applies the built in auto-indentation rule to the code in the range from +start to end by inserting spaces or tabs at the beginning of the lines. +If the buffer does not have lexing enabled or the lexing job has not +completed this function will fail. +) +DOC_SEE(Auto_Tab_Flag) +*/{ + Command_Data *cmd = (Command_Data*)app->cmd_context; + System_Functions *system = cmd->system; + Models *models = cmd->models; + + Indent_Options opts = {0}; + int result = false; + + Editing_File *file = imp_get_file(cmd, buffer); + if (file && file->state.token_stack.tokens && + file->state.tokens_complete && !file->state.still_lexing){ + result = true; + + opts.empty_blank_lines = (flags & AutoIndent_ClearLine); + opts.use_tabs = (flags & AutoIndent_UseTab); + opts.tab_width = tab_width; + + file_auto_tab_tokens(system, models, file, start, start, end, opts); + + fill_buffer_summary(buffer, file, cmd); + } + + return(result); +} + CREATE_BUFFER_SIG(external_create_buffer)/* DOC_PARAM(filename, the name of the file to be opened or created) DOC_PARAM(filename_len, the length of the filename string) @@ -1063,42 +1103,6 @@ DOC_RETURN(returns a summary that describes the active view) return(view); } -VIEW_AUTO_TAB_SIG(external_view_auto_tab)/* -DOC_PARAM(start, ) -DOC_PARAM(end, ) -DOC_PARAM(tab_width, ) -DOC_PARAM(flags, ) -*/{ - Command_Data *cmd = (Command_Data*)app->cmd_context; - System_Functions *system = cmd->system; - Models *models = cmd->models; - - int result = false; - - Editing_File *file = 0; - View *vptr = imp_get_view(cmd, view); - - if (vptr){ - file = vptr->file_data.file; - - if (file && file->state.token_stack.tokens && - file->state.tokens_complete && !file->state.still_lexing){ - result = true; - - Indent_Options opts; - opts.empty_blank_lines = (flags & AutoTab_ClearLine); - opts.use_tabs = (flags & AutoTab_UseTab); - opts.tab_width = tab_width; - - view_auto_tab_tokens(system, models, vptr, start, end, opts); - - fill_view_summary(view, vptr, cmd); - } - } - - return(result); -} - VIEW_COMPUTE_CURSOR_SIG(external_view_compute_cursor){ Command_Data *cmd = (Command_Data*)app->cmd_context; View *vptr = imp_get_view(cmd, view); diff --git a/4ed_file.cpp b/4ed_file.cpp index 993a545b..603931b6 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -40,8 +40,6 @@ struct Edit_Step{ struct{ b32 can_merge; Buffer_Edit edit; - i32 pre_pos; - i32 post_pos; i32 next_block, prev_block; }; struct{ diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index d838d03e..92fe501d 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -1210,8 +1210,6 @@ file_post_undo(General_Memory *general, Editing_File *file, Edit_Step inv_step = {}; inv_step.edit = inv; - inv_step.pre_pos = step.pre_pos; - inv_step.post_pos = step.post_pos; inv_step.can_merge = (b8)can_merge; inv_step.type = ED_UNDO; @@ -1222,7 +1220,6 @@ file_post_undo(General_Memory *general, Editing_File *file, if (prev.edit.end == inv_step.edit.start){ did_merge = 1; inv_step.edit.start = prev.edit.start; - inv_step.pre_pos = prev.pre_pos; } } } @@ -1280,8 +1277,6 @@ file_post_redo(General_Memory *general, Editing_File *file, Edit_Step step){ Edit_Step inv_step = {}; inv_step.edit = inv; - inv_step.pre_pos = step.pre_pos; - inv_step.post_pos = step.post_pos; inv_step.type = ED_REDO; if (redo->edit_count == redo->edit_max) @@ -1350,19 +1345,16 @@ file_post_history(General_Memory *general, Editing_File *file, Edit_Step inv_step = {}; inv_step.edit = inv; - inv_step.pre_pos = step.pre_pos; - inv_step.post_pos = step.post_pos; inv_step.can_merge = (b8)can_merge; inv_step.type = reverse_types[step.type]; - bool32 did_merge = 0; + b32 did_merge = 0; if (do_merge && history->edit_count > 0){ Edit_Step prev = history->edits[history->edit_count-1]; if (prev.can_merge && inv_step.edit.len == 0 && prev.edit.len == 0){ if (prev.edit.end == inv_step.edit.start){ did_merge = 1; inv_step.edit.start = prev.edit.start; - inv_step.pre_pos = prev.pre_pos; } } } @@ -2218,8 +2210,6 @@ file_replace_range(System_Functions *system, Models *models, Editing_File *file, spec.step.edit.end = end; spec.step.edit.len = len; - spec.step.pre_pos = file->state.cursor_pos; - spec.step.post_pos = next_cursor; spec.str = (u8*)str; file_do_single_edit(system, models, file, spec, hist_normal, use_high_permission); } @@ -2276,8 +2266,7 @@ view_undo_redo(System_Functions *system, file_do_single_edit(system, models, file, spec, hist_normal); - if (expected_type == ED_UNDO) view_cursor_move(view, step.pre_pos); - else view_cursor_move(view, step.post_pos); + view_cursor_move(view, step.edit.start + step.edit.len); view->recent->mark = view->recent->cursor.pos; Style *style = main_style(models); @@ -2390,7 +2379,7 @@ view_history_step(System_Functions *system, Models *models, View *view, History_ } if (do_history_step){ - Edit_Spec spec; + Edit_Spec spec = {0}; spec.step = step; if (spec.step.child_count == 0){ @@ -2402,12 +2391,12 @@ view_history_step(System_Functions *system, Models *models, View *view, History_ switch (spec.step.type){ case ED_NORMAL: case ED_REDO: - view_cursor_move(view, step.post_pos); + view_cursor_move(view, step.edit.start + step.edit.len); break; case ED_REVERSE_NORMAL: case ED_UNDO: - view_cursor_move(view, step.pre_pos); + view_cursor_move(view, step.edit.start + step.edit.len); break; } view->recent->mark = view->recent->cursor.pos; @@ -2524,10 +2513,8 @@ file_compute_whitespace_edit(Mem_Options *mem, Editing_File *file, i32 cursor_po spec.step.special_type = 1; spec.step.child_count = edit_count; spec.step.inverse_child_count = edit_count; - spec.step.pre_pos = cursor_pos; - spec.step.post_pos = cursor_pos; - return spec; + return(spec); } internal void diff --git a/custom_api_spec.cpp b/custom_api_spec.cpp index 039e582c..18371b80 100644 --- a/custom_api_spec.cpp +++ b/custom_api_spec.cpp @@ -30,6 +30,7 @@ int Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start, int Buffer_Replace_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len); int Buffer_Set_Setting(Application_Links *app, Buffer_Summary *buffer, int setting, int value); +int Buffer_Auto_Indent(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags); Buffer_Summary Create_Buffer(Application_Links *app, char *filename, int filename_len, unsigned int flags); int Save_Buffer(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags); @@ -42,7 +43,6 @@ void Get_View_Next(Application_Links *app, View_Summary *view, unsigned int acce View_Summary Get_View(Application_Links *app, int view_id, unsigned int access); View_Summary Get_Active_View(Application_Links *app, unsigned int access); -int View_Auto_Tab (Application_Links *app, View_Summary *view, int start, int end, int tab_width, unsigned int flags); Full_Cursor View_Compute_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek); int View_Set_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x); int View_Set_Mark (Application_Links *app, View_Summary *view, Buffer_Seek seek);