diff --git a/lib/libimhex/include/hex/providers/buffered_reader.hpp b/lib/libimhex/include/hex/providers/buffered_reader.hpp index 41e543473..025c23930 100644 --- a/lib/libimhex/include/hex/providers/buffered_reader.hpp +++ b/lib/libimhex/include/hex/providers/buffered_reader.hpp @@ -110,6 +110,11 @@ namespace hex::prv { friend bool operator== (const Iterator& left, const Iterator& right) { return left.m_address == right.m_address; }; friend bool operator!= (const Iterator& left, const Iterator& right) { return left.m_address != right.m_address; }; + friend bool operator> (const Iterator& left, const Iterator& right) { return left.m_address > right.m_address; }; + friend bool operator< (const Iterator& left, const Iterator& right) { return left.m_address < right.m_address; }; + friend bool operator>= (const Iterator& left, const Iterator& right) { return left.m_address >= right.m_address; }; + friend bool operator<= (const Iterator& left, const Iterator& right) { return left.m_address <= right.m_address; }; + private: BufferedReader *m_reader; u64 m_address; @@ -176,10 +181,14 @@ namespace hex::prv { friend bool operator== (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address == right.m_address; }; friend bool operator!= (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address != right.m_address; }; + friend bool operator> (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address > right.m_address; }; + friend bool operator< (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address < right.m_address; }; + friend bool operator>= (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address >= right.m_address; }; + friend bool operator<= (const ReverseIterator& left, const ReverseIterator& right) { return left.m_address <= right.m_address; }; private: BufferedReader *m_reader; - u64 m_address; + u64 m_address = 0x00; }; Iterator begin() { @@ -187,7 +196,7 @@ namespace hex::prv { } Iterator end() { - return { this, this->m_baseAddress + this->m_provider->getActualSize() }; + return { this, this->m_provider->getActualSize() }; } ReverseIterator rbegin() { diff --git a/plugins/builtin/source/content/views/view_hex_editor.cpp b/plugins/builtin/source/content/views/view_hex_editor.cpp index 455dad43f..baa800058 100644 --- a/plugins/builtin/source/content/views/view_hex_editor.cpp +++ b/plugins/builtin/source/content/views/view_hex_editor.cpp @@ -133,8 +133,8 @@ namespace hex::plugin::builtin { searchSequence.clear(); std::copy(this->m_input.begin(), this->m_input.end(), std::back_inserter(searchSequence)); - // Remove null termination - searchSequence.pop_back(); + if (searchSequence.back() == 0x00) + searchSequence.pop_back(); } ImGui::EndTabItem(); @@ -144,9 +144,9 @@ namespace hex::plugin::builtin { } if (!this->m_searchRunning && !searchSequence.empty() && this->m_shouldSearch) { + this->m_searchRunning = true; std::thread([this, searchSequence, editor]{ - this->m_searchTask = ImHexApi::Tasks::createTask("Searching", ImHexApi::Provider::get()->getSize()); - this->m_searchRunning = true; + auto task = ImHexApi::Tasks::createTask("Searching", ImHexApi::Provider::get()->getSize()); if (auto region = this->findSequence(editor, searchSequence, this->m_backwards); region.has_value()) { ImHexApi::Tasks::doLater([editor, region]{ @@ -181,15 +181,20 @@ namespace hex::plugin::builtin { this->m_searchPosition.reset(); } - if (ImGui::IconButton(ICON_VS_ARROW_UP "##up", ButtonColor, ButtonSize)) { - this->m_shouldSearch = true; - this->m_backwards = true; - } - ImGui::SameLine(); - if (ImGui::IconButton(ICON_VS_ARROW_DOWN "##down", ButtonColor, ButtonSize)) { - this->m_shouldSearch = true; - this->m_backwards = false; + ImGui::BeginDisabled(!this->m_searchPosition.has_value()); + { + if (ImGui::IconButton(ICON_VS_ARROW_UP "##up", ButtonColor, ButtonSize)) { + this->m_shouldSearch = true; + this->m_backwards = true; + } + ImGui::SameLine(); + if (ImGui::IconButton(ICON_VS_ARROW_DOWN "##down", ButtonColor, ButtonSize)) { + this->m_shouldSearch = true; + this->m_backwards = false; + } } + + ImGui::EndDisabled(); } ImGui::EndDisabled(); } @@ -200,7 +205,7 @@ namespace hex::plugin::builtin { if (!editor->isSelectionValid()) reader.seek(this->m_searchPosition.value_or(0x00)); else - reader.seek(this->m_searchPosition.value_or(editor->getSelection().getEndAddress())); + reader.seek(this->m_searchPosition.value_or(editor->getSelection().getStartAddress())); constexpr static auto searchFunction = [](const auto &haystackBegin, const auto &haystackEnd, const auto &needleBegin, const auto &needleEnd) { return std::search(haystackBegin, haystackEnd, std::boyer_moore_horspool_searcher(needleBegin, needleEnd)); @@ -209,13 +214,17 @@ namespace hex::plugin::builtin { if (!backwards) { auto occurrence = searchFunction(reader.begin(), reader.end(), sequence.begin(), sequence.end()); if (occurrence != reader.end()) { - this->m_searchPosition = occurrence.getAddress() + 1; + this->m_searchPosition = occurrence.getAddress() + sequence.size(); return Region { occurrence.getAddress(), sequence.size() }; } } else { auto occurrence = searchFunction(reader.rbegin(), reader.rend(), sequence.begin(), sequence.end()); if (occurrence != reader.rend()) { - this->m_searchPosition = occurrence.getAddress() - 1; + if (occurrence.getAddress() < sequence.size()) + this->m_searchPosition = 0x00; + else + this->m_searchPosition = occurrence.getAddress() - sequence.size(); + return Region { occurrence.getAddress(), sequence.size() }; } } @@ -230,7 +239,6 @@ namespace hex::plugin::builtin { std::atomic m_shouldSearch = false; std::atomic m_backwards = false; - std::optional m_searchTask; std::atomic m_searchRunning = false; }; @@ -926,6 +934,7 @@ namespace hex::plugin::builtin { auto newSelection = this->getSelection(); newSelection.address -= pageAddress; + provider->setCurrentPage(provider->getPageOfAddress(pageAddress).value_or(0)); ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + (static_cast(newSelection.getStartAddress()) / this->m_bytesPerRow) * CharacterSize.y, 0.5); }