aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee
diff options
context:
space:
mode:
authorcodesoap <codesoap@mailbox.org>2020-12-12 23:18:27 +0100
committercodesoap <codesoap@mailbox.org>2020-12-13 14:47:07 +0100
commitf2ad539f5fc150b74341e2ee023592c406f13592 (patch)
tree693813b85e3e5f883d4a01cb301123219b4b8ba4 /contrib/epee
parentMerge pull request #7102 (diff)
downloadmonero-f2ad539f5fc150b74341e2ee023592c406f13592.tar.xz
readline_buffer: Avoid consecutive duplicates in the history
Diffstat (limited to 'contrib/epee')
-rw-r--r--contrib/epee/src/readline_buffer.cpp18
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;