summaryrefslogtreecommitdiffstats
path: root/lldb/source/Interpreter/CommandInterpreter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Interpreter/CommandInterpreter.cpp')
-rw-r--r--lldb/source/Interpreter/CommandInterpreter.cpp217
1 files changed, 107 insertions, 110 deletions
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index f2eec88ccf4..5cb2eaddf7b 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -1325,61 +1325,63 @@ CommandObject *CommandInterpreter::BuildAliasResult(
alias_cmd_obj = GetCommandObject(alias_name);
StreamString result_str;
- if (alias_cmd_obj && alias_cmd_obj->IsAlias()) {
- std::pair<CommandObjectSP, OptionArgVectorSP> desugared =
- ((CommandAlias *)alias_cmd_obj)->Desugar();
- OptionArgVectorSP option_arg_vector_sp = desugared.second;
- alias_cmd_obj = desugared.first.get();
- std::string alias_name_str = alias_name;
- if ((cmd_args.GetArgumentCount() == 0) ||
- (alias_name_str.compare(cmd_args.GetArgumentAtIndex(0)) != 0))
- cmd_args.Unshift(alias_name_str);
-
- result_str.Printf("%s", alias_cmd_obj->GetCommandName());
-
- if (option_arg_vector_sp.get()) {
- OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
-
- for (size_t i = 0; i < option_arg_vector->size(); ++i) {
- OptionArgPair option_pair = (*option_arg_vector)[i];
- OptionArgValue value_pair = option_pair.second;
- int value_type = value_pair.first;
- std::string option = option_pair.first;
- std::string value = value_pair.second;
- if (option.compare("<argument>") == 0)
- result_str.Printf(" %s", value.c_str());
- else {
- result_str.Printf(" %s", option.c_str());
- if (value_type != OptionParser::eNoArgument) {
- if (value_type != OptionParser::eOptionalArgument)
- result_str.Printf(" ");
- int index = GetOptionArgumentPosition(value.c_str());
- if (index == 0)
- result_str.Printf("%s", value.c_str());
- else if (static_cast<size_t>(index) >=
- cmd_args.GetArgumentCount()) {
-
- result.AppendErrorWithFormat("Not enough arguments provided; you "
- "need at least %d arguments to use "
- "this alias.\n",
- index);
- result.SetStatus(eReturnStatusFailed);
- return nullptr;
- } else {
- size_t strpos =
- raw_input_string.find(cmd_args.GetArgumentAtIndex(index));
- if (strpos != std::string::npos)
- raw_input_string = raw_input_string.erase(
- strpos, strlen(cmd_args.GetArgumentAtIndex(index)));
- result_str.Printf("%s", cmd_args.GetArgumentAtIndex(index));
- }
- }
- }
- }
- }
+ if (!alias_cmd_obj || !alias_cmd_obj->IsAlias()) {
+ alias_result.clear();
+ return alias_cmd_obj;
+ }
+ std::pair<CommandObjectSP, OptionArgVectorSP> desugared =
+ ((CommandAlias *)alias_cmd_obj)->Desugar();
+ OptionArgVectorSP option_arg_vector_sp = desugared.second;
+ alias_cmd_obj = desugared.first.get();
+ std::string alias_name_str = alias_name;
+ if ((cmd_args.GetArgumentCount() == 0) ||
+ (alias_name_str.compare(cmd_args.GetArgumentAtIndex(0)) != 0))
+ cmd_args.Unshift(alias_name_str);
+ result_str.Printf("%s", alias_cmd_obj->GetCommandName());
+
+ if (!option_arg_vector_sp.get()) {
alias_result = result_str.GetData();
+ return alias_cmd_obj;
+ }
+ OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
+
+ int value_type;
+ std::string option;
+ std::string value;
+ for (const auto &entry : *option_arg_vector) {
+ std::tie(option, value_type, value) = entry;
+ if (option == "<argument>") {
+ result_str.Printf(" %s", value.c_str());
+ continue;
+ }
+
+ result_str.Printf(" %s", option.c_str());
+ if (value_type == OptionParser::eNoArgument)
+ continue;
+
+ if (value_type != OptionParser::eOptionalArgument)
+ result_str.Printf(" ");
+ int index = GetOptionArgumentPosition(value.c_str());
+ if (index == 0)
+ result_str.Printf("%s", value.c_str());
+ else if (static_cast<size_t>(index) >= cmd_args.GetArgumentCount()) {
+
+ result.AppendErrorWithFormat("Not enough arguments provided; you "
+ "need at least %d arguments to use "
+ "this alias.\n",
+ index);
+ result.SetStatus(eReturnStatusFailed);
+ return nullptr;
+ }
+ size_t strpos = raw_input_string.find(cmd_args.GetArgumentAtIndex(index));
+ if (strpos != std::string::npos)
+ raw_input_string = raw_input_string.erase(
+ strpos, strlen(cmd_args.GetArgumentAtIndex(index)));
+ result_str.Printf("%s", cmd_args.GetArgumentAtIndex(index));
}
+
+ alias_result = result_str.GetData();
return alias_cmd_obj;
}
@@ -1977,73 +1979,68 @@ void CommandInterpreter::BuildAliasCommandArgs(CommandObject *alias_cmd_obj,
used[0] = true;
- for (size_t i = 0; i < option_arg_vector->size(); ++i) {
- OptionArgPair option_pair = (*option_arg_vector)[i];
- OptionArgValue value_pair = option_pair.second;
- int value_type = value_pair.first;
- std::string option = option_pair.first;
- std::string value = value_pair.second;
- if (option.compare("<argument>") == 0) {
- if (!wants_raw_input || (value.compare("--") != 0)) // Since we inserted
- // this above, make
- // sure we don't
- // insert it twice
- new_args
- .AppendArgument(
- value);
- } else {
+ int value_type;
+ std::string option;
+ std::string value;
+ for (const auto &option_entry : *option_arg_vector) {
+ std::tie(option, value_type, value) = option_entry;
+ if (option == "<argument>") {
+ if (!wants_raw_input || (value != "--")) {
+ // Since we inserted this above, make sure we don't insert it twice
+ new_args.AppendArgument(value);
+ }
+ continue;
+ }
+
+ if (value_type != OptionParser::eOptionalArgument)
+ new_args.AppendArgument(option);
+
+ if (value == "<no-argument>")
+ continue;
+
+ int index = GetOptionArgumentPosition(value.c_str());
+ if (index == 0) {
+ // value was NOT a positional argument; must be a real value
if (value_type != OptionParser::eOptionalArgument)
- new_args.AppendArgument(option);
- if (value.compare("<no-argument>") != 0) {
- int index = GetOptionArgumentPosition(value.c_str());
- if (index == 0) {
- // value was NOT a positional argument; must be a real value
- if (value_type != OptionParser::eOptionalArgument)
- new_args.AppendArgument(value);
- else {
- char buffer[255];
- ::snprintf(buffer, sizeof(buffer), "%s%s", option.c_str(),
- value.c_str());
- new_args.AppendArgument(llvm::StringRef(buffer));
- }
+ new_args.AppendArgument(value);
+ else {
+ char buffer[255];
+ ::snprintf(buffer, sizeof(buffer), "%s%s", option.c_str(),
+ value.c_str());
+ new_args.AppendArgument(llvm::StringRef(buffer));
+ }
- } else if (static_cast<size_t>(index) >=
- cmd_args.GetArgumentCount()) {
- result.AppendErrorWithFormat("Not enough arguments provided; you "
- "need at least %d arguments to use "
- "this alias.\n",
- index);
- result.SetStatus(eReturnStatusFailed);
- return;
- } else {
- // Find and remove cmd_args.GetArgumentAtIndex(i) from
- // raw_input_string
- size_t strpos =
- raw_input_string.find(cmd_args.GetArgumentAtIndex(index));
- if (strpos != std::string::npos) {
- raw_input_string = raw_input_string.erase(
- strpos, strlen(cmd_args.GetArgumentAtIndex(index)));
- }
+ } else if (static_cast<size_t>(index) >= cmd_args.GetArgumentCount()) {
+ result.AppendErrorWithFormat("Not enough arguments provided; you "
+ "need at least %d arguments to use "
+ "this alias.\n",
+ index);
+ result.SetStatus(eReturnStatusFailed);
+ return;
+ } else {
+ // Find and remove cmd_args.GetArgumentAtIndex(i) from raw_input_string
+ size_t strpos =
+ raw_input_string.find(cmd_args.GetArgumentAtIndex(index));
+ if (strpos != std::string::npos) {
+ raw_input_string = raw_input_string.erase(
+ strpos, strlen(cmd_args.GetArgumentAtIndex(index)));
+ }
- if (value_type != OptionParser::eOptionalArgument)
- new_args.AppendArgument(llvm::StringRef::withNullAsEmpty(
- cmd_args.GetArgumentAtIndex(index)));
- else {
- char buffer[255];
- ::snprintf(buffer, sizeof(buffer), "%s%s", option.c_str(),
- cmd_args.GetArgumentAtIndex(index));
- new_args.AppendArgument(llvm::StringRef(buffer));
- }
- used[index] = true;
- }
+ if (value_type != OptionParser::eOptionalArgument)
+ new_args.AppendArgument(cmd_args.GetArgumentAtIndex(index));
+ else {
+ char buffer[255];
+ ::snprintf(buffer, sizeof(buffer), "%s%s", option.c_str(),
+ cmd_args.GetArgumentAtIndex(index));
+ new_args.AppendArgument(buffer);
}
+ used[index] = true;
}
}
for (size_t j = 0; j < cmd_args.GetArgumentCount(); ++j) {
if (!used[j] && !wants_raw_input)
- new_args.AppendArgument(
- llvm::StringRef(cmd_args.GetArgumentAtIndex(j)));
+ new_args.AppendArgument(cmd_args.GetArgumentAtIndex(j));
}
cmd_args.Clear();
OpenPOWER on IntegriCloud