static void print_wrapped(FILE* out, int* used, int columns, int indent, const char* format, ...) { char* str; va_list ap; va_start(ap, format); str = formatv(format, ap); va_end(ap); if ((*used + strlen(str) >= columns) || !strcmp(str, "\n")) { int i; fprintf(out, "\n"); for (i = 0; i < indent; i++) fprintf(out, " "); *used = indent; } if (strcmp(str, "\n")) { *used += strlen(str); fprintf(out, "%s", str); } free(str); }
// // PrintBuf::format // void PrintBuf::format(char const *fmt, ...) { va_list arg; va_start(arg, fmt); formatv(fmt, arg); va_end(arg); }
unsigned int TestClient::GetPcRegisterId() { if (m_pc_register != UINT_MAX) return m_pc_register; for (unsigned int register_id = 0;; register_id++) { std::string message = formatv("qRegisterInfo{0:x-}", register_id).str(); std::string response; if (!SendMessage(message, response)) { GTEST_LOG_(ERROR) << "Unable to query register ID for PC register."; return UINT_MAX; } auto elements_or_error = SplitPairList("GetPcRegisterId", response); if (auto split_error = elements_or_error.takeError()) { GTEST_LOG_(ERROR) << "GetPcRegisterId: Error splitting response: " << response; return UINT_MAX; } auto elements = *elements_or_error; if (elements["alt-name"] == "pc" || elements["generic"] == "pc") { m_pc_register = register_id; break; } } return m_pc_register; }
bool format(std::wstring & out, const wchar_t * fmt, ...) { va_list args; va_start(args,fmt); bool r = formatv(out,fmt,args); va_end(args); return r; }
char* format(const char* format, ...) { va_list ap; char* result; va_start(ap, format); result = formatv(format, ap); va_end(ap); return result; }
std::wstring format(const wchar_t * fmt, ...) { std::wstring result; va_list args; va_start(args,fmt); formatv(result,fmt,args); va_end(args); return result; }
/// Returns the timer for the specified pass invocation of \p PassID. /// Each time it creates a new timer. Timer &TimePassesHandler::getPassTimer(StringRef PassID) { // Bump counts for each request of the timer. unsigned Count = nextPassID(PassID); // Unconditionally appending description with a pass-invocation number. std::string FullDesc = formatv("{0} #{1}", PassID, Count).str(); PassInvocationID UID{PassID, Count}; Timer *T = new Timer(PassID, FullDesc, TG); auto Pair = TimingData.try_emplace(UID, T); assert(Pair.second && "should always create a new timer"); return *(Pair.first->second.get()); }
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; }
bool TestClient::ContinueThread(unsigned long thread_id) { return Continue(formatv("vCont;c:{0:x-}", thread_id).str()); }
std::wstring formatv(const wchar_t * fmt, va_list args) { std::wstring result; formatv( result, fmt, args ); return result; }