size_t FileSpec::ResolvePartialUsername (const char *partial_name, StringList &matches) { #ifdef LLDB_CONFIG_TILDE_RESOLVES_TO_USER size_t extant_entries = matches.GetSize(); setpwent(); struct passwd *user_entry; const char *name_start = partial_name + 1; std::set<std::string> name_list; while ((user_entry = getpwent()) != NULL) { if (strstr(user_entry->pw_name, name_start) == user_entry->pw_name) { std::string tmp_buf("~"); tmp_buf.append(user_entry->pw_name); tmp_buf.push_back('/'); name_list.insert(tmp_buf); } } std::set<std::string>::iterator pos, end = name_list.end(); for (pos = name_list.begin(); pos != end; pos++) { matches.AppendString((*pos).c_str()); } return matches.GetSize() - extant_entries; #else // Resolving home directories is not supported, just copy the path... return 0; #endif // #ifdef LLDB_CONFIG_TILDE_RESOLVES_TO_USER }
size_t StringList::AutoComplete (const char *s, StringList &matches, size_t &exact_idx) const { matches.Clear(); exact_idx = SIZE_MAX; if (s && s[0]) { const size_t s_len = strlen (s); const size_t num_strings = m_strings.size(); for (size_t i=0; i<num_strings; ++i) { if (m_strings[i].find(s) == 0) { if (exact_idx == SIZE_MAX && m_strings[i].size() == s_len) exact_idx = matches.GetSize(); matches.AppendString (m_strings[i]); } } } else { // No string, so it matches everything matches = *this; } return matches.GetSize(); }
int CommandObjectMultiword::HandleCompletion(Args &input, int &cursor_index, int &cursor_char_position, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { // Any of the command matches will provide a complete word, otherwise the // individual // completers will override this. word_complete = true; const char *arg0 = input.GetArgumentAtIndex(0); if (cursor_index == 0) { AddNamesMatchingPartialString(m_subcommand_dict, arg0, matches); if (matches.GetSize() == 1 && matches.GetStringAtIndex(0) != nullptr && strcmp(arg0, matches.GetStringAtIndex(0)) == 0) { StringList temp_matches; CommandObject *cmd_obj = GetSubcommandObject(arg0, &temp_matches); if (cmd_obj != nullptr) { if (input.GetArgumentCount() == 1) { word_complete = true; } else { matches.DeleteStringAtIndex(0); input.Shift(); cursor_char_position = 0; input.AppendArgument(""); return cmd_obj->HandleCompletion( input, cursor_index, cursor_char_position, match_start_point, max_return_elements, word_complete, matches); } } } return matches.GetSize(); } else { CommandObject *sub_command_object = GetSubcommandObject(arg0, &matches); if (sub_command_object == nullptr) { return matches.GetSize(); } else { // Remove the one match that we got from calling GetSubcommandObject. matches.DeleteStringAtIndex(0); input.Shift(); cursor_index--; return sub_command_object->HandleCompletion( input, cursor_index, cursor_char_position, match_start_point, max_return_elements, word_complete, matches); } } }
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) { if (m_completion_type_mask) { std::string completion_str (input.GetArgumentAtIndex (cursor_index), cursor_char_position); CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, m_completion_type_mask, completion_str.c_str(), match_start_point, max_return_elements, nullptr, word_complete, matches); return matches.GetSize(); } else { matches.Clear(); word_complete = false; } return 0; }
int CommandCompletions::SettingsNames(CommandInterpreter &interpreter, CompletionRequest &request, SearchFilter *searcher) { // Cache the full setting name list static StringList g_property_names; if (g_property_names.GetSize() == 0) { // Generate the full setting name list on demand lldb::OptionValuePropertiesSP properties_sp( interpreter.GetDebugger().GetValueProperties()); if (properties_sp) { StreamString strm; properties_sp->DumpValue(nullptr, strm, OptionValue::eDumpOptionName); const std::string &str = strm.GetString(); g_property_names.SplitIntoLines(str.c_str(), str.size()); } } size_t exact_matches_idx = SIZE_MAX; StringList matches; g_property_names.AutoComplete(request.GetCursorArgumentPrefix(), matches, exact_matches_idx); request.SetWordComplete(exact_matches_idx != SIZE_MAX); request.AddCompletions(matches); return request.GetNumberOfMatches(); }
int CommandCompletions::SourceFiles(CommandInterpreter &interpreter, const char *partial_file_name, int match_start_point, int max_return_elements, SearchFilter *searcher, bool &word_complete, StringList &matches) { word_complete = true; // Find some way to switch "include support files..." SourceFileCompleter completer (interpreter, false, partial_file_name, match_start_point, max_return_elements, matches); if (searcher == nullptr) { lldb::TargetSP target_sp = interpreter.GetDebugger().GetSelectedTarget(); SearchFilterForUnconstrainedSearches null_searcher (target_sp); completer.DoCompletion (&null_searcher); } else { completer.DoCompletion (searcher); } return matches.GetSize(); }
int REPL::IOHandlerFixIndentation (IOHandler &io_handler, const StringList &lines, int cursor_position) { if (!m_enable_auto_indent) return 0; if (!lines.GetSize()) { return 0; } int tab_size = io_handler.GetDebugger().GetTabSize(); lldb::offset_t desired_indent = GetDesiredIndentation(lines, cursor_position, tab_size); int actual_indent = REPL::CalculateActualIndentation(lines); if (desired_indent == LLDB_INVALID_OFFSET) return 0; return (int)desired_indent - actual_indent; }
size_t OptionValueEnumeration::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); const uint32_t num_enumerators = m_enumerations.GetSize(); if (s && s[0]) { const size_t s_len = strlen(s); for (size_t i=0; i<num_enumerators; ++i) { const char *name = m_enumerations.GetCStringAtIndex(i); if (::strncmp(s, name, s_len) == 0) matches.AppendString(name); } } else { // only suggest "true" or "false" by default for (size_t i=0; i<num_enumerators; ++i) matches.AppendString(m_enumerations.GetCStringAtIndex(i)); } return matches.GetSize(); }
int CommandCompletions::Symbols ( CommandInterpreter &interpreter, const char *partial_file_name, int match_start_point, int max_return_elements, SearchFilter *searcher, bool &word_complete, StringList &matches) { word_complete = true; SymbolCompleter completer (interpreter, partial_file_name, match_start_point, max_return_elements, matches); if (searcher == NULL) { lldb::TargetSP target_sp = interpreter.GetDebugger().GetSelectedTarget(); SearchFilterForUnconstrainedSearches null_searcher (target_sp); completer.DoCompletion (&null_searcher); } else { completer.DoCompletion (searcher); } return matches.GetSize(); }
size_t OptionValue::AutoComplete(CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); return matches.GetSize(); }
int CommandObjectFile::HandleArgumentCompletion (CommandInterpreter &interpreter, Args &input, int &cursor_index, int &cursor_char_position, OptionElementVector &opt_element_vector, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { std::string completion_str (input.GetArgumentAtIndex(cursor_index)); completion_str.erase (cursor_char_position); CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, CommandCompletions::eDiskFileCompletion, completion_str.c_str(), match_start_point, max_return_elements, NULL, word_complete, matches); return matches.GetSize(); }
int CommandCompletions::SettingsNames (CommandInterpreter &interpreter, const char *partial_setting_name, int match_start_point, int max_return_elements, SearchFilter *searcher, bool &word_complete, StringList &matches) { // Cache the full setting name list static StringList g_property_names; if (g_property_names.GetSize() == 0) { // Generate the full setting name list on demand lldb::OptionValuePropertiesSP properties_sp (interpreter.GetDebugger().GetValueProperties()); if (properties_sp) { StreamString strm; properties_sp->DumpValue(nullptr, strm, OptionValue::eDumpOptionName); const std::string &str = strm.GetString(); g_property_names.SplitIntoLines(str.c_str(), str.size()); } } size_t exact_matches_idx = SIZE_MAX; const size_t num_matches = g_property_names.AutoComplete (partial_setting_name, matches, exact_matches_idx); word_complete = exact_matches_idx != SIZE_MAX; return num_matches; }
bool CommandObjectMultiword::Execute(const char *args_string, CommandReturnObject &result) { Args args(args_string); const size_t argc = args.GetArgumentCount(); if (argc == 0) { this->CommandObject::GenerateHelpText(result); } else { const char *sub_command = args.GetArgumentAtIndex(0); if (sub_command) { if (::strcasecmp(sub_command, "help") == 0) { this->CommandObject::GenerateHelpText(result); } else if (!m_subcommand_dict.empty()) { StringList matches; CommandObject *sub_cmd_obj = GetSubcommandObject(sub_command, &matches); if (sub_cmd_obj != nullptr) { // Now call CommandObject::Execute to process and options in // 'rest_of_line'. From there // the command-specific version of Execute will be called, with the // processed arguments. args.Shift(); sub_cmd_obj->Execute(args_string, result); } else { std::string error_msg; const size_t num_subcmd_matches = matches.GetSize(); if (num_subcmd_matches > 0) error_msg.assign("ambiguous command "); else error_msg.assign("invalid command "); error_msg.append("'"); error_msg.append(GetCommandName()); error_msg.append(" "); error_msg.append(sub_command); error_msg.append("'."); if (num_subcmd_matches > 0) { error_msg.append(" Possible completions:"); for (size_t i = 0; i < num_subcmd_matches; i++) { error_msg.append("\n\t"); error_msg.append(matches.GetStringAtIndex(i)); } } error_msg.append("\n"); result.AppendRawError(error_msg.c_str()); result.SetStatus(eReturnStatusFailed); } } else { result.AppendErrorWithFormat("'%s' does not have any subcommands.\n", GetCommandName()); result.SetStatus(eReturnStatusFailed); } } } return result.Succeeded(); }
void StringList::AppendList (StringList strings) { size_t len = strings.GetSize(); for (size_t i = 0; i < len; ++i) m_strings.push_back (strings.GetStringAtIndex(i)); }
int REPL::CalculateActualIndentation(const StringList &lines) { std::string last_line = lines[lines.GetSize() - 1]; int actual_indent = 0; for (char &ch : last_line) { if (ch != ' ') break; ++actual_indent; } return actual_indent; }
int CommandInterpreter::GetCommandNamesMatchingPartialString (const char *cmd_str, bool include_aliases, StringList &matches) { CommandObject::AddNamesMatchingPartialString (m_command_dict, cmd_str, matches); if (include_aliases) { CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd_str, matches); } return matches.GetSize(); }
size_t StringList::AutoComplete(llvm::StringRef s, StringList &matches, size_t &exact_idx) const { matches.Clear(); exact_idx = SIZE_MAX; if (s.empty()) { // No string, so it matches everything matches = *this; return matches.GetSize(); } const size_t s_len = s.size(); const size_t num_strings = m_strings.size(); for (size_t i = 0; i < num_strings; ++i) { if (m_strings[i].find(s) == 0) { if (exact_idx == SIZE_MAX && m_strings[i].size() == s_len) exact_idx = matches.GetSize(); matches.AppendString(m_strings[i]); } } return matches.GetSize(); }
bool REPL::IOHandlerIsInputComplete(IOHandler &io_handler, StringList &lines) { // Check for meta command const size_t num_lines = lines.GetSize(); if (num_lines == 1) { const char *first_line = lines.GetStringAtIndex(0); if (first_line[0] == ':') return true; // Meta command is a single line where that starts with ':' } // Check if REPL input is done std::string source_string(lines.CopyList()); return SourceIsComplete(source_string); }
size_t Host::GetEnvironment (StringList &env) { char *v; char **var = environ; for (; var != NULL && *var != NULL; ++var) { v = strchr(*var, (int)'-'); if (v == NULL) continue; env.AppendString(v); } return env.GetSize(); }
int HandleArgumentCompletion(Args &input, int &cursor_index, int &cursor_char_position, OptionElementVector &opt_element_vector, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) override { auto completion_str = input[cursor_index].ref; completion_str = completion_str.take_front(cursor_char_position); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, completion_str, match_start_point, max_return_elements, nullptr, word_complete, matches); return matches.GetSize(); }
ArchSpec Host::GetArchSpecForExistingProcess (const char *process_name) { ArchSpec returnSpec; StringList matches; std::vector<lldb::pid_t> pids; if (ListProcessesMatchingName(process_name, matches, pids)) { if (matches.GetSize() == 1) { return GetArchSpecForExistingProcess(pids[0]); } } return returnSpec; }
int HandleArgumentCompletion(Args &input, int &cursor_index, int &cursor_char_position, OptionElementVector &opt_element_vector, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) override { // Arguments are the standard source file completer. std::string completion_str(input.GetArgumentAtIndex(cursor_index)); completion_str.erase(cursor_char_position); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eVariablePathCompletion, completion_str.c_str(), match_start_point, max_return_elements, nullptr, word_complete, matches); return matches.GetSize(); }
size_t OptionValueUUID::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); ExecutionContext exe_ctx(interpreter.GetExecutionContext()); Target *target = exe_ctx.GetTargetPtr(); if (target) { const size_t num_modules = target->GetImages().GetSize(); if (num_modules > 0) { UUID::ValueType uuid_bytes; const size_t num_bytes_decoded = UUID::DecodeUUIDBytesFromCString(s, uuid_bytes, NULL); for (size_t i=0; i<num_modules; ++i) { ModuleSP module_sp (target->GetImages().GetModuleAtIndex(i)); if (module_sp) { const UUID &module_uuid = module_sp->GetUUID(); if (module_uuid.IsValid()) { bool add_uuid = false; if (num_bytes_decoded == 0) add_uuid = true; else add_uuid = ::memcmp(module_uuid.GetBytes(), uuid_bytes, num_bytes_decoded) == 0; if (add_uuid) { std::string uuid_str; uuid_str = module_uuid.GetAsString(); if (!uuid_str.empty()) matches.AppendString(uuid_str.c_str()); } } } } } } return matches.GetSize(); }
size_t Host::GetEnvironment(StringList &env) { // The environment block on Windows is a contiguous buffer of NULL terminated strings, // where the end of the environment block is indicated by two consecutive NULLs. LPCH environment_block = ::GetEnvironmentStrings(); env.Clear(); while (*environment_block != '\0') { llvm::StringRef current_var(environment_block); if (current_var[0] != '=') env.AppendString(current_var); environment_block += current_var.size()+1; } return env.GetSize(); }
size_t OptionValueBoolean::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); struct StringEntry { const char *string; const size_t length; }; static const StringEntry g_autocomplete_entries[] = { { "true" , 4 }, { "false", 5 }, { "on" , 2 }, { "off" , 3 }, { "yes" , 3 }, { "no" , 2 }, { "1" , 1 }, { "0" , 1 }, }; const size_t k_num_autocomplete_entries = llvm::array_lengthof(g_autocomplete_entries); if (s && s[0]) { const size_t s_len = strlen(s); for (size_t i=0; i<k_num_autocomplete_entries; ++i) { if (s_len <= g_autocomplete_entries[i].length) if (::strncasecmp(s, g_autocomplete_entries[i].string, s_len) == 0) matches.AppendString(g_autocomplete_entries[i].string); } } else { // only suggest "true" or "false" by default for (size_t i=0; i<2; ++i) matches.AppendString(g_autocomplete_entries[i].string); } return matches.GetSize(); }
uint32_t ArchSpec::AutoComplete (const char *name, StringList &matches) { uint32_t i; if (name && name[0]) { for (i = 0; i < ArchSpec::kNumCores; ++i) { if (NameMatches(g_core_definitions[i].name, eNameMatchStartsWith, name)) matches.AppendString (g_core_definitions[i].name); } } else { for (i = 0; i < ArchSpec::kNumCores; ++i) matches.AppendString (g_core_definitions[i].name); } return matches.GetSize(); }
uint32_t PluginManager::AutoCompletePlatformName (const char *name, StringList &matches) { if (name && name[0]) { Mutex::Locker locker (GetPlatformInstancesMutex ()); PlatformInstances &instances = GetPlatformInstances (); llvm::StringRef name_sref(name); PlatformInstances::iterator pos, end = instances.end(); for (pos = instances.begin(); pos != end; ++ pos) { llvm::StringRef plugin_name (pos->name); if (plugin_name.startswith(name_sref)) matches.AppendString (plugin_name.data()); } } return matches.GetSize(); }
size_t OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, m_completion_mask, s, match_start_point, max_return_elements, NULL, word_complete, matches); return matches.GetSize(); }
size_t OptionValueArch::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, CommandCompletions::eArchitectureCompletion, s, match_start_point, max_return_elements, nullptr, word_complete, matches); return matches.GetSize(); }
virtual int HandleCompletion (Args &input, int &cursor_index, int &cursor_char_position, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { std::string completion_str (input.GetArgumentAtIndex(cursor_index)); completion_str.erase (cursor_char_position); CommandCompletions::PlatformPluginNames (m_interpreter, completion_str.c_str(), match_start_point, max_return_elements, NULL, word_complete, matches); return matches.GetSize(); }