aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectCommands.cpp
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2013-06-17 22:51:50 +0000
committerEnrico Granata <egranata@apple.com>2013-06-17 22:51:50 +0000
commit7594f14f7d685c0347d32aab9e10f19f1aabbc41 (patch)
tree4968fa055cec683086b3006bb66fb54c0170299a /lldb/source/Commands/CommandObjectCommands.cpp
parent2dcbdc0606b5eeec43bf13c79f0116979b37c1f7 (diff)
downloadllvm-7594f14f7d685c0347d32aab9e10f19f1aabbc41.zip
llvm-7594f14f7d685c0347d32aab9e10f19f1aabbc41.tar.gz
llvm-7594f14f7d685c0347d32aab9e10f19f1aabbc41.tar.bz2
<rdar://problem/14134716>
This is a rewrite of the command history facility of LLDB It takes the history management out of the CommandInterpreter into its own CommandHistory class It reimplements the command history command to allow more combinations of options to work correctly (e.g. com hist -c 1 -s 5) It adds a new --wipe (-w) option to command history to allow clearing the history on demand It extends the lldbtest runCmd: and expect: methods to allow adding commands to history if need be It adds a test case for the reimplemented facility llvm-svn: 184140
Diffstat (limited to 'lldb/source/Commands/CommandObjectCommands.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectCommands.cpp130
1 files changed, 106 insertions, 24 deletions
diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp
index 737a449..3e46041 100644
--- a/lldb/source/Commands/CommandObjectCommands.cpp
+++ b/lldb/source/Commands/CommandObjectCommands.cpp
@@ -22,10 +22,12 @@
#include "lldb/Core/InputReaderEZ.h"
#include "lldb/Core/StringList.h"
#include "lldb/Interpreter/Args.h"
+#include "lldb/Interpreter/CommandHistory.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandObjectRegexCommand.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Interpreter/OptionValueBoolean.h"
+#include "lldb/Interpreter/OptionValueUInt64.h"
#include "lldb/Interpreter/Options.h"
#include "lldb/Interpreter/ScriptInterpreter.h"
#include "lldb/Interpreter/ScriptInterpreterPython.h"
@@ -64,7 +66,11 @@ protected:
public:
CommandOptions (CommandInterpreter &interpreter) :
- Options (interpreter)
+ Options (interpreter),
+ m_start_idx(0),
+ m_stop_idx(0),
+ m_count(0),
+ m_wipe(false)
{
}
@@ -76,27 +82,27 @@ protected:
{
Error error;
const int short_option = m_getopt_table[option_idx].val;
- bool success;
switch (short_option)
{
case 'c':
- m_end_idx = Args::StringToUInt32(option_arg, UINT_MAX, 0, &success);
- if (!success)
- error.SetErrorStringWithFormat("invalid value for count: %s", option_arg);
- if (m_end_idx != 0)
- m_end_idx--;
- m_start_idx = 0;
+ error = m_count.SetValueFromCString(option_arg,eVarSetOperationAssign);
+ break;
+ case 's':
+ if (option_arg && strcmp("end", option_arg) == 0)
+ {
+ m_start_idx.SetCurrentValue(UINT64_MAX);
+ m_start_idx.SetOptionWasSet();
+ }
+ else
+ error = m_start_idx.SetValueFromCString(option_arg,eVarSetOperationAssign);
break;
case 'e':
- m_end_idx = Args::StringToUInt32(option_arg, 0, 0, &success);
- if (!success)
- error.SetErrorStringWithFormat("invalid value for end index: %s", option_arg);
+ error = m_stop_idx.SetValueFromCString(option_arg,eVarSetOperationAssign);
break;
- case 's':
- m_start_idx = Args::StringToUInt32(option_arg, 0, 0, &success);
- if (!success)
- error.SetErrorStringWithFormat("invalid value for start index: %s", option_arg);
+ case 'w':
+ m_wipe.SetCurrentValue(true);
+ m_wipe.SetOptionWasSet();
break;
default:
error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
@@ -109,8 +115,10 @@ protected:
void
OptionParsingStarting ()
{
- m_start_idx = 0;
- m_end_idx = UINT_MAX;
+ m_start_idx.Clear();
+ m_stop_idx.Clear();
+ m_count.Clear();
+ m_wipe.Clear();
}
const OptionDefinition*
@@ -125,17 +133,90 @@ protected:
// Instance variables to hold the values for command options.
- uint32_t m_start_idx;
- uint32_t m_end_idx;
+ OptionValueUInt64 m_start_idx;
+ OptionValueUInt64 m_stop_idx;
+ OptionValueUInt64 m_count;
+ OptionValueBoolean m_wipe;
};
bool
DoExecute (Args& command, CommandReturnObject &result)
{
-
- m_interpreter.DumpHistory (result.GetOutputStream(),
- m_options.m_start_idx,
- m_options.m_end_idx);
+ if (m_options.m_wipe.GetCurrentValue() && m_options.m_wipe.OptionWasSet())
+ {
+ m_interpreter.GetCommandHistory().Clear();
+ result.SetStatus(lldb::eReturnStatusSuccessFinishNoResult);
+ }
+ else
+ {
+ if (m_options.m_start_idx.OptionWasSet() && m_options.m_stop_idx.OptionWasSet() && m_options.m_count.OptionWasSet())
+ {
+ result.AppendError("--count, --start-index and --end-index cannot be all specified in the same invocation");
+ result.SetStatus(lldb::eReturnStatusFailed);
+ }
+ else
+ {
+ std::pair<bool,uint64_t> start_idx = {m_options.m_start_idx.OptionWasSet(),m_options.m_start_idx.GetCurrentValue()};
+ std::pair<bool,uint64_t> stop_idx = {m_options.m_stop_idx.OptionWasSet(),m_options.m_stop_idx.GetCurrentValue()};
+ std::pair<bool,uint64_t> count = {m_options.m_count.OptionWasSet(),m_options.m_count.GetCurrentValue()};
+
+ const CommandHistory& history(m_interpreter.GetCommandHistory());
+
+ if (start_idx.first && start_idx.second == UINT64_MAX)
+ {
+ if (count.first)
+ {
+ start_idx.second = history.GetSize() - count.second;
+ stop_idx.second = history.GetSize() - 1;
+ }
+ else if (stop_idx.first)
+ {
+ start_idx.second = stop_idx.second;
+ stop_idx.second = history.GetSize() - 1;
+ }
+ else
+ {
+ start_idx.second = 0;
+ stop_idx.second = history.GetSize() - 1;
+ }
+ }
+ else
+ {
+ if (!start_idx.first && !stop_idx.first && !count.first)
+ {
+ start_idx.second = 0;
+ stop_idx.second = history.GetSize() - 1;
+ }
+ else if (start_idx.first)
+ {
+ if (count.first)
+ {
+ stop_idx.second = start_idx.second + count.second - 1;
+ }
+ else if (!stop_idx.first)
+ {
+ stop_idx.second = history.GetSize() - 1;
+ }
+ }
+ else if (stop_idx.first)
+ {
+ if (count.first)
+ {
+ if (stop_idx.second >= count.second)
+ start_idx.second = stop_idx.second - count.second + 1;
+ else
+ start_idx.second = 0;
+ }
+ }
+ else /* if (count.first) */
+ {
+ start_idx.second = 0;
+ stop_idx.second = count.second - 1;
+ }
+ }
+ history.Dump(result.GetOutputStream(), start_idx.second, stop_idx.second);
+ }
+ }
return result.Succeeded();
}
@@ -147,8 +228,9 @@ OptionDefinition
CommandObjectCommandsHistory::CommandOptions::g_option_table[] =
{
{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, eArgTypeUnsignedInteger, "How many history commands to print."},
-{ LLDB_OPT_SET_1, false, "start-index", 's', required_argument, NULL, 0, eArgTypeUnsignedInteger, "Index at which to start printing history commands."},
+{ LLDB_OPT_SET_1, false, "start-index", 's', required_argument, NULL, 0, eArgTypeUnsignedInteger, "Index at which to start printing history commands (or end to mean tail mode)."},
{ LLDB_OPT_SET_1, false, "end-index", 'e', required_argument, NULL, 0, eArgTypeUnsignedInteger, "Index at which to stop printing history commands."},
+{ LLDB_OPT_SET_2, false, "wipe", 'w', no_argument, NULL, 0, eArgTypeBoolean, "Clears the current command history."},
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};