From 7f8b22ff436adb310310789bab49f859e0262cb3 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 9 Aug 2024 17:28:50 +0200 Subject: [PATCH] Search back --- build_file.cpp | 5 +- src/text_editor/commands_clipboard.cpp | 3 +- src/text_editor/commands_window.cpp | 67 +++++++++++++------------- src/text_editor/lua_api.cpp | 14 +++++- src/text_editor/management.cpp | 1 - src/text_editor/text_editor.h | 1 + src/text_editor/title_bar.cpp | 3 -- src/text_editor/todo.txt | 2 +- 8 files changed, 51 insertions(+), 45 deletions(-) diff --git a/build_file.cpp b/build_file.cpp index 8b3b59f..aae1847 100644 --- a/build_file.cpp +++ b/build_file.cpp @@ -24,9 +24,8 @@ void AddCommonFlags(Array *cmd) { if (Profile == PROFILE_DEBUG) { cmd->add("-DDEBUG_BUILD=1"); cmd->add("-DRELEASE_BUILD=0"); - cmd->add("-fsanitize=address"); - cmd->add("-DUSE_ADDRESS_SANITIZER"); - cmd->add("-D_DEBUG"); + // cmd->add("-fsanitize=address"); + // cmd->add("-DUSE_ADDRESS_SANITIZER"); // cmd->add("/MDd"); } else { cmd->add("-DDEBUG_BUILD=0"); diff --git a/src/text_editor/commands_clipboard.cpp b/src/text_editor/commands_clipboard.cpp index 0d69ef2..db7eb20 100644 --- a/src/text_editor/commands_clipboard.cpp +++ b/src/text_editor/commands_clipboard.cpp @@ -19,7 +19,8 @@ void MakeSureToUseSystemAllocator_SaveInClipboard(String16 string, Arraycarets[first_caret_index], &view->carets[0]); } -Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next = false) { - Int pos = caret.range.min; +Caret FindPrev(Buffer *buffer, String16 needle, Caret caret) { + Int pos = GetFront(caret); + String16 medium = GetString(*buffer, {0, pos}); + + Caret result = caret; + Int index = 0; + if (Seek(medium, needle, &index, SeekFlag_MatchFindLast)) { + result = MakeCaret(index, index + needle.len); + } else { + medium = GetString(*buffer); + if (Seek(medium, needle, &index, SeekFlag_MatchFindLast)) { + result = MakeCaret(index, index + needle.len); + } + } + + return result; +} + +Caret FindNext(Buffer *buffer, String16 needle, Caret caret) { + Int pos = GetFront(caret); String16 medium = GetString(*buffer, {pos, INT64_MAX}); - Caret result = {}; + Caret result = caret; Int index = 0; if (Seek(medium, needle, &index)) { result = MakeCaret(pos + index + needle.len, pos + index); @@ -540,27 +558,6 @@ Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next } } - if (find_next && AreEqual(result, caret)) { - caret.range.min = Clamp(*buffer, caret.range.min + 1); - caret.range.max = Clamp(*buffer, caret.range.max + 1); - result = FindInBuffer(buffer, needle, caret, false); - } - - return result; -} - -Array FindAllInBuffer(Allocator allocator, Buffer *buffer, String16 needle) { - Array result = {allocator}; - String16 string_buffer = GetString(*buffer); - for (Int pos = 0;;) { - Int index = 0; - String16 medium = Skip(string_buffer, pos); - if (!Seek(medium, needle, &index)) { - break; - } - Add(&result, Rng(pos + index, pos + index + needle.len)); - pos += needle.len; - } return result; } @@ -580,9 +577,11 @@ void Command_IdentedNewLine(View *view) { EndEdit(buffer, &edits, &view->carets); } -void Command_FindNext(View *seek_view, String16 needle) { - Buffer *seek_buffer = GetBuffer(seek_view->active_buffer); - Caret caret = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true); +void Command_Find(View *seek_view, String16 needle, bool forward = true) { + Buffer *seek_buffer = GetBuffer(seek_view->active_buffer); + Caret caret = seek_view->carets[0]; + if (forward) caret = FindNext(seek_buffer, needle, caret); + if (!forward) caret = FindPrev(seek_buffer, needle, caret); seek_view->carets.len = 1; seek_view->carets[0] = caret; } @@ -756,21 +755,21 @@ void WindowCommand(Event event, Window *window, View *view) { if (Ctrl(SDLK_D)) { String16 string = GetString(*buffer, view->carets[0].range); - Caret caret = FindInBuffer(buffer, string, view->carets[0], true); + Caret caret = FindNext(buffer, string, view->carets[0]); Insert(&view->carets, caret, 0); MergeCarets(view); } if (Ctrl(SDLK_F3)) { - Buffer *search_buffer = GetBuffer(SearchBufferID); - String16 search_string = GetString(*search_buffer); - Caret caret = FindInBuffer(buffer, search_string, view->carets[0], true); + Scratch scratch; + String16 search_string = ToString16(scratch, window->search_string); + Caret caret = FindNext(buffer, search_string, view->carets[0]); Insert(&view->carets, caret, 0); MergeCarets(view); } else if (Press(SDLK_F3)) { - Buffer *search_buffer = GetBuffer(SearchBufferID); - String16 search_string = GetString(*search_buffer); - Caret caret = FindInBuffer(buffer, search_string, view->carets[0], true); + Scratch scratch; + String16 search_string = ToString16(scratch, window->search_string); + Caret caret = FindNext(buffer, search_string, view->carets[0]); view->carets.len = 1; view->carets[0] = caret; } diff --git a/src/text_editor/lua_api.cpp b/src/text_editor/lua_api.cpp index f771f8d..3feff31 100644 --- a/src/text_editor/lua_api.cpp +++ b/src/text_editor/lua_api.cpp @@ -207,10 +207,19 @@ int LuaSearch(lua_State *L) { Window *seek_window = GetCurrentWindow(); seek_window->search_string = lua_tostring(L, 1); lua_pop(L, 1); - View *seek_view = GetView(seek_window->active_view); Scratch scratch; - Command_FindNext(seek_view, ToString16(scratch, seek_window->search_string)); + Command_Find(seek_view, ToString16(scratch, seek_window->search_string), true); + return 0; +} + +int LuaSearchB(lua_State *L) { + Window *seek_window = GetCurrentWindow(); + seek_window->search_string = lua_tostring(L, 1); + lua_pop(L, 1); + View *seek_view = GetView(seek_window->active_view); + Scratch scratch; + Command_Find(seek_view, ToString16(scratch, seek_window->search_string), false); return 0; } @@ -237,6 +246,7 @@ luaL_Reg LuaFunctions[] = { { "AppendC", LuaAppendCmd}, { "OpenFilesHere", LuaOpenFilesHere}, { "Search", LuaSearch}, + { "SearchB", LuaSearchB}, { NULL, NULL}, }; diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 57c6922..1ad6d47 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -16,7 +16,6 @@ WindowID ConsoleWindowID; ViewID ConsoleViewID; BufferID DebugBufferID; -BufferID SearchBufferID; // @note: // Remember that WindowCommand works on window handed it down from HandleEvent diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 6390c0a..392b03c 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -77,6 +77,7 @@ struct Window { Array goto_history; Array goto_redo; + // @todo: consider making this String16 String search_string; double mouse_scroller_offset; diff --git a/src/text_editor/title_bar.cpp b/src/text_editor/title_bar.cpp index eb9109f..9686c92 100644 --- a/src/text_editor/title_bar.cpp +++ b/src/text_editor/title_bar.cpp @@ -101,7 +101,6 @@ void ReplaceTitleBarData(Window *window) { if (buffer->change_id != window->title_bar_last_buffer_change_id) { ApplyTitleBarChangesToWindow(window, view, buffer); } - return; } Window *last_window = GetWindow(window->title_bar_window); @@ -125,8 +124,6 @@ void ReplaceTitleBarData(Window *window) { AdjustCarets(edits, &caret_copy); } - // String search_string = last_window->search_string; - // if (search_string.len) search_string = Format(scratch, " /%.*s", FmtString(search_string)); String s = Format(scratch, "%.*s:%lld:%lld", FmtString(last_buffer->name), (long long)xy.line + 1ll, (long long)xy.col + 1ll); String16 string = ToString16(scratch, s); String16 string_to_replace = GetString(*buffer, replace_range); diff --git a/src/text_editor/todo.txt b/src/text_editor/todo.txt index eadb9c5..142b600 100644 --- a/src/text_editor/todo.txt +++ b/src/text_editor/todo.txt @@ -1,6 +1,6 @@ - Remove pointers and use ViewIDs (enable array debug while doing this) -- search as a command to execute which is going to be in the title bar +- ctrl + f - should find Search and select content or add Search - search backwards - some split selection commands - assign commands or lua functions to F1-F8 keys