diff options
author | codesoap <codesoap@mailbox.org> | 2020-12-12 23:18:27 +0100 |
---|---|---|
committer | codesoap <codesoap@mailbox.org> | 2020-12-13 14:47:07 +0100 |
commit | f2ad539f5fc150b74341e2ee023592c406f13592 (patch) | |
tree | 693813b85e3e5f883d4a01cb301123219b4b8ba4 /contrib | |
parent | Merge pull request #7102 (diff) | |
download | monero-f2ad539f5fc150b74341e2ee023592c406f13592.tar.xz |
readline_buffer: Avoid consecutive duplicates in the history
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/epee/src/readline_buffer.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/contrib/epee/src/readline_buffer.cpp b/contrib/epee/src/readline_buffer.cpp index bcf499963..1047d1696 100644 --- a/contrib/epee/src/readline_buffer.cpp +++ b/contrib/epee/src/readline_buffer.cpp @@ -6,6 +6,7 @@ #include <boost/thread/lock_guard.hpp> #include <boost/algorithm/string.hpp> +static bool same_as_last_line(const std::string&); static void install_line_handler(); static void remove_line_handler(); @@ -175,8 +176,11 @@ static void handle_line(char* line) boost::trim_right(test_line); if(!test_line.empty()) { - add_history(test_line.c_str()); - history_set_pos(history_length); + if (!same_as_last_line(test_line)) + { + add_history(test_line.c_str()); + history_set_pos(history_length); + } if (test_line == "exit" || test_line == "q") exit = true; } @@ -192,6 +196,16 @@ static void handle_line(char* line) return; } +// same_as_last_line returns true, if the last line in the history is +// equal to test_line. +static bool same_as_last_line(const std::string& test_line) +{ + // Note that state->offset == state->length, when a new line was entered. + HISTORY_STATE* state = history_get_history_state(); + return state->length > 0 + && test_line.compare(state->entries[state->length-1]->line) == 0; +} + static char* completion_matches(const char* text, int state) { static size_t list_index; |