diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
commit | f73363f1dd94996356cefbf24388f561891acf0b (patch) | |
tree | e3c31248bdb36eaec5fd833490d4278162dba2a0 /source/Interpreter/CommandObjectRegexCommand.cpp | |
parent | 160ee69dd7ae18978f4068116777639ea98dc951 (diff) |
Notes
Diffstat (limited to 'source/Interpreter/CommandObjectRegexCommand.cpp')
-rw-r--r-- | source/Interpreter/CommandObjectRegexCommand.cpp | 91 |
1 files changed, 38 insertions, 53 deletions
diff --git a/source/Interpreter/CommandObjectRegexCommand.cpp b/source/Interpreter/CommandObjectRegexCommand.cpp index 79d3bb1b5bee..f975c0eea2ee 100644 --- a/source/Interpreter/CommandObjectRegexCommand.cpp +++ b/source/Interpreter/CommandObjectRegexCommand.cpp @@ -35,53 +35,47 @@ CommandObjectRegexCommand::CommandObjectRegexCommand( //---------------------------------------------------------------------- CommandObjectRegexCommand::~CommandObjectRegexCommand() {} -bool CommandObjectRegexCommand::DoExecute(const char *command, +bool CommandObjectRegexCommand::DoExecute(llvm::StringRef command, CommandReturnObject &result) { - if (command) { - EntryCollection::const_iterator pos, end = m_entries.end(); - for (pos = m_entries.begin(); pos != end; ++pos) { - RegularExpression::Match regex_match(m_max_matches); + EntryCollection::const_iterator pos, end = m_entries.end(); + for (pos = m_entries.begin(); pos != end; ++pos) { + RegularExpression::Match regex_match(m_max_matches); - if (pos->regex.Execute(command, ®ex_match)) { - std::string new_command(pos->command); - std::string match_str; - char percent_var[8]; - size_t idx, percent_var_idx; - for (uint32_t match_idx = 1; match_idx <= m_max_matches; ++match_idx) { - if (regex_match.GetMatchAtIndex(command, match_idx, match_str)) { - const int percent_var_len = - ::snprintf(percent_var, sizeof(percent_var), "%%%u", match_idx); - for (idx = 0; (percent_var_idx = new_command.find( - percent_var, idx)) != std::string::npos;) { - new_command.erase(percent_var_idx, percent_var_len); - new_command.insert(percent_var_idx, match_str); - idx += percent_var_idx + match_str.size(); - } + if (pos->regex.Execute(command, ®ex_match)) { + std::string new_command(pos->command); + std::string match_str; + char percent_var[8]; + size_t idx, percent_var_idx; + for (uint32_t match_idx = 1; match_idx <= m_max_matches; ++match_idx) { + if (regex_match.GetMatchAtIndex(command, match_idx, match_str)) { + const int percent_var_len = + ::snprintf(percent_var, sizeof(percent_var), "%%%u", match_idx); + for (idx = 0; (percent_var_idx = new_command.find( + percent_var, idx)) != std::string::npos;) { + new_command.erase(percent_var_idx, percent_var_len); + new_command.insert(percent_var_idx, match_str); + idx += percent_var_idx + match_str.size(); } } - // Interpret the new command and return this as the result! - if (m_interpreter.GetExpandRegexAliases()) - result.GetOutputStream().Printf("%s\n", new_command.c_str()); - // Pass in true for "no context switching". The command that called us - // should have set up the context - // appropriately, we shouldn't have to redo that. - return m_interpreter.HandleCommand(new_command.c_str(), - eLazyBoolCalculate, result, nullptr, - true, true); } + // Interpret the new command and return this as the result! + if (m_interpreter.GetExpandRegexAliases()) + result.GetOutputStream().Printf("%s\n", new_command.c_str()); + // Pass in true for "no context switching". The command that called us + // should have set up the context appropriately, we shouldn't have to + // redo that. + return m_interpreter.HandleCommand( + new_command.c_str(), eLazyBoolCalculate, result, nullptr, true, true); } - result.SetStatus(eReturnStatusFailed); - if (!GetSyntax().empty()) - result.AppendError(GetSyntax()); - else - result.AppendErrorWithFormat("Command contents '%s' failed to match any " - "regular expression in the '%s' regex " - "command.\n", - command, m_cmd_name.c_str()); - return false; } - result.AppendError("empty command passed to regular expression command"); result.SetStatus(eReturnStatusFailed); + if (!GetSyntax().empty()) + result.AppendError(GetSyntax()); + else + result.GetOutputStream() << "Command contents '" << command + << "' failed to match any " + "regular expression in the '" + << m_cmd_name << "' regex "; return false; } @@ -99,23 +93,14 @@ bool CommandObjectRegexCommand::AddRegexCommand(const char *re_cstr, return false; } -int CommandObjectRegexCommand::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, - StringList &matches) { +int CommandObjectRegexCommand::HandleCompletion(CompletionRequest &request) { if (m_completion_type_mask) { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); CommandCompletions::InvokeCommonCompletionCallbacks( - GetCommandInterpreter(), m_completion_type_mask, completion_str.c_str(), - match_start_point, max_return_elements, nullptr, word_complete, - matches); - return matches.GetSize(); + GetCommandInterpreter(), m_completion_type_mask, request, nullptr); + return request.GetMatches().GetSize(); } else { - matches.Clear(); - word_complete = false; + request.GetMatches().Clear(); + request.SetWordComplete(false); } return 0; } |