Author: zturner Date: Mon Oct 3 18:20:36 2016 New Revision: 283159 URL: http://llvm.org/viewvc/llvm-project?rev=283159&view=rev Log: Modernize some code related to Args usage / implementation.
Mostly this involves simplifying some logical constructs and using some ranges instead of index-based iteration. NFC Modified: lldb/trunk/include/lldb/Interpreter/Args.h lldb/trunk/source/Interpreter/Args.cpp lldb/trunk/source/Interpreter/CommandAlias.cpp lldb/trunk/source/Interpreter/CommandInterpreter.cpp Modified: lldb/trunk/include/lldb/Interpreter/Args.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/Args.h?rev=283159&r1=283158&r2=283159&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/Args.h (original) +++ lldb/trunk/include/lldb/Interpreter/Args.h Mon Oct 3 18:20:36 2016 @@ -27,9 +27,7 @@ namespace lldb_private { -typedef std::pair<int, std::string> OptionArgValue; -typedef std::pair<std::string, OptionArgValue> OptionArgPair; -typedef std::vector<OptionArgPair> OptionArgVector; +typedef std::vector<std::tuple<std::string, int, std::string>> OptionArgVector; typedef std::shared_ptr<OptionArgVector> OptionArgVectorSP; struct OptionArgElement { Modified: lldb/trunk/source/Interpreter/Args.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=283159&r1=283158&r2=283159&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/Args.cpp (original) +++ lldb/trunk/source/Interpreter/Args.cpp Mon Oct 3 18:20:36 2016 @@ -1015,6 +1015,7 @@ void Args::ParseAliasOptions(Options &op std::unique_lock<std::mutex> lock; OptionParser::Prepare(lock); + result.SetStatus(eReturnStatusSuccessFinishNoResult); int val; while (1) { int long_options_index = -1; @@ -1049,95 +1050,73 @@ void Args::ParseAliasOptions(Options &op } // See if the option takes an argument, and see if one was supplied. - if (long_options_index >= 0) { - StreamString option_str; - option_str.Printf("-%c", val); - const OptionDefinition *def = long_options[long_options_index].definition; - int has_arg = - (def == nullptr) ? OptionParser::eNoArgument : def->option_has_arg; - - switch (has_arg) { - case OptionParser::eNoArgument: - option_arg_vector->push_back(OptionArgPair( - std::string(option_str.GetData()), - OptionArgValue(OptionParser::eNoArgument, "<no-argument>"))); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - break; - case OptionParser::eRequiredArgument: - if (OptionParser::GetOptionArgument() != nullptr) { - option_arg_vector->push_back(OptionArgPair( - std::string(option_str.GetData()), - OptionArgValue(OptionParser::eRequiredArgument, - std::string(OptionParser::GetOptionArgument())))); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else { - result.AppendErrorWithFormat( - "Option '%s' is missing argument specifier.\n", - option_str.GetData()); - result.SetStatus(eReturnStatusFailed); - } - break; - case OptionParser::eOptionalArgument: - if (OptionParser::GetOptionArgument() != nullptr) { - option_arg_vector->push_back(OptionArgPair( - std::string(option_str.GetData()), - OptionArgValue(OptionParser::eOptionalArgument, - std::string(OptionParser::GetOptionArgument())))); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } else { - option_arg_vector->push_back( - OptionArgPair(std::string(option_str.GetData()), - OptionArgValue(OptionParser::eOptionalArgument, - "<no-argument>"))); - result.SetStatus(eReturnStatusSuccessFinishNoResult); - } - break; - default: - result.AppendErrorWithFormat("error with options table; invalid value " - "in has_arg field for option '%c'.\n", - val); - result.SetStatus(eReturnStatusFailed); - break; - } - } else { + if (long_options_index == -1) { result.AppendErrorWithFormat("Invalid option with value '%c'.\n", val); result.SetStatus(eReturnStatusFailed); + return; } - if (long_options_index >= 0) { - // Find option in the argument list; also see if it was supposed to take - // an argument and if one was - // supplied. Remove option (and argument, if given) from the argument - // list. Also remove them from - // the raw_input_string, if one was passed in. - size_t idx = FindArgumentIndexForOption(long_options, long_options_index); - if (idx < GetArgumentCount()) { + StreamString option_str; + option_str.Printf("-%c", val); + const OptionDefinition *def = long_options[long_options_index].definition; + int has_arg = + (def == nullptr) ? OptionParser::eNoArgument : def->option_has_arg; + + const char *option_arg = nullptr; + switch (has_arg) { + case OptionParser::eRequiredArgument: + if (OptionParser::GetOptionArgument() == nullptr) { + result.AppendErrorWithFormat( + "Option '%s' is missing argument specifier.\n", + option_str.GetData()); + result.SetStatus(eReturnStatusFailed); + return; + } + LLVM_FALLTHROUGH; + case OptionParser::eOptionalArgument: + option_arg = OptionParser::GetOptionArgument(); + LLVM_FALLTHROUGH; + case OptionParser::eNoArgument: + break; + default: + result.AppendErrorWithFormat("error with options table; invalid value " + "in has_arg field for option '%c'.\n", + val); + result.SetStatus(eReturnStatusFailed); + return; + } + if (!option_arg) + option_arg = "<no-argument>"; + option_arg_vector->emplace_back(option_str.GetData(), has_arg, option_arg); + + // Find option in the argument list; also see if it was supposed to take + // an argument and if one was supplied. Remove option (and argument, if + // given) from the argument list. Also remove them from the + // raw_input_string, if one was passed in. + size_t idx = FindArgumentIndexForOption(long_options, long_options_index); + if (idx < GetArgumentCount()) { + if (raw_input_string.size() > 0) { + const char *tmp_arg = GetArgumentAtIndex(idx); + size_t pos = raw_input_string.find(tmp_arg); + if (pos != std::string::npos) + raw_input_string.erase(pos, strlen(tmp_arg)); + } + ReplaceArgumentAtIndex(idx, llvm::StringRef()); + if ((long_options[long_options_index].definition->option_has_arg != + OptionParser::eNoArgument) && + (OptionParser::GetOptionArgument() != nullptr) && + (idx + 1 < GetArgumentCount()) && + (strcmp(OptionParser::GetOptionArgument(), + GetArgumentAtIndex(idx + 1)) == 0)) { if (raw_input_string.size() > 0) { - const char *tmp_arg = GetArgumentAtIndex(idx); + const char *tmp_arg = GetArgumentAtIndex(idx + 1); size_t pos = raw_input_string.find(tmp_arg); if (pos != std::string::npos) raw_input_string.erase(pos, strlen(tmp_arg)); } - ReplaceArgumentAtIndex(idx, llvm::StringRef()); - if ((long_options[long_options_index].definition->option_has_arg != - OptionParser::eNoArgument) && - (OptionParser::GetOptionArgument() != nullptr) && - (idx + 1 < GetArgumentCount()) && - (strcmp(OptionParser::GetOptionArgument(), - GetArgumentAtIndex(idx + 1)) == 0)) { - if (raw_input_string.size() > 0) { - const char *tmp_arg = GetArgumentAtIndex(idx + 1); - size_t pos = raw_input_string.find(tmp_arg); - if (pos != std::string::npos) - raw_input_string.erase(pos, strlen(tmp_arg)); - } - ReplaceArgumentAtIndex(idx + 1, llvm::StringRef()); - } + ReplaceArgumentAtIndex(idx + 1, llvm::StringRef()); } } - - if (!result.Succeeded()) - break; } } Modified: lldb/trunk/source/Interpreter/CommandAlias.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandAlias.cpp?rev=283159&r1=283158&r2=283159&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/CommandAlias.cpp (original) +++ lldb/trunk/source/Interpreter/CommandAlias.cpp Mon Oct 3 18:20:36 2016 @@ -55,15 +55,13 @@ static bool ProcessAliasOptionsArgs(lldb if (!options_string.empty()) { if (cmd_obj_sp->WantsRawCommandString()) - option_arg_vector->push_back( - OptionArgPair("<argument>", OptionArgValue(-1, options_string))); + option_arg_vector->emplace_back("<argument>", -1, options_string); else { const size_t argc = args.GetArgumentCount(); for (size_t i = 0; i < argc; ++i) if (strcmp(args.GetArgumentAtIndex(i), "") != 0) - option_arg_vector->push_back(OptionArgPair( - "<argument>", - OptionArgValue(-1, std::string(args.GetArgumentAtIndex(i))))); + option_arg_vector->emplace_back("<argument>", -1, + args.GetArgumentAtIndex(i)); } } @@ -149,21 +147,24 @@ void CommandAlias::GetAliasExpansion(Str const char *command_name = m_underlying_command_sp->GetCommandName(); help_string.Printf("'%s", command_name); - if (m_option_args_sp) { - OptionArgVector *options = m_option_args_sp.get(); - for (size_t i = 0; i < options->size(); ++i) { - OptionArgPair cur_option = (*options)[i]; - std::string opt = cur_option.first; - OptionArgValue value_pair = cur_option.second; - std::string value = value_pair.second; - if (opt.compare("<argument>") == 0) { + if (!m_option_args_sp) { + help_string.Printf("'"); + return; + } + + OptionArgVector *options = m_option_args_sp.get(); + std::string opt; + std::string value; + + for (const auto &opt_entry : *options) { + std::tie(opt, std::ignore, value) = opt_entry; + if (opt == "<argument>") { + help_string.Printf(" %s", value.c_str()); + } else { + help_string.Printf(" %s", opt.c_str()); + if ((value.compare("<no-argument>") != 0) && + (value.compare("<need-argument") != 0)) { help_string.Printf(" %s", value.c_str()); - } else { - help_string.Printf(" %s", opt.c_str()); - if ((value.compare("<no-argument>") != 0) && - (value.compare("<need-argument") != 0)) { - help_string.Printf(" %s", value.c_str()); - } } } } @@ -172,24 +173,30 @@ void CommandAlias::GetAliasExpansion(Str } bool CommandAlias::IsDashDashCommand() { - if (m_is_dashdash_alias == eLazyBoolCalculate) { - m_is_dashdash_alias = eLazyBoolNo; - if (IsValid()) { - for (const OptionArgPair &opt_arg : *GetOptionArguments()) { - if (opt_arg.first == "<argument>" && !opt_arg.second.second.empty() && - llvm::StringRef(opt_arg.second.second).endswith("--")) { - m_is_dashdash_alias = eLazyBoolYes; - break; - } - } - // if this is a nested alias, it may be adding arguments on top of an - // already dash-dash alias - if ((m_is_dashdash_alias == eLazyBoolNo) && IsNestedAlias()) - m_is_dashdash_alias = - (GetUnderlyingCommand()->IsDashDashCommand() ? eLazyBoolYes - : eLazyBoolNo); + if (m_is_dashdash_alias != eLazyBoolCalculate) + return (m_is_dashdash_alias == eLazyBoolYes); + m_is_dashdash_alias = eLazyBoolNo; + if (!IsValid()) + return false; + + std::string opt; + std::string value; + + for (const auto &opt_entry : *GetOptionArguments()) { + std::tie(opt, std::ignore, value) = opt_entry; + if (opt == "<argument>" && !value.empty() && + llvm::StringRef(value).endswith("--")) { + m_is_dashdash_alias = eLazyBoolYes; + break; } } + + // if this is a nested alias, it may be adding arguments on top of an + // already dash-dash alias + if ((m_is_dashdash_alias == eLazyBoolNo) && IsNestedAlias()) + m_is_dashdash_alias = + (GetUnderlyingCommand()->IsDashDashCommand() ? eLazyBoolYes + : eLazyBoolNo); return (m_is_dashdash_alias == eLazyBoolYes); } Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=283159&r1=283158&r2=283159&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original) +++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Mon Oct 3 18:20:36 2016 @@ -1325,61 +1325,63 @@ CommandObject *CommandInterpreter::Build 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::BuildAliasComma 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(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits