1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | //===-- CommandHistory.cpp --------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <inttypes.h> #include "lldb/Interpreter/CommandHistory.h" using namespace lldb; using namespace lldb_private; CommandHistory::CommandHistory() : m_mutex(), m_history() {} CommandHistory::~CommandHistory() {} size_t CommandHistory::GetSize() const { std::lock_guard<std::recursive_mutex> guard(m_mutex); return m_history.size(); } bool CommandHistory::IsEmpty() const { std::lock_guard<std::recursive_mutex> guard(m_mutex); return m_history.empty(); } llvm::Optional<llvm::StringRef> CommandHistory::FindString(llvm::StringRef input_str) const { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (input_str.size() < 2) return llvm::None; if (input_str[0] != g_repeat_char) return llvm::None; if (input_str[1] == g_repeat_char) { if (m_history.empty()) return llvm::None; return llvm::StringRef(m_history.back()); } input_str = input_str.drop_front(); size_t idx = 0; if (input_str.front() == '-') { if (input_str.drop_front(1).getAsInteger(0, idx)) return llvm::None; if (idx >= m_history.size()) return llvm::None; idx = m_history.size() - idx; } else { if (input_str.getAsInteger(0, idx)) return llvm::None; if (idx >= m_history.size()) return llvm::None; } return llvm::StringRef(m_history[idx]); } llvm::StringRef CommandHistory::GetStringAtIndex(size_t idx) const { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (idx < m_history.size()) return m_history[idx]; return ""; } llvm::StringRef CommandHistory::operator[](size_t idx) const { return GetStringAtIndex(idx); } llvm::StringRef CommandHistory::GetRecentmostString() const { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (m_history.empty()) return ""; return m_history.back(); } void CommandHistory::AppendString(llvm::StringRef str, bool reject_if_dupe) { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (reject_if_dupe) { if (!m_history.empty()) { if (str == m_history.back()) return; } } m_history.push_back(str); } void CommandHistory::Clear() { std::lock_guard<std::recursive_mutex> guard(m_mutex); m_history.clear(); } void CommandHistory::Dump(Stream &stream, size_t start_idx, size_t stop_idx) const { std::lock_guard<std::recursive_mutex> guard(m_mutex); stop_idx = std::min(stop_idx + 1, m_history.size()); for (size_t counter = start_idx; counter < stop_idx; counter++) { const std::string hist_item = m_history[counter]; if (!hist_item.empty()) { stream.Indent(); stream.Printf("%4" PRIu64 ": %s\n", (uint64_t)counter, hist_item.c_str()); } } } |