TEST(ArgsTest, TestArgv) { Args args; EXPECT_EQ(nullptr, args.GetArgumentVector()); args.AppendArgument("1"); EXPECT_NE(nullptr, args.GetArgumentVector()[0]); EXPECT_EQ(nullptr, args.GetArgumentVector()[1]); args.AppendArgument("2"); EXPECT_NE(nullptr, args.GetArgumentVector()[0]); EXPECT_NE(nullptr, args.GetArgumentVector()[1]); EXPECT_EQ(nullptr, args.GetArgumentVector()[2]); args.AppendArgument("3"); EXPECT_NE(nullptr, args.GetArgumentVector()[0]); EXPECT_NE(nullptr, args.GetArgumentVector()[1]); EXPECT_NE(nullptr, args.GetArgumentVector()[2]); EXPECT_EQ(nullptr, args.GetArgumentVector()[3]); args.InsertArgumentAtIndex(1, "1.5"); EXPECT_NE(nullptr, args.GetArgumentVector()[0]); EXPECT_NE(nullptr, args.GetArgumentVector()[1]); EXPECT_NE(nullptr, args.GetArgumentVector()[2]); EXPECT_NE(nullptr, args.GetArgumentVector()[3]); EXPECT_EQ(nullptr, args.GetArgumentVector()[4]); args.InsertArgumentAtIndex(4, "3.5"); EXPECT_NE(nullptr, args.GetArgumentVector()[0]); EXPECT_NE(nullptr, args.GetArgumentVector()[1]); EXPECT_NE(nullptr, args.GetArgumentVector()[2]); EXPECT_NE(nullptr, args.GetArgumentVector()[3]); EXPECT_NE(nullptr, args.GetArgumentVector()[4]); EXPECT_EQ(nullptr, args.GetArgumentVector()[5]); }
TEST(ArgsTest, TestInsertArg) { Args args; args.AppendArgument("1"); args.AppendArgument("2"); args.AppendArgument("3"); args.InsertArgumentAtIndex(1, "1.5"); args.InsertArgumentAtIndex(4, "3.5"); ASSERT_EQ(5u, args.GetArgumentCount()); EXPECT_STREQ("1", args.GetArgumentAtIndex(0)); EXPECT_STREQ("1.5", args.GetArgumentAtIndex(1)); EXPECT_STREQ("2", args.GetArgumentAtIndex(2)); EXPECT_STREQ("3", args.GetArgumentAtIndex(3)); EXPECT_STREQ("3.5", args.GetArgumentAtIndex(4)); }
bool TestClient::StartDebugger() { const ArchSpec &arch_spec = HostInfo::GetArchitecture(); Args args; args.AppendArgument(LLDB_SERVER); args.AppendArgument("gdbserver"); args.AppendArgument("--log-channels=gdb-remote packets"); args.AppendArgument("--reverse-connect"); std::string log_file_name = GenerateLogFileName(arch_spec); if (log_file_name.size()) { args.AppendArgument("--log-file=" + log_file_name); } Status error; TCPSocket listen_socket(true, false); error = listen_socket.Listen("127.0.0.1:0", 5); if (error.Fail()) { GTEST_LOG_(ERROR) << "Unable to open listen socket."; return false; } char connect_remote_address[64]; snprintf(connect_remote_address, sizeof(connect_remote_address), "localhost:%u", listen_socket.GetLocalPortNumber()); args.AppendArgument(connect_remote_address); m_server_process_info.SetArchitecture(arch_spec); m_server_process_info.SetArguments(args, true); Status status = Host::LaunchProcess(m_server_process_info); if (status.Fail()) { GTEST_LOG_(ERROR) << formatv("Failure to launch lldb server: {0}.", status).str(); return false; } char connect_remote_uri[64]; snprintf(connect_remote_uri, sizeof(connect_remote_uri), "connect://%s", connect_remote_address); Socket *accept_socket; listen_socket.Accept(accept_socket); SetConnection(new ConnectionFileDescriptor(accept_socket)); SendAck(); // Send this as a handshake. return true; }
TEST(ArgsTest, TestAppendArg) { Args args; args.SetCommandString("first_arg"); EXPECT_EQ(1u, args.GetArgumentCount()); args.AppendArgument(llvm::StringRef("second_arg")); EXPECT_EQ(2u, args.GetArgumentCount()); EXPECT_STREQ(args.GetArgumentAtIndex(0), "first_arg"); EXPECT_STREQ(args.GetArgumentAtIndex(1), "second_arg"); }
// If there is no PATH variable specified inside the environment then set the path to /system/bin. // It is required because the default path used by execve() is wrong on android. static void FixupEnvironment(Args& env) { static const char* path = "PATH="; static const int path_len = ::strlen(path); for (const char** args = env.GetConstArgumentVector(); *args; ++args) if (::strncmp(path, *args, path_len) == 0) return; env.AppendArgument("PATH=/system/bin"); }
size_t OptionValueDictionary::GetArgs(Args &args) const { args.Clear(); collection::const_iterator pos, end = m_values.end(); for (pos = m_values.begin(); pos != end; ++pos) { StreamString strm; strm.Printf("%s=", pos->first.GetCString()); pos->second->DumpValue(nullptr, strm, eDumpOptionValue | eDumpOptionRaw); args.AppendArgument(strm.GetString()); } return args.GetArgumentCount(); }
size_t OptionValueArray::GetArgs(Args &args) const { args.Clear(); const uint32_t size = m_values.size(); for (uint32_t i = 0; i < size; ++i) { llvm::StringRef string_value = m_values[i]->GetStringValue(); if (!string_value.empty()) args.AppendArgument(string_value); } return args.GetArgumentCount(); }
static void FixupEnvironment(Args &env) { #ifdef __ANDROID__ // If there is no PATH variable specified inside the environment then set the // path to /system/bin. It is required because the default path used by // execve() is wrong on android. static const char *path = "PATH="; for (auto &entry : env.entries()) { if (entry.ref.startswith(path)) return; } env.AppendArgument(llvm::StringRef("PATH=/system/bin")); #endif }
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); } } }
SBError SBPlatform::ConnectRemote (SBPlatformConnectOptions &connect_options) { SBError sb_error; PlatformSP platform_sp(GetSP()); if (platform_sp && connect_options.GetURL()) { Args args; args.AppendArgument(connect_options.GetURL()); sb_error.ref() = platform_sp->ConnectRemote(args); } else { sb_error.SetErrorString("invalid platform"); } return sb_error; }
void BreakpointIDList::FindAndReplaceIDRanges (Args &old_args, Target *target, CommandReturnObject &result, Args &new_args) { std::string range_start; const char *range_end; const char *current_arg; const size_t num_old_args = old_args.GetArgumentCount(); for (size_t i = 0; i < num_old_args; ++i) { bool is_range = false; current_arg = old_args.GetArgumentAtIndex (i); uint32_t range_start_len = 0; uint32_t range_end_pos = 0; if (BreakpointIDList::StringContainsIDRangeExpression (current_arg, &range_start_len, &range_end_pos)) { is_range = true; range_start = (char *) malloc (range_start_len + 1); range_start.assign (current_arg, range_start_len); range_end = current_arg + range_end_pos; } else if ((i + 2 < num_old_args) && BreakpointID::IsRangeIdentifier (old_args.GetArgumentAtIndex (i+1)) && BreakpointID::IsValidIDExpression (current_arg) && BreakpointID::IsValidIDExpression (old_args.GetArgumentAtIndex (i+2))) { range_start.assign (current_arg); range_end = old_args.GetArgumentAtIndex (i+2); is_range = true; i = i+2; } if (is_range) { break_id_t start_bp_id; break_id_t end_bp_id; break_id_t start_loc_id; break_id_t end_loc_id; BreakpointID::ParseCanonicalReference (range_start.c_str(), &start_bp_id, &start_loc_id); BreakpointID::ParseCanonicalReference (range_end, &end_bp_id, &end_loc_id); if ((start_bp_id == LLDB_INVALID_BREAK_ID) || (! target->GetBreakpointByID (start_bp_id))) { new_args.Clear(); result.AppendErrorWithFormat ("'%s' is not a valid breakpoint ID.\n", range_start.c_str()); result.SetStatus (eReturnStatusFailed); return; } if ((end_bp_id == LLDB_INVALID_BREAK_ID) || (! target->GetBreakpointByID (end_bp_id))) { new_args.Clear(); result.AppendErrorWithFormat ("'%s' is not a valid breakpoint ID.\n", range_end); result.SetStatus (eReturnStatusFailed); return; } // We have valid range starting & ending breakpoint IDs. Go through all the breakpoints in the // target and find all the breakpoints that fit into this range, and add them to new_args. const BreakpointList& breakpoints = target->GetBreakpointList(); const size_t num_breakpoints = breakpoints.GetSize(); for (size_t j = 0; j < num_breakpoints; ++j) { Breakpoint *breakpoint = breakpoints.GetBreakpointByIndex (j).get(); break_id_t cur_bp_id = breakpoint->GetID(); if ((cur_bp_id < start_bp_id) || (cur_bp_id > end_bp_id)) continue; const size_t num_locations = breakpoint->GetNumLocations(); if ((cur_bp_id == start_bp_id) && (start_loc_id != LLDB_INVALID_BREAK_ID)) { for (size_t k = 0; k < num_locations; ++k) { BreakpointLocation * bp_loc = breakpoint->GetLocationAtIndex(k).get(); if (bp_loc->GetID() >= start_loc_id) { StreamString canonical_id_str; BreakpointID::GetCanonicalReference (&canonical_id_str, cur_bp_id, bp_loc->GetID()); new_args.AppendArgument (canonical_id_str.GetData()); } } } else if ((cur_bp_id == end_bp_id) && (end_loc_id != LLDB_INVALID_BREAK_ID)) { for (size_t k = 0; k < num_locations; ++k) { BreakpointLocation * bp_loc = breakpoint->GetLocationAtIndex(k).get(); if (bp_loc->GetID() <= end_loc_id) { StreamString canonical_id_str; BreakpointID::GetCanonicalReference (&canonical_id_str, cur_bp_id, bp_loc->GetID()); new_args.AppendArgument (canonical_id_str.GetData()); } } } else { StreamString canonical_id_str; BreakpointID::GetCanonicalReference (&canonical_id_str, cur_bp_id, LLDB_INVALID_BREAK_ID); new_args.AppendArgument (canonical_id_str.GetData()); } } } else // else is_range was false { new_args.AppendArgument (current_arg); } } result.SetStatus (eReturnStatusSuccessFinishNoResult); return; }
int CommandInterpreter::HandleCompletionMatches (Args &parsed_line, int &cursor_index, int &cursor_char_position, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { int num_command_matches = 0; bool look_for_subcommand = false; // For any of the command completions a unique match will be a complete word. word_complete = true; if (cursor_index == -1) { // We got nothing on the command line, so return the list of commands bool include_aliases = true; num_command_matches = GetCommandNamesMatchingPartialString ("", include_aliases, matches); } else if (cursor_index == 0) { // The cursor is in the first argument, so just do a lookup in the dictionary. CommandObject *cmd_obj = GetCommandObject (parsed_line.GetArgumentAtIndex(0), &matches); num_command_matches = matches.GetSize(); if (num_command_matches == 1 && cmd_obj && cmd_obj->IsMultiwordObject() && matches.GetStringAtIndex(0) != NULL && strcmp (parsed_line.GetArgumentAtIndex(0), matches.GetStringAtIndex(0)) == 0) { look_for_subcommand = true; num_command_matches = 0; matches.DeleteStringAtIndex(0); parsed_line.AppendArgument (""); cursor_index++; cursor_char_position = 0; } } if (cursor_index > 0 || look_for_subcommand) { // We are completing further on into a commands arguments, so find the command and tell it // to complete the command. // First see if there is a matching initial command: CommandObject *command_object = GetCommandObject (parsed_line.GetArgumentAtIndex(0)); if (command_object == NULL) { return 0; } else { parsed_line.Shift(); cursor_index--; num_command_matches = command_object->HandleCompletion (*this, parsed_line, cursor_index, cursor_char_position, match_start_point, max_return_elements, word_complete, matches); } } return num_command_matches; }
int CommandObject::HandleCompletion ( Args &input, int &cursor_index, int &cursor_char_position, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches ) { // Default implmentation of WantsCompletion() is !WantsRawCommandString(). // Subclasses who want raw command string but desire, for example, // argument completion should override WantsCompletion() to return true, // instead. if (WantsRawCommandString() && !WantsCompletion()) { // FIXME: Abstract telling the completion to insert the completion character. matches.Clear(); return -1; } else { // Can we do anything generic with the options? Options *cur_options = GetOptions(); CommandReturnObject result; OptionElementVector opt_element_vector; if (cur_options != NULL) { // Re-insert the dummy command name string which will have been // stripped off: input.Unshift ("dummy-string"); cursor_index++; // I stick an element on the end of the input, because if the last element is // option that requires an argument, getopt_long will freak out. input.AppendArgument ("<FAKE-VALUE>"); input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index); input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1); bool handled_by_options; handled_by_options = cur_options->HandleOptionCompletion (input, opt_element_vector, cursor_index, cursor_char_position, match_start_point, max_return_elements, word_complete, matches); if (handled_by_options) return matches.GetSize(); } // If we got here, the last word is not an option or an option argument. return HandleArgumentCompletion (input, cursor_index, cursor_char_position, opt_element_vector, match_start_point, max_return_elements, word_complete, matches); } }