From 7a94942242b723bb7cbac64671708a1e80277880 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Wed, 28 Jun 2017 11:15:54 -0400 Subject: [PATCH] fixed small issues discovered after 4.0.21 release --- 4coder_API/app_functions.h | 7 + 4coder_API/version.h | 2 +- 4coder_auto_indent.cpp | 28 +- 4coder_default_framework.h | 12 +- 4coder_helper/4coder_helper.h | 30 +- 4ed_api_implementation.cpp | 59 +- LICENSE.txt | 6 +- power/4coder_experiments.cpp | 2424 ++++++++++++++-------------- power/custom_4coder.so | Bin 272828 -> 0 bytes readlink_f_simulator.sh | 2 - site/source_material/tutorials.txt | 4 + 11 files changed, 1302 insertions(+), 1272 deletions(-) delete mode 100755 power/custom_4coder.so delete mode 100755 readlink_f_simulator.sh diff --git a/4coder_API/app_functions.h b/4coder_API/app_functions.h index efbe8b72..7ab8f1c2 100644 --- a/4coder_API/app_functions.h +++ b/4coder_API/app_functions.h @@ -11,6 +11,7 @@ struct Application_Links; #define GET_BUFFER_NEXT_SIG(n) void n(Application_Links *app, Buffer_Summary *buffer, Access_Flag access) #define GET_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, Buffer_ID buffer_id, Access_Flag access) #define GET_BUFFER_BY_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *name, int32_t len, Access_Flag access) +#define GET_BUFFER_BY_FILE_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *name, int32_t len, Access_Flag access) #define BUFFER_READ_RANGE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *out) #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) @@ -88,6 +89,7 @@ typedef GET_BUFFER_FIRST_SIG(Get_Buffer_First_Function); typedef GET_BUFFER_NEXT_SIG(Get_Buffer_Next_Function); typedef GET_BUFFER_SIG(Get_Buffer_Function); typedef GET_BUFFER_BY_NAME_SIG(Get_Buffer_By_Name_Function); +typedef GET_BUFFER_BY_FILE_NAME_SIG(Get_Buffer_By_File_Name_Function); 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); @@ -167,6 +169,7 @@ Get_Buffer_First_Function *get_buffer_first; Get_Buffer_Next_Function *get_buffer_next; Get_Buffer_Function *get_buffer; Get_Buffer_By_Name_Function *get_buffer_by_name; +Get_Buffer_By_File_Name_Function *get_buffer_by_file_name; Buffer_Read_Range_Function *buffer_read_range; Buffer_Replace_Range_Function *buffer_replace_range; Buffer_Compute_Cursor_Function *buffer_compute_cursor; @@ -245,6 +248,7 @@ Get_Buffer_First_Function *get_buffer_first_; Get_Buffer_Next_Function *get_buffer_next_; Get_Buffer_Function *get_buffer_; Get_Buffer_By_Name_Function *get_buffer_by_name_; +Get_Buffer_By_File_Name_Function *get_buffer_by_file_name_; Buffer_Read_Range_Function *buffer_read_range_; Buffer_Replace_Range_Function *buffer_replace_range_; Buffer_Compute_Cursor_Function *buffer_compute_cursor_; @@ -331,6 +335,7 @@ app_links->get_buffer_first_ = Get_Buffer_First;\ app_links->get_buffer_next_ = Get_Buffer_Next;\ app_links->get_buffer_ = Get_Buffer;\ app_links->get_buffer_by_name_ = Get_Buffer_By_Name;\ +app_links->get_buffer_by_file_name_ = Get_Buffer_By_File_Name;\ app_links->buffer_read_range_ = Buffer_Read_Range;\ app_links->buffer_replace_range_ = Buffer_Replace_Range;\ app_links->buffer_compute_cursor_ = Buffer_Compute_Cursor;\ @@ -409,6 +414,7 @@ static inline Buffer_Summary get_buffer_first(Application_Links *app, Access_Fla static inline void get_buffer_next(Application_Links *app, Buffer_Summary *buffer, Access_Flag access){(app->get_buffer_next(app, buffer, access));} static inline Buffer_Summary get_buffer(Application_Links *app, Buffer_ID buffer_id, Access_Flag access){return(app->get_buffer(app, buffer_id, access));} static inline Buffer_Summary get_buffer_by_name(Application_Links *app, char *name, int32_t len, Access_Flag access){return(app->get_buffer_by_name(app, name, len, access));} +static inline Buffer_Summary get_buffer_by_file_name(Application_Links *app, char *name, int32_t len, Access_Flag access){return(app->get_buffer_by_file_name(app, name, len, access));} static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *out){return(app->buffer_read_range(app, buffer, start, end, out));} 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));} @@ -487,6 +493,7 @@ static inline Buffer_Summary get_buffer_first(Application_Links *app, Access_Fla static inline void get_buffer_next(Application_Links *app, Buffer_Summary *buffer, Access_Flag access){(app->get_buffer_next_(app, buffer, access));} static inline Buffer_Summary get_buffer(Application_Links *app, Buffer_ID buffer_id, Access_Flag access){return(app->get_buffer_(app, buffer_id, access));} static inline Buffer_Summary get_buffer_by_name(Application_Links *app, char *name, int32_t len, Access_Flag access){return(app->get_buffer_by_name_(app, name, len, access));} +static inline Buffer_Summary get_buffer_by_file_name(Application_Links *app, char *name, int32_t len, Access_Flag access){return(app->get_buffer_by_file_name_(app, name, len, access));} static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *out){return(app->buffer_read_range_(app, buffer, start, end, out));} 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));} diff --git a/4coder_API/version.h b/4coder_API/version.h index a4acc604..9efad7b4 100644 --- a/4coder_API/version.h +++ b/4coder_API/version.h @@ -1,6 +1,6 @@ #define MAJOR 4 #define MINOR 0 -#define PATCH 21 +#define PATCH 22 // string #define VN__(a,b,c) #a"."#b"."#c diff --git a/4coder_auto_indent.cpp b/4coder_auto_indent.cpp index 478ce19e..a47d30be 100644 --- a/4coder_auto_indent.cpp +++ b/4coder_auto_indent.cpp @@ -104,8 +104,7 @@ make_batch_from_indent_marks(Application_Links *app, Partition *part, Buffer_Sum for (int32_t line_i = line_start; line_i < line_end; ++line_i){ int32_t line_start_pos = buffer_get_line_start(app, buffer, line_i); - Hard_Start_Result hard_start = - buffer_find_hard_start(app, buffer, line_start_pos, opts.tab_width); + Hard_Start_Result hard_start = buffer_find_hard_start(app, buffer, line_start_pos, opts.tab_width); int32_t correct_indentation = indent_marks[line_i]; if (hard_start.all_whitespace && opts.empty_blank_lines){ @@ -158,8 +157,7 @@ make_batch_from_indent_marks(Application_Links *app, Partition *part, Buffer_Sum static void set_line_indents(Application_Links *app, Partition *part, Buffer_Summary *buffer, int32_t line_start, int32_t line_end, int32_t *indent_marks, Indent_Options opts){ - Buffer_Batch_Edit batch = - make_batch_from_indent_marks(app, part, buffer, line_start, line_end, indent_marks, opts); + Buffer_Batch_Edit batch = make_batch_from_indent_marks(app, part, buffer, line_start, line_end, indent_marks, opts); if (batch.edit_count > 0){ buffer_batch_edit(app, buffer, batch.str, batch.str_len, batch.edits, batch.edit_count, BatchEdit_PreserveTokens); @@ -252,27 +250,29 @@ find_anchor_token(Application_Links *app, Buffer_Summary *buffer, Cpp_Token_Arra } out_of_loop2:; + Cpp_Token_Type open_type = CPP_TOKEN_JUNK; + Cpp_Token_Type close_type = CPP_TOKEN_JUNK; switch (close){ - case 0: token = start_token; found_safe_start_position = 1; break; + case 0: token = start_token; found_safe_start_position = true; break; case CPP_TOKEN_PARENTHESE_CLOSE: - token = seek_matching_token_backwards(tokens, token-1, - CPP_TOKEN_PARENTHESE_OPEN, - CPP_TOKEN_PARENTHESE_CLOSE); + open_type = CPP_TOKEN_PARENTHESE_OPEN; + close_type = CPP_TOKEN_PARENTHESE_CLOSE; break; case CPP_TOKEN_BRACKET_CLOSE: - token = seek_matching_token_backwards(tokens, token-1, - CPP_TOKEN_BRACKET_OPEN, - CPP_TOKEN_BRACKET_CLOSE); + open_type = CPP_TOKEN_BRACKET_OPEN; + close_type = CPP_TOKEN_BRACKET_CLOSE; break; case CPP_TOKEN_BRACE_CLOSE: - token = seek_matching_token_backwards(tokens, token-1, - CPP_TOKEN_BRACE_OPEN, - CPP_TOKEN_BRACE_CLOSE); + open_type = CPP_TOKEN_BRACE_OPEN; + close_type = CPP_TOKEN_BRACE_CLOSE; break; } + if (open_type != CPP_TOKEN_JUNK){ + token = seek_matching_token_backwards(tokens, token-1, open_type, close_type); + } } } while(found_safe_start_position == 0); *current_indent_out = current_indent; diff --git a/4coder_default_framework.h b/4coder_default_framework.h index cd4f433b..a29303de 100644 --- a/4coder_default_framework.h +++ b/4coder_default_framework.h @@ -1047,14 +1047,14 @@ default_4coder_side_by_side_panels(Application_Links *app, char **command_line_f Buffer_Identifier right = buffer_identifier(literal("*messages*")); if (file_count > 0){ - char *name = command_line_files[0]; - int32_t len = str_size(name); - left = buffer_identifier(name, len); + char *left_name = command_line_files[0]; + int32_t left_len = str_size(name); + left = buffer_identifier(left_name, left_len); if (file_count > 1){ - char *name = command_line_files[1]; - int32_t len = str_size(name); - right = buffer_identifier(name, len); + char *right_name = command_line_files[1]; + int32_t right_len = str_size(name); + right = buffer_identifier(right_name, right_len); } } diff --git a/4coder_helper/4coder_helper.h b/4coder_helper/4coder_helper.h index 00dfde2b..9f8cf812 100644 --- a/4coder_helper/4coder_helper.h +++ b/4coder_helper/4coder_helper.h @@ -178,19 +178,6 @@ buffer_identifier(Buffer_ID id){ return(identifier); } -static Buffer_ID -buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){ - Buffer_ID id = 0; - if (identifier.id != 0){ - id = identifier.id; - } - else{ - Buffer_Summary buffer = get_buffer_by_name(app, identifier.name, identifier.name_len, AccessAll); - id = buffer.buffer_id; - } - return(id); -} - static Buffer_Summary create_buffer(Application_Links *app, char *filename, int32_t filename_len, Buffer_Create_Flag flags){ Buffer_Summary buffer = {0}; @@ -346,6 +333,23 @@ open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, in return(result); } +static Buffer_ID +buffer_identifier_to_id(Application_Links *app, Buffer_Identifier identifier){ + Buffer_ID id = 0; + if (identifier.id != 0){ + id = identifier.id; + } + else{ + Buffer_Summary buffer = get_buffer_by_name(app, identifier.name, identifier.name_len, AccessAll); + id = buffer.buffer_id; + if (id == 0){ + buffer = get_buffer_by_file_name(app, identifier.name, identifier.name_len, AccessAll); + id = buffer.buffer_id; + } + } + return(id); +} + static bool32 view_open_file(Application_Links *app, View_Summary *view, char *filename, int32_t filename_len, bool32 never_new){ bool32 result = false; diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 92ffaa82..08012fe2 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -513,14 +513,14 @@ DOC_SEE(get_buffer_next) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working_set = &cmd->models->working_set; - Buffer_Summary result = {}; + Buffer_Summary buffer = {0}; - internal_get_buffer_first(working_set, &result); - while (result.exists && !access_test(result.lock_flags, access)){ - internal_get_buffer_next(working_set, &result); + internal_get_buffer_first(working_set, &buffer); + while (buffer.exists && !access_test(buffer.lock_flags, access)){ + internal_get_buffer_next(working_set, &buffer); } - return(result); + return(buffer); } API_EXPORT void @@ -560,10 +560,10 @@ DOC_SEE(Buffer_ID) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; Working_Set *working_set = &cmd->models->working_set; - Buffer_Summary buffer = {}; + Buffer_Summary buffer = {0}; Editing_File *file = working_set_get_active_file(working_set, buffer_id); - if (file != 0){ + if (file != 0 && !file->is_dummy){ fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ buffer = null_buffer_summary; @@ -584,11 +584,32 @@ DOC_SEE(Buffer_Summary) DOC_SEE(Access_Flag) */{ Command_Data *cmd = (Command_Data*)app->cmd_context; - Buffer_Summary buffer = {}; + Buffer_Summary buffer = {0}; Working_Set *working_set = &cmd->models->working_set; Editing_File *file = working_set_name_contains(working_set, make_string(name, len)); - if (file && !file->is_dummy){ + if (file != 0 && !file->is_dummy){ + fill_buffer_summary(&buffer, file, working_set); + if (!access_test(buffer.lock_flags, access)){ + buffer = null_buffer_summary; + } + } + + return(buffer); +} + +API_EXPORT Buffer_Summary +Get_Buffer_By_File_Name(Application_Links *app, char *name, int32_t len, Access_Flag access){ + Command_Data *cmd = (Command_Data*)app->cmd_context; + Buffer_Summary buffer = {0}; + System_Functions *system = cmd->system; + Models *models = cmd->models; + Working_Set *working_set = &models->working_set; + + String fname = make_string(name, len); + Editing_File_Canon_Name canon = {0}; + if (get_canon_name(system, &canon, fname)){ + Editing_File *file = working_set_canon_contains(working_set, canon.name); fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ buffer = null_buffer_summary; @@ -1238,7 +1259,7 @@ End_Buffer_Creation(Application_Links *app, Buffer_Creation_Data *data) /* DOC_PARAM(data, a local user handle for buffer creation that has already been initialized by begin_buffer_creation and used in subsequent buffer creation flags) -DOC_RETURN(returns a summary of the newly created buffer or of the existing buffer that already has the specified name. If there is not enough creation data to make the buffer the returned summary will be null.) +DOC_RETURN(Returns a summary of the newly created buffer or of the existing buffer that already has the specified name. If there is not enough creation data to make the buffer the returned summary will be null.) DOC_SEE(begin_buffer_creation) */{ @@ -1253,11 +1274,11 @@ DOC_SEE(begin_buffer_creation) Buffer_Summary result = {0}; - if (data && data->fname_len > 0){ + if (data != 0 && data->fname_len > 0){ String fname = make_string(data->fname_space, data->fname_len); Editing_File *file = 0; - b32 do_new_file = 0; + b32 do_new_file = false; Plat_Handle handle = {0}; Temp_Memory temp = begin_temp_memory(part); @@ -1267,23 +1288,23 @@ DOC_SEE(begin_buffer_creation) file = working_set_canon_contains(working_set, canon.name); } else{ - do_new_file = 1; + do_new_file = true; } - if (!file){ + if (file == 0){ file = working_set_name_contains(working_set, fname); } u32 flags = data->flags; - if (!file){ + if (file == 0){ if (!do_new_file){ if (flags & BufferCreate_AlwaysNew){ - do_new_file = 1; + do_new_file = true; } else{ if (!system->load_handle(canon.name.str, &handle)){ - do_new_file = 1; + do_new_file = true; } } } @@ -1292,13 +1313,13 @@ DOC_SEE(begin_buffer_creation) Assert(!handle_equal(handle, null_plat_handle)); i32 size = system->load_size(handle); - b32 in_general_mem = 0; + b32 in_general_mem = false; char *buffer = push_array(part, char, size); if (buffer == 0){ buffer = (char*)general_memory_allocate(general, size); Assert(buffer != 0); - in_general_mem = 1; + in_general_mem = true; } if (system->load_file(handle, buffer, size)){ diff --git a/LICENSE.txt b/LICENSE.txt index 61e2bdc1..625ae062 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -19,16 +19,12 @@ non-infringement. The following parts of the Software are separately licensed as follows: - The Liberation font family is licensed under the SIL Open Font License (version 2 onwards). - The full text of this license is available in the accompanying 3rdparty/sil.txt file - The Hack font family is licensed under the a modified SIL license - The full text of this license is available in the accompanying 3rdparty/hacksil.txt file - The Inconsolata font family is licensed under the SIL Open Font License - Copyright (c) 2011, Raph Levien (firstname.lastname@gmail.com), Copyright (c) 2012, Cyreal (cyreal.org) - The full text of this license is available in the accompanying 3rdpart/sil.txt + Copyright (c) 2011, Raph Levien (raph.levien@gmail.com), Copyright (c) 2012, Cyreal (cyreal.org) - The Cutive font family is licensed under the SIL Open Font License Copyright (c) 2012 by vernon adams (vern@newtypography.co.uk) - The full text of this license is available in the accompanying 3rdpart/sil.txt diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp index 376ad522..a9ad6f83 100644 --- a/power/4coder_experiments.cpp +++ b/power/4coder_experiments.cpp @@ -24,67 +24,67 @@ TYPE: 'build-target' static float get_line_y(Application_Links *app, View_Summary *view, int32_t line){ - Full_Cursor cursor = {0}; - view_compute_cursor(app, view, seek_line_char(line, 1), &cursor); - float y = cursor.wrapped_y; - if (view->unwrapped_lines){ - y = cursor.unwrapped_y; - } - return(y); + Full_Cursor cursor = {0}; + view_compute_cursor(app, view, seek_line_char(line, 1), &cursor); + float y = cursor.wrapped_y; + if (view->unwrapped_lines){ + y = cursor.unwrapped_y; + } + return(y); } CUSTOM_COMMAND_SIG(kill_rect){ - View_Summary view = get_active_view(app, AccessOpen); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen); - - i32_Rect rect = get_line_x_rect(&view); - - bool32 unwrapped = view.unwrapped_lines; - - for (int32_t line = rect.y1; line >= rect.y0; --line){ - int32_t start = 0; - int32_t end = 0; - - bool32 success = 1; - Full_Cursor cursor = {0}; - - float y = get_line_y(app, &view, line); - - if (success){ - success = view_compute_cursor(app, &view, seek_xy((float)rect.x0, y, 0, unwrapped), &cursor); - } - start = cursor.pos; - - if (success){ - success = view_compute_cursor(app, &view, seek_xy((float)rect.x1, y, 0, unwrapped), &cursor); - } - end = cursor.pos; - - if (success){ - buffer_replace_range(app, &buffer, start, end, 0, 0); - } + View_Summary view = get_active_view(app, AccessOpen); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen); + + i32_Rect rect = get_line_x_rect(&view); + + bool32 unwrapped = view.unwrapped_lines; + + for (int32_t line = rect.y1; line >= rect.y0; --line){ + int32_t start = 0; + int32_t end = 0; + + bool32 success = 1; + Full_Cursor cursor = {0}; + + float y = get_line_y(app, &view, line); + + if (success){ + success = view_compute_cursor(app, &view, seek_xy((float)rect.x0, y, 0, unwrapped), &cursor); } + start = cursor.pos; + + if (success){ + success = view_compute_cursor(app, &view, seek_xy((float)rect.x1, y, 0, unwrapped), &cursor); + } + end = cursor.pos; + + if (success){ + buffer_replace_range(app, &buffer, start, end, 0, 0); + } + } } static void pad_buffer_line(Application_Links *app, Partition *part, Buffer_Summary *buffer, int32_t line, char padchar, int32_t target){ - Partial_Cursor start = {0}; - Partial_Cursor end = {0}; - - if (buffer_compute_cursor(app, buffer, seek_line_char(line, 1), &start)){ - if (buffer_compute_cursor(app, buffer, seek_line_char(line, 65536), &end)){ - if (start.line == line){ - if (end.character-1 < target){ - Temp_Memory temp = begin_temp_memory(part); - int32_t size = target - (end.character-1); - char *str = push_array(part, char, size); - memset(str, ' ', size); - buffer_replace_range(app, buffer, end.pos, end.pos, str, size); - end_temp_memory(temp); - } - } + Partial_Cursor start = {0}; + Partial_Cursor end = {0}; + + if (buffer_compute_cursor(app, buffer, seek_line_char(line, 1), &start)){ + if (buffer_compute_cursor(app, buffer, seek_line_char(line, 65536), &end)){ + if (start.line == line){ + if (end.character-1 < target){ + Temp_Memory temp = begin_temp_memory(part); + int32_t size = target - (end.character-1); + char *str = push_array(part, char, size); + memset(str, ' ', size); + buffer_replace_range(app, buffer, end.pos, end.pos, str, size); + end_temp_memory(temp); } + } } + } } /* @@ -123,86 +123,86 @@ doing multi-cursor for now. */ CUSTOM_COMMAND_SIG(multi_line_edit){ - Partition *part = &global_part; - - View_Summary view = get_active_view(app, AccessOpen); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen); - - Buffer_Rect rect = get_rect(&view); - - int32_t start_line = view.cursor.line; - int32_t pos = view.cursor.character-1; - - for (int32_t i = rect.line0; i <= rect.line1; ++i){ - pad_buffer_line(app, &global_part, &buffer, i, ' ', pos); + Partition *part = &global_part; + + View_Summary view = get_active_view(app, AccessOpen); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen); + + Buffer_Rect rect = get_rect(&view); + + int32_t start_line = view.cursor.line; + int32_t pos = view.cursor.character-1; + + for (int32_t i = rect.line0; i <= rect.line1; ++i){ + pad_buffer_line(app, &global_part, &buffer, i, ' ', pos); + } + + int32_t line_count = rect.line1 - rect.line0 + 1; + + for (;;){ + User_Input in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton); + if (in.abort) break; + + if (in.key.character && key_is_unmodified(&in.key)){ + char str = (char)in.key.character; + + Temp_Memory temp = begin_temp_memory(part); + Buffer_Edit *edit = push_array(part, Buffer_Edit, line_count); + Buffer_Edit *edits = edit; + + for (int32_t i = rect.line0; i <= rect.line1; ++i){ + Partial_Cursor cursor = {0}; + + if (buffer_compute_cursor(app, &buffer, seek_line_char(i, pos+1), &cursor)){ + edit->str_start = 0; + edit->len = 1; + edit->start = cursor.pos; + edit->end = cursor.pos; + ++edit; + } + } + + int32_t edit_count = (int)(edit - edits); + buffer_batch_edit(app, &buffer, &str, 1, edits, edit_count, BatchEdit_Normal); + + end_temp_memory(temp); + + ++pos; + + view_set_cursor(app, &view, seek_line_char(start_line, pos+1), true); } - - int32_t line_count = rect.line1 - rect.line0 + 1; - - for (;;){ - User_Input in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton); - if (in.abort) break; - - if (in.key.character && key_is_unmodified(&in.key)){ - char str = (char)in.key.character; - - Temp_Memory temp = begin_temp_memory(part); - Buffer_Edit *edit = push_array(part, Buffer_Edit, line_count); - Buffer_Edit *edits = edit; - - for (int32_t i = rect.line0; i <= rect.line1; ++i){ - Partial_Cursor cursor = {0}; - - if (buffer_compute_cursor(app, &buffer, seek_line_char(i, pos+1), &cursor)){ - edit->str_start = 0; - edit->len = 1; - edit->start = cursor.pos; - edit->end = cursor.pos; - ++edit; - } - } - - int32_t edit_count = (int)(edit - edits); - buffer_batch_edit(app, &buffer, &str, 1, edits, edit_count, BatchEdit_Normal); - - end_temp_memory(temp); - - ++pos; - - view_set_cursor(app, &view, seek_line_char(start_line, pos+1), true); - } - else if (in.key.keycode == key_back){ - if (pos > 0){ - - Temp_Memory temp = begin_temp_memory(part); - Buffer_Edit *edit = push_array(part, Buffer_Edit, line_count); - Buffer_Edit *edits = edit; - - for (int32_t i = rect.line0; i <= rect.line1; ++i){ - Partial_Cursor cursor = {0}; - - if (buffer_compute_cursor(app, &buffer, seek_line_char(i, pos+1), &cursor)){ - edit->str_start = 0; - edit->len = 0; - edit->start = cursor.pos-1; - edit->end = cursor.pos; - ++edit; - } - } - - int32_t edit_count = (int)(edit - edits); - buffer_batch_edit(app, &buffer, 0, 0, edits, edit_count, BatchEdit_Normal); - - end_temp_memory(temp); - - --pos; - } - - } - else{ - break; + else if (in.key.keycode == key_back){ + if (pos > 0){ + + Temp_Memory temp = begin_temp_memory(part); + Buffer_Edit *edit = push_array(part, Buffer_Edit, line_count); + Buffer_Edit *edits = edit; + + for (int32_t i = rect.line0; i <= rect.line1; ++i){ + Partial_Cursor cursor = {0}; + + if (buffer_compute_cursor(app, &buffer, seek_line_char(i, pos+1), &cursor)){ + edit->str_start = 0; + edit->len = 0; + edit->start = cursor.pos-1; + edit->end = cursor.pos; + ++edit; + } } + + int32_t edit_count = (int)(edit - edits); + buffer_batch_edit(app, &buffer, 0, 0, edits, edit_count, BatchEdit_Normal); + + end_temp_memory(temp); + + --pos; + } + } + else{ + break; + } + } } // @@ -210,1222 +210,1222 @@ CUSTOM_COMMAND_SIG(multi_line_edit){ // enum{ - FindScope_Parent = 0x1, - FindScope_NextSibling = 0x1, - FindScope_EndOfToken = 0x2, + FindScope_Parent = 0x1, + FindScope_NextSibling = 0x1, + FindScope_EndOfToken = 0x2, }; static bool32 find_scope_top(Application_Links *app, Buffer_Summary *buffer, int32_t start_pos, uint32_t flags, int32_t *end_pos_out){ - Cpp_Get_Token_Result get_result = {0}; - - bool32 success = 0; - int32_t position = 0; - - if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ - int32_t token_index = get_result.token_index; - if (flags & FindScope_Parent){ - --token_index; - if (get_result.in_whitespace){ - ++token_index; - } - } - - if (token_index >= 0){ - static const int32_t chunk_cap = 512; - Cpp_Token chunk[chunk_cap]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){int32_t nest_level = 0; - bool32 still_looping = 0; - do{ - for (; token_index >= stream.start; --token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - switch (token->type){ - case CPP_TOKEN_BRACE_OPEN: - { - if (nest_level == 0){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - else{ - --nest_level; - } - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - ++nest_level; - }break; - } - } - still_looping = backward_stream_tokens(&stream); - }while(still_looping); - } - } + Cpp_Get_Token_Result get_result = {0}; + + bool32 success = 0; + int32_t position = 0; + + if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ + int32_t token_index = get_result.token_index; + if (flags & FindScope_Parent){ + --token_index; + if (get_result.in_whitespace){ + ++token_index; + } } - - finished:; - *end_pos_out = position; - return(success); + + if (token_index >= 0){ + static const int32_t chunk_cap = 512; + Cpp_Token chunk[chunk_cap]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){int32_t nest_level = 0; + bool32 still_looping = 0; + do{ + for (; token_index >= stream.start; --token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + switch (token->type){ + case CPP_TOKEN_BRACE_OPEN: + { + if (nest_level == 0){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + else{ + --nest_level; + } + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + ++nest_level; + }break; + } + } + still_looping = backward_stream_tokens(&stream); + }while(still_looping); + } + } + } + + finished:; + *end_pos_out = position; + return(success); } static bool32 find_scope_bottom(Application_Links *app, Buffer_Summary *buffer, int32_t start_pos, uint32_t flags, int32_t *end_pos_out){ - Cpp_Get_Token_Result get_result = {0}; - - bool32 success = 0; - int32_t position = 0; - - if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ - int32_t token_index = get_result.token_index+1; - if (flags & FindScope_Parent){ - --token_index; - if (get_result.in_whitespace){ - ++token_index; - } - } - - if (token_index >= 0){ - static const int32_t chunk_cap = 512; - Cpp_Token chunk[chunk_cap]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ - int32_t nest_level = 0; - bool32 still_looping = 0; - do{ - for (; token_index < stream.end; ++token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - switch (token->type){ - case CPP_TOKEN_BRACE_OPEN: - { - ++nest_level; - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - if (nest_level == 0){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - else{ - --nest_level; - } - }break; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - } - } + Cpp_Get_Token_Result get_result = {0}; + + bool32 success = 0; + int32_t position = 0; + + if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ + int32_t token_index = get_result.token_index+1; + if (flags & FindScope_Parent){ + --token_index; + if (get_result.in_whitespace){ + ++token_index; + } } - - finished:; - *end_pos_out = position; - return(success); + + if (token_index >= 0){ + static const int32_t chunk_cap = 512; + Cpp_Token chunk[chunk_cap]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ + int32_t nest_level = 0; + bool32 still_looping = 0; + do{ + for (; token_index < stream.end; ++token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + switch (token->type){ + case CPP_TOKEN_BRACE_OPEN: + { + ++nest_level; + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + if (nest_level == 0){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + else{ + --nest_level; + } + }break; + } + } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + } + } + } + + finished:; + *end_pos_out = position; + return(success); } static bool32 find_next_scope(Application_Links *app, Buffer_Summary *buffer, int32_t start_pos, uint32_t flags, int32_t *end_pos_out){ - Cpp_Get_Token_Result get_result = {0}; - - bool32 success = 0; - int32_t position = 0; - - if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ - int32_t token_index = get_result.token_index+1; - - if (token_index >= 0){ - static const int32_t chunk_cap = 512; - Cpp_Token chunk[chunk_cap]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ - if (flags & FindScope_NextSibling){ - int32_t nest_level = 1; - - bool32 still_looping = 0; - do{ - for (; token_index < stream.end; ++token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - switch (token->type){ - case CPP_TOKEN_BRACE_OPEN: - { - if (nest_level == 0){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - else{ - ++nest_level; - } - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - --nest_level; - if (nest_level == -1){ - position = start_pos; - goto finished; - } - }break; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - } - else{ - bool32 still_looping = 0; - do{ - for (; token_index < stream.end; ++token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - if (token->type == CPP_TOKEN_BRACE_OPEN){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - } + Cpp_Get_Token_Result get_result = {0}; + + bool32 success = 0; + int32_t position = 0; + + if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ + int32_t token_index = get_result.token_index+1; + + if (token_index >= 0){ + static const int32_t chunk_cap = 512; + Cpp_Token chunk[chunk_cap]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ + if (flags & FindScope_NextSibling){ + int32_t nest_level = 1; + + bool32 still_looping = 0; + do{ + for (; token_index < stream.end; ++token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + switch (token->type){ + case CPP_TOKEN_BRACE_OPEN: + { + if (nest_level == 0){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + else{ + ++nest_level; + } + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + --nest_level; + if (nest_level == -1){ + position = start_pos; + goto finished; + } + }break; + } } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); } + else{ + bool32 still_looping = 0; + do{ + for (; token_index < stream.end; ++token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + if (token->type == CPP_TOKEN_BRACE_OPEN){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + } + } } - - finished:; - *end_pos_out = position; - return(success); + } + + finished:; + *end_pos_out = position; + return(success); } static bool32 find_prev_scope(Application_Links *app, Buffer_Summary *buffer, int32_t start_pos, uint32_t flags, int32_t *end_pos_out){ - Cpp_Get_Token_Result get_result = {0}; - - bool32 success = 0; - int32_t position = 0; - - if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ - int32_t token_index = get_result.token_index-1; - - if (token_index >= 0){ - static const int32_t chunk_cap = 512; - Cpp_Token chunk[chunk_cap]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ - if (flags & FindScope_NextSibling){ - int32_t nest_level = -1; - bool32 still_looping = 0; - do{ - for (; token_index >= stream.start; --token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - switch (token->type){ - case CPP_TOKEN_BRACE_OPEN: - { - if (nest_level == -1){ - position = start_pos; - goto finished; - } - else if (nest_level == 0){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - else{ - --nest_level; - } - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - ++nest_level; - }break; - } - } - still_looping = backward_stream_tokens(&stream); - }while(still_looping); - } - else{ - bool32 still_looping = 0; - do{ - for (; token_index >= stream.start; --token_index){ - Cpp_Token *token = &stream.tokens[token_index]; - - if (token->type == CPP_TOKEN_BRACE_OPEN){ - success = 1; - position = token->start; - if (flags & FindScope_EndOfToken){ - position += token->size; - } - goto finished; - } - } - still_looping = backward_stream_tokens(&stream); - }while(still_looping); - } + Cpp_Get_Token_Result get_result = {0}; + + bool32 success = 0; + int32_t position = 0; + + if (buffer_get_token_index(app, buffer, start_pos, &get_result)){ + int32_t token_index = get_result.token_index-1; + + if (token_index >= 0){ + static const int32_t chunk_cap = 512; + Cpp_Token chunk[chunk_cap]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, buffer, token_index, chunk, chunk_cap)){ + if (flags & FindScope_NextSibling){ + int32_t nest_level = -1; + bool32 still_looping = 0; + do{ + for (; token_index >= stream.start; --token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + switch (token->type){ + case CPP_TOKEN_BRACE_OPEN: + { + if (nest_level == -1){ + position = start_pos; + goto finished; + } + else if (nest_level == 0){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + else{ + --nest_level; + } + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + ++nest_level; + }break; + } } + still_looping = backward_stream_tokens(&stream); + }while(still_looping); } + else{ + bool32 still_looping = 0; + do{ + for (; token_index >= stream.start; --token_index){ + Cpp_Token *token = &stream.tokens[token_index]; + + if (token->type == CPP_TOKEN_BRACE_OPEN){ + success = 1; + position = token->start; + if (flags & FindScope_EndOfToken){ + position += token->size; + } + goto finished; + } + } + still_looping = backward_stream_tokens(&stream); + }while(still_looping); + } + } } - - finished:; - *end_pos_out = position; - return(success); + } + + finished:; + *end_pos_out = position; + return(success); } static void view_set_to_region(Application_Links *app, View_Summary *view, int32_t major_pos, int32_t minor_pos, float normalized_threshold){ - Range range = make_range(major_pos, minor_pos); - bool32 bottom_major = false; - if (major_pos == range.max){ - bottom_major = true; - } - - Full_Cursor top, bottom; - if (view_compute_cursor(app, view, seek_pos(range.min), &top)){ - if (view_compute_cursor(app, view, seek_pos(range.max), &bottom)){ - float top_y = top.wrapped_y; - float bottom_y = bottom.wrapped_y; - if (view->unwrapped_lines){ - top_y = top.unwrapped_y; - bottom_y = bottom.unwrapped_y; - } - - GUI_Scroll_Vars scroll = view->scroll_vars; - float half_view_height = .5f*(float)(view->file_region.y1 - view->file_region.y0); - float threshold = normalized_threshold * half_view_height; - float current_center_y = ((float)scroll.target_y) + half_view_height; - - if (top_y < current_center_y - threshold || bottom_y > current_center_y + threshold){ - float center_target_y = .5f*(top_y + bottom_y); - - if (bottom_major){ - if (center_target_y < bottom_y - half_view_height * .9f){ - center_target_y = bottom_y - half_view_height * .9f; - } - } - else{ - if (center_target_y > top_y + half_view_height * .9f){ - center_target_y = top_y + half_view_height * .9f; - } - } - - float target_y = center_target_y - half_view_height; - if (target_y < 0){ - target_y = 0; - } - - scroll.target_y = (int32_t)(target_y); - view_set_scroll(app, view, scroll); - } + Range range = make_range(major_pos, minor_pos); + bool32 bottom_major = false; + if (major_pos == range.max){ + bottom_major = true; + } + + Full_Cursor top, bottom; + if (view_compute_cursor(app, view, seek_pos(range.min), &top)){ + if (view_compute_cursor(app, view, seek_pos(range.max), &bottom)){ + float top_y = top.wrapped_y; + float bottom_y = bottom.wrapped_y; + if (view->unwrapped_lines){ + top_y = top.unwrapped_y; + bottom_y = bottom.unwrapped_y; + } + + GUI_Scroll_Vars scroll = view->scroll_vars; + float half_view_height = .5f*(float)(view->file_region.y1 - view->file_region.y0); + float threshold = normalized_threshold * half_view_height; + float current_center_y = ((float)scroll.target_y) + half_view_height; + + if (top_y < current_center_y - threshold || bottom_y > current_center_y + threshold){ + float center_target_y = .5f*(top_y + bottom_y); + + if (bottom_major){ + if (center_target_y < bottom_y - half_view_height * .9f){ + center_target_y = bottom_y - half_view_height * .9f; + } } + else{ + if (center_target_y > top_y + half_view_height * .9f){ + center_target_y = top_y + half_view_height * .9f; + } + } + + float target_y = center_target_y - half_view_height; + if (target_y < 0){ + target_y = 0; + } + + scroll.target_y = (int32_t)(target_y); + view_set_scroll(app, view, scroll); + } } + } } static float scope_center_threshold = 0.75f; CUSTOM_COMMAND_SIG(highlight_surrounding_scope){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_scope_top(app, &buffer, start_pos, FindScope_Parent, &top)){ - view_set_cursor(app, &view, seek_pos(top), true); - if (find_scope_bottom(app, &buffer, start_pos, FindScope_Parent | FindScope_EndOfToken, &bottom)){ - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } - else{ - view_set_to_region(app, &view, top, top, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_scope_top(app, &buffer, start_pos, FindScope_Parent, &top)){ + view_set_cursor(app, &view, seek_pos(top), true); + if (find_scope_bottom(app, &buffer, start_pos, FindScope_Parent | FindScope_EndOfToken, &bottom)){ + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + else{ + view_set_to_region(app, &view, top, top, scope_center_threshold); + } + } } // TODO(allen): These aren't super top notch yet (the ones about children and siblings). I am not sure I want them around anyway, because it's not that fluid feeling even when it works. CUSTOM_COMMAND_SIG(highlight_first_child_scope){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_next_scope(app, &buffer, start_pos, 0, &top)){ - if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ - view_set_cursor(app, &view, seek_pos(top), true); - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_next_scope(app, &buffer, start_pos, 0, &top)){ + if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ + view_set_cursor(app, &view, seek_pos(top), true); + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + } } CUSTOM_COMMAND_SIG(highlight_next_sibling_scope){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_next_scope(app, &buffer, start_pos, FindScope_NextSibling, &top)){ - if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ - view_set_cursor(app, &view, seek_pos(top), true); - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_next_scope(app, &buffer, start_pos, FindScope_NextSibling, &top)){ + if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ + view_set_cursor(app, &view, seek_pos(top), true); + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + } } CUSTOM_COMMAND_SIG(highlight_prev_sibling_scope){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_prev_scope(app, &buffer, start_pos, FindScope_NextSibling, &top)){ - if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ - view_set_cursor(app, &view, seek_pos(top), true); - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_prev_scope(app, &buffer, start_pos, FindScope_NextSibling, &top)){ + if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ + view_set_cursor(app, &view, seek_pos(top), true); + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + } } CUSTOM_COMMAND_SIG(highlight_next_scope_absolute){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_next_scope(app, &buffer, start_pos, 0, &top)){ - if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ - view_set_cursor(app, &view, seek_pos(top), true); - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_next_scope(app, &buffer, start_pos, 0, &top)){ + if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ + view_set_cursor(app, &view, seek_pos(top), true); + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + } } CUSTOM_COMMAND_SIG(highlight_prev_scope_absolute){ - uint32_t access = AccessProtected; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t start_pos = view.cursor.pos; - int32_t top = 0, bottom = 0; - if (find_prev_scope(app, &buffer, start_pos, 0, &top)){ - if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ - view_set_cursor(app, &view, seek_pos(top), true); - view_set_mark(app, &view, seek_pos(bottom)); - view_set_to_region(app, &view, top, bottom, scope_center_threshold); - } + uint32_t access = AccessProtected; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t start_pos = view.cursor.pos; + int32_t top = 0, bottom = 0; + if (find_prev_scope(app, &buffer, start_pos, 0, &top)){ + if (find_scope_bottom(app, &buffer, top, FindScope_EndOfToken, &bottom)){ + view_set_cursor(app, &view, seek_pos(top), true); + view_set_mark(app, &view, seek_pos(bottom)); + view_set_to_region(app, &view, top, bottom, scope_center_threshold); } + } } CUSTOM_COMMAND_SIG(place_in_scope){ - uint32_t access = AccessOpen; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - Range lines; - Range range = get_range(&view); - lines.min = buffer_get_line_index(app, &buffer, range.min); - range.min = buffer_get_line_start(app, &buffer, lines.min); - - lines.max = buffer_get_line_index(app, &buffer, range.max); - range.max = buffer_get_line_end(app, &buffer, lines.max); - - bool32 do_full = false; - - if (lines.min < lines.max){ - do_full = true; + uint32_t access = AccessOpen; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + Range lines; + Range range = get_range(&view); + lines.min = buffer_get_line_index(app, &buffer, range.min); + range.min = buffer_get_line_start(app, &buffer, lines.min); + + lines.max = buffer_get_line_index(app, &buffer, range.max); + range.max = buffer_get_line_end(app, &buffer, lines.max); + + bool32 do_full = false; + + if (lines.min < lines.max){ + do_full = true; + } + else if (!buffer_line_is_blank(app, &buffer, lines.min)){ + do_full = true; + } + + if (do_full){ + Buffer_Edit edits[2]; + char str[5] = "{\n\n}"; + + int32_t min_adjustment = 0; + int32_t max_adjustment = 4; + + if (buffer_line_is_blank(app, &buffer, lines.min)){ + str[0] = '\n'; + str[1] = '{'; + ++min_adjustment; } - else if (!buffer_line_is_blank(app, &buffer, lines.min)){ - do_full = true; + + if (buffer_line_is_blank(app, &buffer, lines.max)){ + str[2] = '}'; + str[3] = '\n'; + --max_adjustment; } - - if (do_full){ - Buffer_Edit edits[2]; - char str[5] = "{\n\n}"; - - int32_t min_adjustment = 0; - int32_t max_adjustment = 4; - - if (buffer_line_is_blank(app, &buffer, lines.min)){ - str[0] = '\n'; - str[1] = '{'; - ++min_adjustment; - } - - if (buffer_line_is_blank(app, &buffer, lines.max)){ - str[2] = '}'; - str[3] = '\n'; - --max_adjustment; - } - - int32_t min_pos = range.min + min_adjustment; - int32_t max_pos = range.max + max_adjustment; - - int32_t cursor_pos = min_pos; - int32_t mark_pos = max_pos; - - if (view.cursor.pos > view.mark.pos){ - cursor_pos = max_pos; - mark_pos = min_pos; - } - - edits[0].str_start = 0; - edits[0].len = 2; - edits[0].start = range.min; - edits[0].end = range.min; - - edits[1].str_start = 2; - edits[1].len = 2; - edits[1].start = range.max; - edits[1].end = range.max; - - buffer_batch_edit(app, &buffer, str, 4, edits, 2, BatchEdit_Normal); - - view_set_cursor(app, &view, seek_pos(cursor_pos), true); - view_set_mark(app, &view, seek_pos(mark_pos)); - } - else{ - buffer_replace_range(app, &buffer, range.min, range.max, "{\n\n}", 4); - view_set_cursor(app, &view, seek_pos(range.min + 2), true); - view_set_mark(app, &view, seek_pos(range.min + 2)); + + int32_t min_pos = range.min + min_adjustment; + int32_t max_pos = range.max + max_adjustment; + + int32_t cursor_pos = min_pos; + int32_t mark_pos = max_pos; + + if (view.cursor.pos > view.mark.pos){ + cursor_pos = max_pos; + mark_pos = min_pos; } + + edits[0].str_start = 0; + edits[0].len = 2; + edits[0].start = range.min; + edits[0].end = range.min; + + edits[1].str_start = 2; + edits[1].len = 2; + edits[1].start = range.max; + edits[1].end = range.max; + + buffer_batch_edit(app, &buffer, str, 4, edits, 2, BatchEdit_Normal); + + view_set_cursor(app, &view, seek_pos(cursor_pos), true); + view_set_mark(app, &view, seek_pos(mark_pos)); + } + else{ + buffer_replace_range(app, &buffer, range.min, range.max, "{\n\n}", 4); + view_set_cursor(app, &view, seek_pos(range.min + 2), true); + view_set_mark(app, &view, seek_pos(range.min + 2)); + } } CUSTOM_COMMAND_SIG(delete_current_scope){ - uint32_t access = AccessOpen; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t top = view.cursor.pos; - int32_t bottom = view.mark.pos; - - if (top > bottom){ - int32_t x = top; - top = bottom; - bottom = x; + uint32_t access = AccessOpen; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t top = view.cursor.pos; + int32_t bottom = view.mark.pos; + + if (top > bottom){ + int32_t x = top; + top = bottom; + bottom = x; + } + + if (buffer_get_char(app, &buffer, top) == '{' && buffer_get_char(app, &buffer, bottom-1) == '}'){ + int32_t top_len = 1; + int32_t bottom_len = 1; + if (buffer_get_char(app, &buffer, top-1) == '\n'){ + top_len = 2; } - - if (buffer_get_char(app, &buffer, top) == '{' && buffer_get_char(app, &buffer, bottom-1) == '}'){ - int32_t top_len = 1; - int32_t bottom_len = 1; - if (buffer_get_char(app, &buffer, top-1) == '\n'){ - top_len = 2; - } - if (buffer_get_char(app, &buffer, bottom+1) == '\n'){ - bottom_len = 2; - } - - Buffer_Edit edits[2]; - edits[0].str_start = 0; - edits[0].len = 0; - edits[0].start = top+1 - top_len; - edits[0].end = top+1; - - edits[1].str_start = 0; - edits[1].len = 0; - edits[1].start = bottom-1; - edits[1].end = bottom-1 + bottom_len; - - buffer_batch_edit(app, &buffer, 0, 0, edits, 2, BatchEdit_Normal); + if (buffer_get_char(app, &buffer, bottom+1) == '\n'){ + bottom_len = 2; } + + Buffer_Edit edits[2]; + edits[0].str_start = 0; + edits[0].len = 0; + edits[0].start = top+1 - top_len; + edits[0].end = top+1; + + edits[1].str_start = 0; + edits[1].len = 0; + edits[1].start = bottom-1; + edits[1].end = bottom-1 + bottom_len; + + buffer_batch_edit(app, &buffer, 0, 0, edits, 2, BatchEdit_Normal); + } } struct Statement_Parser{ - Stream_Tokens stream; - int32_t token_index; - Buffer_Summary *buffer; + Stream_Tokens stream; + int32_t token_index; + Buffer_Summary *buffer; }; static Cpp_Token* parser_next_token(Statement_Parser *parser){ - Cpp_Token *result = 0; - bool32 still_looping = true; - while (parser->token_index >= parser->stream.end && still_looping){ - still_looping = forward_stream_tokens(&parser->stream); - } - if (parser->token_index < parser->stream.end){ - result = &parser->stream.tokens[parser->token_index]; - ++parser->token_index; - } - return(result); + Cpp_Token *result = 0; + bool32 still_looping = true; + while (parser->token_index >= parser->stream.end && still_looping){ + still_looping = forward_stream_tokens(&parser->stream); + } + if (parser->token_index < parser->stream.end){ + result = &parser->stream.tokens[parser->token_index]; + ++parser->token_index; + } + return(result); } static bool32 parse_statement_down(Application_Links *app, Statement_Parser *parser, Cpp_Token *token_out); static bool32 parse_for_down(Application_Links *app, Statement_Parser *parser, Cpp_Token *token_out){ - bool32 success = false; - Cpp_Token *token = parser_next_token(parser); - - int32_t paren_level = 0; - while (token != 0){ - if (!(token->flags & CPP_TFLAG_PP_BODY)){ - switch (token->type){ - case CPP_TOKEN_PARENTHESE_OPEN: - { - ++paren_level; - }break; - - case CPP_TOKEN_PARENTHESE_CLOSE: - { - --paren_level; - if (paren_level == 0){ - success = parse_statement_down(app, parser, token_out); - goto finished; - } - else if (paren_level < 0){ - success = false; - goto finished; - } - }break; - } - } - - token = parser_next_token(parser); + bool32 success = false; + Cpp_Token *token = parser_next_token(parser); + + int32_t paren_level = 0; + while (token != 0){ + if (!(token->flags & CPP_TFLAG_PP_BODY)){ + switch (token->type){ + case CPP_TOKEN_PARENTHESE_OPEN: + { + ++paren_level; + }break; + + case CPP_TOKEN_PARENTHESE_CLOSE: + { + --paren_level; + if (paren_level == 0){ + success = parse_statement_down(app, parser, token_out); + goto finished; + } + else if (paren_level < 0){ + success = false; + goto finished; + } + }break; + } } - - finished:; - return(success); + + token = parser_next_token(parser); + } + + finished:; + return(success); } static bool32 parse_if_down(Application_Links *app, Statement_Parser *parser, Cpp_Token *token_out){ - bool32 success = false; - Cpp_Token *token = parser_next_token(parser); - - if (token != 0){ - success = parse_statement_down(app, parser, token_out); - if (success){ - token = parser_next_token(parser); - if (token != 0 && token->type == CPP_TOKEN_KEY_CONTROL_FLOW){ - char lexeme[32]; - if (sizeof(lexeme)-1 >= token->size){ - if (buffer_read_range(app, parser->buffer, token->start, token->start + token->size, lexeme)){ - lexeme[token->size] = 0; - if (match(lexeme, "else")){ - success = parse_statement_down(app, parser, token_out); - } - } - } + bool32 success = false; + Cpp_Token *token = parser_next_token(parser); + + if (token != 0){ + success = parse_statement_down(app, parser, token_out); + if (success){ + token = parser_next_token(parser); + if (token != 0 && token->type == CPP_TOKEN_KEY_CONTROL_FLOW){ + char lexeme[32]; + if (sizeof(lexeme)-1 >= token->size){ + if (buffer_read_range(app, parser->buffer, token->start, token->start + token->size, lexeme)){ + lexeme[token->size] = 0; + if (match(lexeme, "else")){ + success = parse_statement_down(app, parser, token_out); } + } } + } } - - return(success); + } + + return(success); } static bool32 parse_block_down(Application_Links *app, Statement_Parser *parser, Cpp_Token *token_out){ - bool32 success = false; - Cpp_Token *token = parser_next_token(parser); - - int32_t nest_level = 0; - while (token != 0){ - switch (token->type){ - case CPP_TOKEN_BRACE_OPEN: - { - ++nest_level; - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - if (nest_level == 0){ - *token_out = *token; - success = true; - goto finished; - } - --nest_level; - }break; + bool32 success = false; + Cpp_Token *token = parser_next_token(parser); + + int32_t nest_level = 0; + while (token != 0){ + switch (token->type){ + case CPP_TOKEN_BRACE_OPEN: + { + ++nest_level; + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + if (nest_level == 0){ + *token_out = *token; + success = true; + goto finished; } - token = parser_next_token(parser); + --nest_level; + }break; } - - finished:; - return(success); + token = parser_next_token(parser); + } + + finished:; + return(success); } static bool32 parse_statement_down(Application_Links *app, Statement_Parser *parser, Cpp_Token *token_out){ - bool32 success = false; - Cpp_Token *token = parser_next_token(parser); - - if (token != 0){ - bool32 not_getting_block = false; - - do{ - switch (token->type){ - case CPP_TOKEN_BRACE_CLOSE: - { - goto finished; - }break; - - case CPP_TOKEN_KEY_CONTROL_FLOW: - { - char lexeme[32]; - if (sizeof(lexeme)-1 >= token->size){ - if (buffer_read_range(app, parser->buffer, token->start, token->start + token->size, lexeme)){ - lexeme[token->size] = 0; - if (match(lexeme, "for")){ - success = parse_for_down(app, parser, token_out); - goto finished; - } - else if (match(lexeme, "if")){ - success = parse_if_down(app, parser, token_out); - goto finished; - } - else if (match(lexeme, "else")){ - success = false; - goto finished; - } - } - } - }break; - - case CPP_TOKEN_BRACE_OPEN: - { - if (!not_getting_block){ - success = parse_block_down(app, parser, token_out); - goto finished; - } - }break; - - case CPP_TOKEN_SEMICOLON: - { - success = true; - *token_out = *token; - goto finished; - }break; - - case CPP_TOKEN_EQ: - { - not_getting_block = true; - }break; + bool32 success = false; + Cpp_Token *token = parser_next_token(parser); + + if (token != 0){ + bool32 not_getting_block = false; + + do{ + switch (token->type){ + case CPP_TOKEN_BRACE_CLOSE: + { + goto finished; + }break; + + case CPP_TOKEN_KEY_CONTROL_FLOW: + { + char lexeme[32]; + if (sizeof(lexeme)-1 >= token->size){ + if (buffer_read_range(app, parser->buffer, token->start, token->start + token->size, lexeme)){ + lexeme[token->size] = 0; + if (match(lexeme, "for")){ + success = parse_for_down(app, parser, token_out); + goto finished; + } + else if (match(lexeme, "if")){ + success = parse_if_down(app, parser, token_out); + goto finished; + } + else if (match(lexeme, "else")){ + success = false; + goto finished; + } } - - token = parser_next_token(parser); - }while(token != 0); - } - - finished:; - return(success); + } + }break; + + case CPP_TOKEN_BRACE_OPEN: + { + if (!not_getting_block){ + success = parse_block_down(app, parser, token_out); + goto finished; + } + }break; + + case CPP_TOKEN_SEMICOLON: + { + success = true; + *token_out = *token; + goto finished; + }break; + + case CPP_TOKEN_EQ: + { + not_getting_block = true; + }break; + } + + token = parser_next_token(parser); + }while(token != 0); + } + + finished:; + return(success); } static bool32 find_whole_statement_down(Application_Links *app, Buffer_Summary *buffer, int32_t pos, int32_t *start_out, int32_t *end_out){ - bool32 result = false; - int32_t start = pos; - int32_t end = start; - - Cpp_Get_Token_Result get_result = {0}; - - if (buffer_get_token_index(app, buffer, pos, &get_result)){ - Statement_Parser parser = {0}; - parser.token_index = get_result.token_index; - - if (parser.token_index < 0){ - parser.token_index = 0; - } - if (get_result.in_whitespace){ - parser.token_index += 1; - } - - static const int32_t chunk_cap = 512; - Cpp_Token chunk[chunk_cap]; - - if (init_stream_tokens(&parser.stream, app, buffer, parser.token_index, chunk, chunk_cap)){ - parser.buffer = buffer; - - Cpp_Token end_token = {0}; - if (parse_statement_down(app, &parser, &end_token)){ - end = end_token.start + end_token.size; - result = true; - } - } + bool32 result = false; + int32_t start = pos; + int32_t end = start; + + Cpp_Get_Token_Result get_result = {0}; + + if (buffer_get_token_index(app, buffer, pos, &get_result)){ + Statement_Parser parser = {0}; + parser.token_index = get_result.token_index; + + if (parser.token_index < 0){ + parser.token_index = 0; } - - *start_out = start; - *end_out = end; - return(result); + if (get_result.in_whitespace){ + parser.token_index += 1; + } + + static const int32_t chunk_cap = 512; + Cpp_Token chunk[chunk_cap]; + + if (init_stream_tokens(&parser.stream, app, buffer, parser.token_index, chunk, chunk_cap)){ + parser.buffer = buffer; + + Cpp_Token end_token = {0}; + if (parse_statement_down(app, &parser, &end_token)){ + end = end_token.start + end_token.size; + result = true; + } + } + } + + *start_out = start; + *end_out = end; + return(result); } CUSTOM_COMMAND_SIG(scope_absorb_down){ - uint32_t access = AccessOpen; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - int32_t top = view.cursor.pos; - int32_t bottom = view.mark.pos; - - if (top > bottom){ - int32_t x = top; - top = bottom; - bottom = x; - } - - Partition *part = &global_part; - - Temp_Memory temp = begin_temp_memory(part); - if (buffer_get_char(app, &buffer, top) == '{' && buffer_get_char(app, &buffer, bottom-1) == '}'){ - Range range; - if (find_whole_statement_down(app, &buffer, bottom, &range.start, &range.end)){ - char *string_space = push_array(part, char, range.end - range.start); - buffer_read_range(app, &buffer, range.start, range.end, string_space); - - String string = make_string(string_space, range.end - range.start); - string = skip_chop_whitespace(string); - - int32_t newline_count = 0; - for (char *ptr = string_space; ptr < string.str; ++ptr){ - if (*ptr == '\n'){ - ++newline_count; - } - } - - bool32 extra_newline = false; - if (newline_count >= 2){ - extra_newline = true; - } - - int32_t edit_len = string.size + 1; - if (extra_newline){ - edit_len += 1; - } - - char *edit_str = push_array(part, char, edit_len); - if (extra_newline){ - edit_str[0] = '\n'; - copy_fast_unsafe(edit_str+1, string); - edit_str[edit_len-1] = '\n'; - } - else{ - copy_fast_unsafe(edit_str, string); - edit_str[edit_len-1] = '\n'; - } - - Buffer_Edit edits[2]; - edits[0].str_start = 0; - edits[0].len = edit_len; - edits[0].start = bottom-1; - edits[0].end = bottom-1; - - edits[1].str_start = 0; - edits[1].len = 0; - edits[1].start = range.start; - edits[1].end = range.end; - - buffer_batch_edit(app, &buffer, edit_str, edit_len, edits, 2, BatchEdit_Normal); + uint32_t access = AccessOpen; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + int32_t top = view.cursor.pos; + int32_t bottom = view.mark.pos; + + if (top > bottom){ + int32_t x = top; + top = bottom; + bottom = x; + } + + Partition *part = &global_part; + + Temp_Memory temp = begin_temp_memory(part); + if (buffer_get_char(app, &buffer, top) == '{' && buffer_get_char(app, &buffer, bottom-1) == '}'){ + Range range; + if (find_whole_statement_down(app, &buffer, bottom, &range.start, &range.end)){ + char *string_space = push_array(part, char, range.end - range.start); + buffer_read_range(app, &buffer, range.start, range.end, string_space); + + String string = make_string(string_space, range.end - range.start); + string = skip_chop_whitespace(string); + + int32_t newline_count = 0; + for (char *ptr = string_space; ptr < string.str; ++ptr){ + if (*ptr == '\n'){ + ++newline_count; } + } + + bool32 extra_newline = false; + if (newline_count >= 2){ + extra_newline = true; + } + + int32_t edit_len = string.size + 1; + if (extra_newline){ + edit_len += 1; + } + + char *edit_str = push_array(part, char, edit_len); + if (extra_newline){ + edit_str[0] = '\n'; + copy_fast_unsafe(edit_str+1, string); + edit_str[edit_len-1] = '\n'; + } + else{ + copy_fast_unsafe(edit_str, string); + edit_str[edit_len-1] = '\n'; + } + + Buffer_Edit edits[2]; + edits[0].str_start = 0; + edits[0].len = edit_len; + edits[0].start = bottom-1; + edits[0].end = bottom-1; + + edits[1].str_start = 0; + edits[1].len = 0; + edits[1].start = range.start; + edits[1].end = range.end; + + buffer_batch_edit(app, &buffer, edit_str, edit_len, edits, 2, BatchEdit_Normal); } - end_temp_memory(temp); + } + end_temp_memory(temp); } // NOTE(allen): Some basic code manipulation ideas. CUSTOM_COMMAND_SIG(rename_parameter){ - uint32_t access = AccessOpen; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - Partition *part = &global_part; - - Temp_Memory temp = begin_temp_memory(part); - - Cpp_Get_Token_Result result; - if (buffer_get_token_index(app, &buffer, view.cursor.pos, &result)){ - if (!result.in_whitespace){ - static const int32_t stream_space_size = 512; - Cpp_Token stream_space[stream_space_size]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, &buffer, result.token_index, stream_space, stream_space_size)){ - int32_t token_index = result.token_index; - Cpp_Token token = stream.tokens[token_index]; - - if (token.type == CPP_TOKEN_IDENTIFIER){ - - char old_lexeme_base[128]; - String old_lexeme = make_fixed_width_string(old_lexeme_base); - - if (token.size < sizeof(old_lexeme_base)){ - Cpp_Token original_token = token; - old_lexeme.size = token.size; - buffer_read_range(app, &buffer, token.start, token.start+token.size, old_lexeme.str); - - int32_t proc_body_found = 0; - bool32 still_looping = 0; - - ++token_index; - do{ - for (; token_index < stream.end; ++token_index){ - Cpp_Token *token_ptr = stream.tokens + token_index; - switch (token_ptr->type){ - case CPP_TOKEN_BRACE_OPEN: - { - proc_body_found = 1; - goto doublebreak; - }break; - - case CPP_TOKEN_BRACE_CLOSE: - case CPP_TOKEN_PARENTHESE_OPEN: - { - goto doublebreak; - }break; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - doublebreak:; - - if (proc_body_found){ - - Query_Bar with; - char with_space[1024]; - with.prompt = make_lit_string("New Name: "); - with.string = make_fixed_width_string(with_space); - if (!query_user_string(app, &with)) return; - - String replace_string = with.string; - - Buffer_Edit *edits = (Buffer_Edit*)partition_current(part); - int32_t edit_max = (partition_remaining(part))/sizeof(Buffer_Edit); - int32_t edit_count = 0; - - if (edit_max >= 1){ - Buffer_Edit edit; - edit.str_start = 0; - edit.len = replace_string.size; - edit.start = original_token.start; - edit.end = original_token.start + original_token.size; - - edits[edit_count] = edit; - ++edit_count; - } - - int32_t nesting_level = 0; - int32_t closed_correctly = 0; - ++token_index; - still_looping = 0; - do{ - for (; token_index < stream.end; ++token_index){ - Cpp_Token *token_ptr = stream.tokens + token_index; - switch (token_ptr->type){ - case CPP_TOKEN_IDENTIFIER: - { - if (token_ptr->size == old_lexeme.size){ - char other_lexeme_base[128]; - String other_lexeme = make_fixed_width_string(other_lexeme_base); - other_lexeme.size = old_lexeme.size; - buffer_read_range(app, &buffer, token_ptr->start, - token_ptr->start+token_ptr->size, - other_lexeme.str); - - if (match(old_lexeme, other_lexeme)){ - Buffer_Edit edit; - edit.str_start = 0; - edit.len = replace_string.size; - edit.start = token_ptr->start; - edit.end = token_ptr->start + token_ptr->size; - - if (edit_count < edit_max){ - edits[edit_count] = edit; - ++edit_count; - } - else{ - goto doublebreak2; - } - } - } - }break; - - case CPP_TOKEN_BRACE_OPEN: - { - ++nesting_level; - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - if (nesting_level == 0){ - closed_correctly = 1; - goto doublebreak2; - } - else{ - --nesting_level; - } - }break; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - doublebreak2:; - - if (closed_correctly){ - buffer_batch_edit(app, &buffer, replace_string.str, replace_string.size, - edits, edit_count, BatchEdit_Normal); - } - } - } + uint32_t access = AccessOpen; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + Partition *part = &global_part; + + Temp_Memory temp = begin_temp_memory(part); + + Cpp_Get_Token_Result result; + if (buffer_get_token_index(app, &buffer, view.cursor.pos, &result)){ + if (!result.in_whitespace){ + static const int32_t stream_space_size = 512; + Cpp_Token stream_space[stream_space_size]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, &buffer, result.token_index, stream_space, stream_space_size)){ + int32_t token_index = result.token_index; + Cpp_Token token = stream.tokens[token_index]; + + if (token.type == CPP_TOKEN_IDENTIFIER){ + + char old_lexeme_base[128]; + String old_lexeme = make_fixed_width_string(old_lexeme_base); + + if (token.size < sizeof(old_lexeme_base)){ + Cpp_Token original_token = token; + old_lexeme.size = token.size; + buffer_read_range(app, &buffer, token.start, token.start+token.size, old_lexeme.str); + + int32_t proc_body_found = 0; + bool32 still_looping = 0; + + ++token_index; + do{ + for (; token_index < stream.end; ++token_index){ + Cpp_Token *token_ptr = stream.tokens + token_index; + switch (token_ptr->type){ + case CPP_TOKEN_BRACE_OPEN: + { + proc_body_found = 1; + goto doublebreak; + }break; + + case CPP_TOKEN_BRACE_CLOSE: + case CPP_TOKEN_PARENTHESE_OPEN: + { + goto doublebreak; + }break; } + } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + doublebreak:; + + if (proc_body_found){ + + Query_Bar with; + char with_space[1024]; + with.prompt = make_lit_string("New Name: "); + with.string = make_fixed_width_string(with_space); + if (!query_user_string(app, &with)) return; + + String replace_string = with.string; + + Buffer_Edit *edits = (Buffer_Edit*)partition_current(part); + int32_t edit_max = (partition_remaining(part))/sizeof(Buffer_Edit); + int32_t edit_count = 0; + + if (edit_max >= 1){ + Buffer_Edit edit; + edit.str_start = 0; + edit.len = replace_string.size; + edit.start = original_token.start; + edit.end = original_token.start + original_token.size; + + edits[edit_count] = edit; + ++edit_count; + } + + int32_t nesting_level = 0; + int32_t closed_correctly = 0; + ++token_index; + still_looping = 0; + do{ + for (; token_index < stream.end; ++token_index){ + Cpp_Token *token_ptr = stream.tokens + token_index; + switch (token_ptr->type){ + case CPP_TOKEN_IDENTIFIER: + { + if (token_ptr->size == old_lexeme.size){ + char other_lexeme_base[128]; + String other_lexeme = make_fixed_width_string(other_lexeme_base); + other_lexeme.size = old_lexeme.size; + buffer_read_range(app, &buffer, token_ptr->start, + token_ptr->start+token_ptr->size, + other_lexeme.str); + + if (match(old_lexeme, other_lexeme)){ + Buffer_Edit edit; + edit.str_start = 0; + edit.len = replace_string.size; + edit.start = token_ptr->start; + edit.end = token_ptr->start + token_ptr->size; + + if (edit_count < edit_max){ + edits[edit_count] = edit; + ++edit_count; + } + else{ + goto doublebreak2; + } + } + } + }break; + + case CPP_TOKEN_BRACE_OPEN: + { + ++nesting_level; + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + if (nesting_level == 0){ + closed_correctly = 1; + goto doublebreak2; + } + else{ + --nesting_level; + } + }break; + } + } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + doublebreak2:; + + if (closed_correctly){ + buffer_batch_edit(app, &buffer, replace_string.str, replace_string.size, + edits, edit_count, BatchEdit_Normal); + } } + } } + } } - - end_temp_memory(temp); + } + + end_temp_memory(temp); } CUSTOM_COMMAND_SIG(write_explicit_enum_values){ - uint32_t access = AccessOpen; - View_Summary view = get_active_view(app, access); - Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); - - Partition *part = &global_part; - - Temp_Memory temp = begin_temp_memory(part); - - Cpp_Get_Token_Result result; - if (buffer_get_token_index(app, &buffer, view.cursor.pos, &result)){ - if (!result.in_whitespace){ - Cpp_Token stream_space[32]; - Stream_Tokens stream = {0}; - - if (init_stream_tokens(&stream, app, &buffer, result.token_index, stream_space, 32)){ - int32_t token_index = result.token_index; - Cpp_Token token = stream.tokens[token_index]; - - if (token.type == CPP_TOKEN_BRACE_OPEN){ - - ++token_index; - - int32_t seeker_index = token_index; - Stream_Tokens seek_stream = begin_temp_stream_token(&stream); - - bool32 closed_correctly = false; - bool32 still_looping = false; - do{ - for (; seeker_index < stream.end; ++seeker_index){ - Cpp_Token *token_seeker = stream.tokens + seeker_index; - switch (token_seeker->type){ - case CPP_TOKEN_BRACE_CLOSE: - closed_correctly = true; - goto finished_seek; - - case CPP_TOKEN_BRACE_OPEN: - goto finished_seek; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - finished_seek:; - end_temp_stream_token(&stream, seek_stream); - - if (closed_correctly){ - int32_t count_estimate = 1 + (seeker_index - token_index)/2; - - int32_t edit_count = 0; - Buffer_Edit *edits = push_array(part, Buffer_Edit, count_estimate); - - char *string_base = (char*)partition_current(part); - String string = make_string(string_base, 0, partition_remaining(part)); - - closed_correctly = false; - still_looping = false; - int32_t value = 0; - do{ - for (;token_index < stream.end; ++token_index){ - Cpp_Token *token_ptr = stream.tokens + token_index; - switch (token_ptr->type){ - case CPP_TOKEN_IDENTIFIER: - { - int32_t edit_start = token_ptr->start + token_ptr->size; - int32_t edit_stop = edit_start; - - int32_t edit_is_good = 0; - ++token_index; - do{ - for (; token_index < stream.end; ++token_index){ - token_ptr = stream.tokens + token_index; - switch (token_ptr->type){ - case CPP_TOKEN_COMMA: - { - edit_stop = token_ptr->start; - edit_is_good = 1; - goto good_edit; - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - edit_stop = token_ptr->start; - closed_correctly = 1; - edit_is_good = 1; - goto good_edit; - }break; - } - } - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - - good_edit:; - if (edit_is_good){ - int32_t str_pos = string.size; - - append(&string, " = "); - append_int_to_str(&string, value); - if (closed_correctly){ - append(&string, "\n"); - } - ++value; - - int32_t str_size = string.size - str_pos; - - Buffer_Edit edit; - edit.str_start = str_pos; - edit.len = str_size; - edit.start = edit_start; - edit.end = edit_stop; - - assert(edit_count < count_estimate); - edits[edit_count] = edit; - ++edit_count; - } - if (!edit_is_good || closed_correctly){ - goto finished; - } - }break; - - case CPP_TOKEN_BRACE_CLOSE: - { - closed_correctly = 1; - goto finished; - }break; - } - } - - still_looping = forward_stream_tokens(&stream); - }while(still_looping); - - finished:; - if (closed_correctly){ - buffer_batch_edit(app, &buffer, string_base, string.size, - edits, edit_count, BatchEdit_Normal); - } - } - } + uint32_t access = AccessOpen; + View_Summary view = get_active_view(app, access); + Buffer_Summary buffer = get_buffer(app, view.buffer_id, access); + + Partition *part = &global_part; + + Temp_Memory temp = begin_temp_memory(part); + + Cpp_Get_Token_Result result; + if (buffer_get_token_index(app, &buffer, view.cursor.pos, &result)){ + if (!result.in_whitespace){ + Cpp_Token stream_space[32]; + Stream_Tokens stream = {0}; + + if (init_stream_tokens(&stream, app, &buffer, result.token_index, stream_space, 32)){ + int32_t token_index = result.token_index; + Cpp_Token token = stream.tokens[token_index]; + + if (token.type == CPP_TOKEN_BRACE_OPEN){ + + ++token_index; + + int32_t seeker_index = token_index; + Stream_Tokens seek_stream = begin_temp_stream_token(&stream); + + bool32 closed_correctly = false; + bool32 still_looping = false; + do{ + for (; seeker_index < stream.end; ++seeker_index){ + Cpp_Token *token_seeker = stream.tokens + seeker_index; + switch (token_seeker->type){ + case CPP_TOKEN_BRACE_CLOSE: + closed_correctly = true; + goto finished_seek; + + case CPP_TOKEN_BRACE_OPEN: + goto finished_seek; + } } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + finished_seek:; + end_temp_stream_token(&stream, seek_stream); + + if (closed_correctly){ + int32_t count_estimate = 1 + (seeker_index - token_index)/2; + + int32_t edit_count = 0; + Buffer_Edit *edits = push_array(part, Buffer_Edit, count_estimate); + + char *string_base = (char*)partition_current(part); + String string = make_string(string_base, 0, partition_remaining(part)); + + closed_correctly = false; + still_looping = false; + int32_t value = 0; + do{ + for (;token_index < stream.end; ++token_index){ + Cpp_Token *token_ptr = stream.tokens + token_index; + switch (token_ptr->type){ + case CPP_TOKEN_IDENTIFIER: + { + int32_t edit_start = token_ptr->start + token_ptr->size; + int32_t edit_stop = edit_start; + + int32_t edit_is_good = 0; + ++token_index; + do{ + for (; token_index < stream.end; ++token_index){ + token_ptr = stream.tokens + token_index; + switch (token_ptr->type){ + case CPP_TOKEN_COMMA: + { + edit_stop = token_ptr->start; + edit_is_good = 1; + goto good_edit; + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + edit_stop = token_ptr->start; + closed_correctly = 1; + edit_is_good = 1; + goto good_edit; + }break; + } + } + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + + good_edit:; + if (edit_is_good){ + int32_t str_pos = string.size; + + append(&string, " = "); + append_int_to_str(&string, value); + if (closed_correctly){ + append(&string, "\n"); + } + ++value; + + int32_t str_size = string.size - str_pos; + + Buffer_Edit edit; + edit.str_start = str_pos; + edit.len = str_size; + edit.start = edit_start; + edit.end = edit_stop; + + assert(edit_count < count_estimate); + edits[edit_count] = edit; + ++edit_count; + } + if (!edit_is_good || closed_correctly){ + goto finished; + } + }break; + + case CPP_TOKEN_BRACE_CLOSE: + { + closed_correctly = 1; + goto finished; + }break; + } + } + + still_looping = forward_stream_tokens(&stream); + }while(still_looping); + + finished:; + if (closed_correctly){ + buffer_batch_edit(app, &buffer, string_base, string.size, + edits, edit_count, BatchEdit_Normal); + } + } } + } } - - end_temp_memory(temp); + } + + end_temp_memory(temp); } CUSTOM_COMMAND_SIG(punishment){ - Theme_Color colors[4]; - colors[0].tag = Stag_Back; - colors[1].tag = Stag_Margin; - colors[2].tag = Stag_Margin_Hover; - colors[3].tag = Stag_Margin_Active; - get_theme_colors(app, colors, 4); - - for (uint32_t i = 0; i < 4; ++i){ - int_color color = colors[i].color; - uint8_t *c = (uint8_t*)(&color); - c[0] = 0xFF - c[0]; - c[1] = 0xFF - c[1]; - c[2] = 0xFF - c[2]; - c[3] = 0xFF - c[3]; - colors[i].color = color; - } - - set_theme_colors(app, colors, 4); + Theme_Color colors[4]; + colors[0].tag = Stag_Back; + colors[1].tag = Stag_Margin; + colors[2].tag = Stag_Margin_Hover; + colors[3].tag = Stag_Margin_Active; + get_theme_colors(app, colors, 4); + + for (uint32_t i = 0; i < 4; ++i){ + int_color color = colors[i].color; + uint8_t *c = (uint8_t*)(&color); + c[0] = 0xFF - c[0]; + c[1] = 0xFF - c[1]; + c[2] = 0xFF - c[2]; + c[3] = 0xFF - c[3]; + colors[i].color = color; + } + + set_theme_colors(app, colors, 4); } extern "C" int32_t get_bindings(void *data, int32_t size){ - Bind_Helper context_ = begin_bind_helper(data, size); - Bind_Helper *context = &context_; - - set_hook(context, hook_view_size_change, default_view_adjust); - - set_start_hook(context, default_start); - set_open_file_hook(context, default_file_settings); - set_new_file_hook(context, default_new_file); - set_save_file_hook(context, default_file_save); - set_end_file_hook(context, end_file_close_jump_list); - - set_input_filter(context, default_suppress_mouse_filter); - set_command_caller(context, default_command_caller); - - set_scroll_rule(context, smooth_scroll_rule); - - default_keys(context); - - // NOTE(allen|a4.0.6): Command maps can be opened more than - // once so that you can extend existing maps very easily. - // You can also use the helper "restart_map" instead of - // begin_map to clear everything that was in the map and - // bind new things instead. - begin_map(context, mapid_global); - end_map(context); - - begin_map(context, mapid_file); - bind(context, 's', MDFR_CTRL, punishment); - bind(context, 's', MDFR_ALT, save); - - bind(context, 'k', MDFR_ALT, kill_rect); - bind(context, ' ', MDFR_ALT | MDFR_CTRL, multi_line_edit); - - bind(context, key_page_up, MDFR_ALT, miblo_increment_time_stamp); - bind(context, key_page_down, MDFR_ALT, miblo_decrement_time_stamp); - - bind(context, key_home, MDFR_ALT, miblo_increment_time_stamp_minute); - bind(context, key_end, MDFR_ALT, miblo_decrement_time_stamp_minute); - - end_map(context); - - begin_map(context, default_code_map); - bind(context, '[', MDFR_ALT, highlight_surrounding_scope); - bind(context, ']', MDFR_ALT, highlight_prev_scope_absolute); - bind(context, '\'', MDFR_ALT, highlight_next_scope_absolute); - - bind(context, '/', MDFR_ALT, place_in_scope); - bind(context, '-', MDFR_ALT, delete_current_scope); - bind(context, 'j', MDFR_ALT, scope_absorb_down); - - bind(context, key_insert, MDFR_CTRL, write_explicit_enum_values); - bind(context, 'p', MDFR_ALT, rename_parameter); - end_map(context); - - BIND_4CODER_TESTS(context); - - int32_t result = end_bind_helper(context); - return(result); + Bind_Helper context_ = begin_bind_helper(data, size); + Bind_Helper *context = &context_; + + set_hook(context, hook_view_size_change, default_view_adjust); + + set_start_hook(context, default_start); + set_open_file_hook(context, default_file_settings); + set_new_file_hook(context, default_new_file); + set_save_file_hook(context, default_file_save); + set_end_file_hook(context, end_file_close_jump_list); + + set_input_filter(context, default_suppress_mouse_filter); + set_command_caller(context, default_command_caller); + + set_scroll_rule(context, smooth_scroll_rule); + + default_keys(context); + + // NOTE(allen|a4.0.6): Command maps can be opened more than + // once so that you can extend existing maps very easily. + // You can also use the helper "restart_map" instead of + // begin_map to clear everything that was in the map and + // bind new things instead. + begin_map(context, mapid_global); + end_map(context); + + begin_map(context, mapid_file); + bind(context, 's', MDFR_CTRL, punishment); + bind(context, 's', MDFR_ALT, save); + + bind(context, 'k', MDFR_ALT, kill_rect); + bind(context, ' ', MDFR_ALT | MDFR_CTRL, multi_line_edit); + + bind(context, key_page_up, MDFR_ALT, miblo_increment_time_stamp); + bind(context, key_page_down, MDFR_ALT, miblo_decrement_time_stamp); + + bind(context, key_home, MDFR_ALT, miblo_increment_time_stamp_minute); + bind(context, key_end, MDFR_ALT, miblo_decrement_time_stamp_minute); + + end_map(context); + + begin_map(context, default_code_map); + bind(context, '[', MDFR_ALT, highlight_surrounding_scope); + bind(context, ']', MDFR_ALT, highlight_prev_scope_absolute); + bind(context, '\'', MDFR_ALT, highlight_next_scope_absolute); + + bind(context, '/', MDFR_ALT, place_in_scope); + bind(context, '-', MDFR_ALT, delete_current_scope); + bind(context, 'j', MDFR_ALT, scope_absorb_down); + + bind(context, key_insert, MDFR_CTRL, write_explicit_enum_values); + bind(context, 'p', MDFR_ALT, rename_parameter); + end_map(context); + + BIND_4CODER_TESTS(context); + + int32_t result = end_bind_helper(context); + return(result); } #endif diff --git a/power/custom_4coder.so b/power/custom_4coder.so deleted file mode 100755 index 3339169f2904fd9ab8382b5f517df69c5eec877c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272828 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 diff --git a/readlink_f_simulator.sh b/readlink_f_simulator.sh deleted file mode 100755 index 13f47935..00000000 --- a/readlink_f_simulator.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh - diff --git a/site/source_material/tutorials.txt b/site/source_material/tutorials.txt index 5ba72683..c96864da 100644 --- a/site/source_material/tutorials.txt +++ b/site/source_material/tutorials.txt @@ -15,6 +15,10 @@ Extending your project with a project.4coder file: \VIDEO{youtube:https://www.youtube.com/embed/iZLtS3IoatE} +Using customizable keywords in the 4coder custom API: + +\VIDEO{youtube:https://www.youtube.com/watch?v=qoEvc4uC9Uw} + More tutorials coming soon.