diff options
Diffstat (limited to 'lldb/source/Interpreter')
-rw-r--r-- | lldb/source/Interpreter/Args.cpp | 78 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandAlias.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandInterpreter.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandObject.cpp | 4 |
4 files changed, 29 insertions, 59 deletions
diff --git a/lldb/source/Interpreter/Args.cpp b/lldb/source/Interpreter/Args.cpp index 0dd093fe27a..c34b75e169c 100644 --- a/lldb/source/Interpreter/Args.cpp +++ b/lldb/source/Interpreter/Args.cpp @@ -352,11 +352,11 @@ void Args::Shift() { } } -const char *Args::Unshift(const char *arg_cstr, char quote_char) { - m_args.push_front(arg_cstr); +llvm::StringRef Args::Unshift(llvm::StringRef arg_str, char quote_char) { + m_args.push_front(arg_str); m_argv.insert(m_argv.begin(), m_args.front().c_str()); m_args_quote_char.insert(m_args_quote_char.begin(), quote_char); - return GetArgumentAtIndex(0); + return llvm::StringRef::withNullAsEmpty(GetArgumentAtIndex(0)); } void Args::AppendArguments(const Args &rhs) { @@ -972,72 +972,42 @@ void Args::LongestCommonPrefix(std::string &common_prefix) { } } -void Args::AddOrReplaceEnvironmentVariable(const char *env_var_name, - const char *new_value) { - if (!env_var_name || !new_value) +void Args::AddOrReplaceEnvironmentVariable(llvm::StringRef env_var_name, + llvm::StringRef new_value) { + if (env_var_name.empty() || new_value.empty()) return; // Build the new entry. - StreamString stream; - stream << env_var_name; - stream << '='; - stream << new_value; - stream.Flush(); + std::string var_string(env_var_name); + var_string += "="; + var_string += new_value; - // Find the environment variable if present and replace it. - for (size_t i = 0; i < GetArgumentCount(); ++i) { - // Get the env var value. - const char *arg_value = GetArgumentAtIndex(i); - if (!arg_value) - continue; - - // Find the name of the env var: before the first =. - auto equal_p = strchr(arg_value, '='); - if (!equal_p) - continue; - - // Check if the name matches the given env_var_name. - if (strncmp(env_var_name, arg_value, equal_p - arg_value) == 0) { - ReplaceArgumentAtIndex(i, stream.GetString()); - return; - } + size_t index = 0; + if (ContainsEnvironmentVariable(env_var_name, &index)) { + ReplaceArgumentAtIndex(index, var_string); + return; } // We didn't find it. Append it instead. - AppendArgument(stream.GetString()); + AppendArgument(var_string); } -bool Args::ContainsEnvironmentVariable(const char *env_var_name, +bool Args::ContainsEnvironmentVariable(llvm::StringRef env_var_name, size_t *argument_index) const { // Validate args. - if (!env_var_name) + if (env_var_name.empty()) return false; // Check each arg to see if it matches the env var name. for (size_t i = 0; i < GetArgumentCount(); ++i) { - // Get the arg value. - const char *argument_value = GetArgumentAtIndex(i); - if (!argument_value) - continue; - - // Check if we are the "{env_var_name}={env_var_value}" style. - const char *equal_p = strchr(argument_value, '='); - if (equal_p) { - if (strncmp(env_var_name, argument_value, equal_p - argument_value) == - 0) { - // We matched. - if (argument_index) - *argument_index = i; - return true; - } - } else { - // We're a simple {env_var_name}-style entry. - if (strcmp(argument_value, env_var_name) == 0) { - // We matched. - if (argument_index) - *argument_index = i; - return true; - } + auto arg_value = llvm::StringRef::withNullAsEmpty(GetArgumentAtIndex(0)); + + llvm::StringRef name, value; + std::tie(name, value) = arg_value.split('='); + if (name == env_var_name && !value.empty()) { + if (argument_index) + *argument_index = i; + return true; } } diff --git a/lldb/source/Interpreter/CommandAlias.cpp b/lldb/source/Interpreter/CommandAlias.cpp index 70b5394e158..16f324ab02d 100644 --- a/lldb/source/Interpreter/CommandAlias.cpp +++ b/lldb/source/Interpreter/CommandAlias.cpp @@ -41,7 +41,7 @@ static bool ProcessAliasOptionsArgs(lldb::CommandObjectSP &cmd_obj_sp, ExecutionContext exe_ctx = cmd_obj_sp->GetCommandInterpreter().GetExecutionContext(); options->NotifyOptionParsingStarting(&exe_ctx); - args.Unshift("dummy_arg"); + args.Unshift(llvm::StringRef("dummy_arg")); args.ParseAliasOptions(*options, result, option_arg_vector, options_string); args.Shift(); if (result.Succeeded()) diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 32bcca83522..eca4278d235 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -1333,7 +1333,7 @@ CommandObject *CommandInterpreter::BuildAliasResult( 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); + cmd_args.Unshift(alias_name_str); result_str.Printf("%s", alias_cmd_obj->GetCommandName()); @@ -1953,7 +1953,7 @@ void CommandInterpreter::BuildAliasCommandArgs(CommandObject *alias_cmd_obj, // Make sure that the alias name is the 0th element in cmd_args std::string alias_name_str = alias_name; if (alias_name_str.compare(cmd_args.GetArgumentAtIndex(0)) != 0) - cmd_args.Unshift(alias_name); + cmd_args.Unshift(alias_name_str); Args new_args(alias_cmd_obj->GetCommandName()); if (new_args.GetArgumentCount() == 2) diff --git a/lldb/source/Interpreter/CommandObject.cpp b/lldb/source/Interpreter/CommandObject.cpp index 702939a1110..019fca9e4f6 100644 --- a/lldb/source/Interpreter/CommandObject.cpp +++ b/lldb/source/Interpreter/CommandObject.cpp @@ -116,7 +116,7 @@ bool CommandObject::ParseOptions(Args &args, CommandReturnObject &result) { // ParseOptions calls getopt_long_only, which always skips the zero'th item // in the array and starts at position 1, // so we need to push a dummy value into position zero. - args.Unshift("dummy_string"); + args.Unshift(llvm::StringRef("dummy_string")); const bool require_validation = true; error = args.ParseOptions(*options, &exe_ctx, GetCommandInterpreter().GetPlatform(true), @@ -296,7 +296,7 @@ int CommandObject::HandleCompletion(Args &input, int &cursor_index, if (cur_options != nullptr) { // Re-insert the dummy command name string which will have been // stripped off: - input.Unshift("dummy-string"); + input.Unshift(llvm::StringRef("dummy-string")); cursor_index++; // I stick an element on the end of the input, because if the last element |