130fdc8d8SChris Lattner //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner // C Includes 11ad65c051SStephen Wilson #include <string.h> 12ad65c051SStephen Wilson 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 16ad65c051SStephen Wilson #include "Utility/StringExtractorGDBRemote.h" 1730fdc8d8SChris Lattner 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner 20576d8834SGreg Clayton StringExtractorGDBRemote::ResponseType 21576d8834SGreg Clayton StringExtractorGDBRemote::GetResponseType () const 2230fdc8d8SChris Lattner { 2330fdc8d8SChris Lattner if (m_packet.empty()) 2430fdc8d8SChris Lattner return eUnsupported; 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner switch (m_packet[0]) 2730fdc8d8SChris Lattner { 2830fdc8d8SChris Lattner case 'E': 2930fdc8d8SChris Lattner if (m_packet.size() == 3 && 3030fdc8d8SChris Lattner isxdigit(m_packet[1]) && 3130fdc8d8SChris Lattner isxdigit(m_packet[2])) 3230fdc8d8SChris Lattner return eError; 3330fdc8d8SChris Lattner break; 3430fdc8d8SChris Lattner 3530fdc8d8SChris Lattner case 'O': 3630fdc8d8SChris Lattner if (m_packet.size() == 2 && m_packet[1] == 'K') 3730fdc8d8SChris Lattner return eOK; 3830fdc8d8SChris Lattner break; 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner case '+': 4130fdc8d8SChris Lattner if (m_packet.size() == 1) 4230fdc8d8SChris Lattner return eAck; 4330fdc8d8SChris Lattner break; 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner case '-': 4630fdc8d8SChris Lattner if (m_packet.size() == 1) 4730fdc8d8SChris Lattner return eNack; 4830fdc8d8SChris Lattner break; 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner return eResponse; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 53576d8834SGreg Clayton StringExtractorGDBRemote::ServerPacketType 54576d8834SGreg Clayton StringExtractorGDBRemote::GetServerPacketType () const 5530fdc8d8SChris Lattner { 568b82f087SGreg Clayton #define PACKET_MATCHES(s) ((packet_size == (sizeof(s)-1)) && (strcmp((packet_cstr),(s)) == 0)) 578b82f087SGreg Clayton #define PACKET_STARTS_WITH(s) ((packet_size >= (sizeof(s)-1)) && ::strncmp(packet_cstr, s, (sizeof(s)-1))==0) 588b82f087SGreg Clayton 59576d8834SGreg Clayton // Empty is not a supported packet... 60576d8834SGreg Clayton if (m_packet.empty()) 61576d8834SGreg Clayton return eServerPacketType_invalid; 62576d8834SGreg Clayton 638b82f087SGreg Clayton const size_t packet_size = m_packet.size(); 64576d8834SGreg Clayton const char *packet_cstr = m_packet.c_str(); 65576d8834SGreg Clayton switch (m_packet[0]) 66576d8834SGreg Clayton { 67d314e810SGreg Clayton case '\x03': 688b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_interrupt; 69d314e810SGreg Clayton break; 70d314e810SGreg Clayton 71576d8834SGreg Clayton case '-': 728b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_nack; 73576d8834SGreg Clayton break; 74576d8834SGreg Clayton 75576d8834SGreg Clayton case '+': 768b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_ack; 77576d8834SGreg Clayton break; 78576d8834SGreg Clayton 798b82f087SGreg Clayton case 'A': 808b82f087SGreg Clayton return eServerPacketType_A; 818b82f087SGreg Clayton 821cb6496eSGreg Clayton case 'Q': 83*0fefa676SJean-Daniel Dupas 848b82f087SGreg Clayton switch (packet_cstr[1]) 858b82f087SGreg Clayton { 868b82f087SGreg Clayton case 'E': 878b82f087SGreg Clayton if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment; 88*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QEnvironmentHexEncoded:")) return eServerPacketType_QEnvironmentHexEncoded; 898b82f087SGreg Clayton break; 908b82f087SGreg Clayton 918b82f087SGreg Clayton case 'S': 928b82f087SGreg Clayton if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode; 93*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSaveRegisterState")) return eServerPacketType_QSaveRegisterState; 94*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR; 95*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN; 96*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT; 97*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR; 98*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir; 99*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetLogging:")) return eServerPacketType_QSetLogging; 100*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetMaxPacketSize:")) return eServerPacketType_QSetMaxPacketSize; 101*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetMaxPayloadSize:")) return eServerPacketType_QSetMaxPayloadSize; 102*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetEnableAsyncProfiling;")) return eServerPacketType_QSetEnableAsyncProfiling; 103*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSyncThreadState:")) return eServerPacketType_QSyncThreadState; 1048b82f087SGreg Clayton break; 105*0fefa676SJean-Daniel Dupas 106e0f8f574SDaniel Malea case 'L': 107e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch; 108*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES("QListThreadsInStopReply")) return eServerPacketType_QListThreadsInStopReply; 109*0fefa676SJean-Daniel Dupas break; 110*0fefa676SJean-Daniel Dupas 111*0fefa676SJean-Daniel Dupas case 'R': 112*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QRestoreRegisterState:")) return eServerPacketType_QRestoreRegisterState; 113*0fefa676SJean-Daniel Dupas break; 114*0fefa676SJean-Daniel Dupas 115*0fefa676SJean-Daniel Dupas case 'T': 116*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("QThreadSuffixSupported")) return eServerPacketType_QThreadSuffixSupported; 117e0f8f574SDaniel Malea break; 1188b82f087SGreg Clayton } 1191cb6496eSGreg Clayton break; 1201cb6496eSGreg Clayton 121576d8834SGreg Clayton case 'q': 1228b82f087SGreg Clayton switch (packet_cstr[1]) 1238b82f087SGreg Clayton { 1248b82f087SGreg Clayton case 's': 1258b82f087SGreg Clayton if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo; 126*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qsThreadInfo")) return eServerPacketType_qsThreadInfo; 1278b82f087SGreg Clayton break; 1288b82f087SGreg Clayton 1298b82f087SGreg Clayton case 'f': 1308b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo; 131*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qfThreadInfo")) return eServerPacketType_qfThreadInfo; 1328b82f087SGreg Clayton break; 1338b82f087SGreg Clayton 1348b82f087SGreg Clayton case 'C': 1358b82f087SGreg Clayton if (packet_size == 2) return eServerPacketType_qC; 1368b82f087SGreg Clayton break; 1378b82f087SGreg Clayton 1388b82f087SGreg Clayton case 'G': 1398b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName; 140fbb76349SGreg Clayton if (PACKET_MATCHES ("qGetWorkingDir")) return eServerPacketType_qGetWorkingDir; 141*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qGetPid")) return eServerPacketType_qGetPid; 142*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qGetProfileData;")) return eServerPacketType_qGetProfileData; 143*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qGDBServerVersion")) return eServerPacketType_qGDBServerVersion; 1448b82f087SGreg Clayton break; 1458b82f087SGreg Clayton 1468b82f087SGreg Clayton case 'H': 1478b82f087SGreg Clayton if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo; 1488b82f087SGreg Clayton break; 1498b82f087SGreg Clayton 150e0f8f574SDaniel Malea case 'K': 151e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess; 152e0f8f574SDaniel Malea break; 153e0f8f574SDaniel Malea 1548b82f087SGreg Clayton case 'L': 155e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer; 1568b82f087SGreg Clayton if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess; 1578b82f087SGreg Clayton break; 1588b82f087SGreg Clayton 159*0fefa676SJean-Daniel Dupas case 'M': 160*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qMemoryRegionInfo:")) return eServerPacketType_qMemoryRegionInfo; 161*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qMemoryRegionInfo")) return eServerPacketType_qMemoryRegionInfoSupported; 162*0fefa676SJean-Daniel Dupas break; 163*0fefa676SJean-Daniel Dupas 1648b82f087SGreg Clayton case 'P': 1658b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID; 166fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_shell:")) return eServerPacketType_qPlatform_shell; 167fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_mkdir:")) return eServerPacketType_qPlatform_mkdir; 168fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_chmod:")) return eServerPacketType_qPlatform_chmod; 169*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qProcessInfo")) return eServerPacketType_qProcessInfo; 1708b82f087SGreg Clayton break; 1718b82f087SGreg Clayton 172*0fefa676SJean-Daniel Dupas case 'R': 173*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qRcmd,")) return eServerPacketType_qRcmd; 174*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qRegisterInfo")) return eServerPacketType_qRegisterInfo; 175*0fefa676SJean-Daniel Dupas break; 176e0f8f574SDaniel Malea 1778b82f087SGreg Clayton case 'S': 1788b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest; 179*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qShlibInfoAddr")) return eServerPacketType_qShlibInfoAddr; 180*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qStepPacketSupported")) return eServerPacketType_qStepPacketSupported; 181*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qSyncThreadStateSupported")) return eServerPacketType_qSyncThreadStateSupported; 182*0fefa676SJean-Daniel Dupas break; 183*0fefa676SJean-Daniel Dupas 184*0fefa676SJean-Daniel Dupas case 'T': 185*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qThreadExtraInfo,")) return eServerPacketType_qThreadExtraInfo; 186*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qThreadStopInfo")) return eServerPacketType_qThreadStopInfo; 1878b82f087SGreg Clayton break; 1888b82f087SGreg Clayton 1898b82f087SGreg Clayton case 'U': 1908b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName; 1918b82f087SGreg Clayton break; 192*0fefa676SJean-Daniel Dupas 193*0fefa676SJean-Daniel Dupas case 'V': 194*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qVAttachOrWaitSupported")) return eServerPacketType_qVAttachOrWaitSupported; 195*0fefa676SJean-Daniel Dupas break; 196*0fefa676SJean-Daniel Dupas 197*0fefa676SJean-Daniel Dupas case 'W': 198*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qWatchpointSupportInfo:")) return eServerPacketType_qWatchpointSupportInfo; 199*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qWatchpointSupportInfo")) return eServerPacketType_qWatchpointSupportInfoSupported; 200*0fefa676SJean-Daniel Dupas break; 2018b82f087SGreg Clayton } 202576d8834SGreg Clayton break; 203e0f8f574SDaniel Malea case 'v': 204e0f8f574SDaniel Malea if (PACKET_STARTS_WITH("vFile:")) 205e0f8f574SDaniel Malea { 206fbb76349SGreg Clayton if (PACKET_STARTS_WITH("vFile:open:")) return eServerPacketType_vFile_open; 207fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:close:")) return eServerPacketType_vFile_close; 208fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:pread")) return eServerPacketType_vFile_pread; 209fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:pwrite")) return eServerPacketType_vFile_pwrite; 210fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:size")) return eServerPacketType_vFile_size; 211fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:exists")) return eServerPacketType_vFile_exists; 212fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:stat")) return eServerPacketType_vFile_stat; 213fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:mode")) return eServerPacketType_vFile_mode; 214fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:MD5")) return eServerPacketType_vFile_md5; 215fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:symlink")) return eServerPacketType_vFile_symlink; 216fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:unlink")) return eServerPacketType_vFile_unlink; 217e0f8f574SDaniel Malea 218*0fefa676SJean-Daniel Dupas } else { 219*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttach;")) return eServerPacketType_vAttach; 220*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachWait;")) return eServerPacketType_vAttachWait; 221*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachOrWait;")) return eServerPacketType_vAttachOrWait; 222*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachName;")) return eServerPacketType_vAttachName; 223*0fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH("vCont;")) return eServerPacketType_vCont; 224*0fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("vCont?")) return eServerPacketType_vCont_actions; 225e0f8f574SDaniel Malea } 226e0f8f574SDaniel Malea break; 227*0fefa676SJean-Daniel Dupas case '_': 228*0fefa676SJean-Daniel Dupas switch (packet_cstr[1]) 229*0fefa676SJean-Daniel Dupas { 230*0fefa676SJean-Daniel Dupas case 'M': 231*0fefa676SJean-Daniel Dupas return eServerPacketType__M; 232*0fefa676SJean-Daniel Dupas 233*0fefa676SJean-Daniel Dupas case 'm': 234*0fefa676SJean-Daniel Dupas return eServerPacketType__m; 235*0fefa676SJean-Daniel Dupas } 236*0fefa676SJean-Daniel Dupas break; 237*0fefa676SJean-Daniel Dupas 238*0fefa676SJean-Daniel Dupas case '?': 239*0fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_stop_reason; 240*0fefa676SJean-Daniel Dupas break; 241*0fefa676SJean-Daniel Dupas 242*0fefa676SJean-Daniel Dupas case 'c': 243*0fefa676SJean-Daniel Dupas return eServerPacketType_c; 244*0fefa676SJean-Daniel Dupas 245*0fefa676SJean-Daniel Dupas case 'C': 246*0fefa676SJean-Daniel Dupas return eServerPacketType_C; 247*0fefa676SJean-Daniel Dupas 248*0fefa676SJean-Daniel Dupas case 'D': 249*0fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_D; 250*0fefa676SJean-Daniel Dupas break; 251*0fefa676SJean-Daniel Dupas 252*0fefa676SJean-Daniel Dupas case 'g': 253*0fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_g; 254*0fefa676SJean-Daniel Dupas break; 255*0fefa676SJean-Daniel Dupas 256*0fefa676SJean-Daniel Dupas case 'G': 257*0fefa676SJean-Daniel Dupas return eServerPacketType_G; 258*0fefa676SJean-Daniel Dupas 259*0fefa676SJean-Daniel Dupas case 'H': 260*0fefa676SJean-Daniel Dupas return eServerPacketType_H; 261*0fefa676SJean-Daniel Dupas 262*0fefa676SJean-Daniel Dupas case 'k': 263*0fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_k; 264*0fefa676SJean-Daniel Dupas break; 265*0fefa676SJean-Daniel Dupas 266*0fefa676SJean-Daniel Dupas case 'm': 267*0fefa676SJean-Daniel Dupas return eServerPacketType_m; 268*0fefa676SJean-Daniel Dupas 269*0fefa676SJean-Daniel Dupas case 'M': 270*0fefa676SJean-Daniel Dupas return eServerPacketType_M; 271*0fefa676SJean-Daniel Dupas 272*0fefa676SJean-Daniel Dupas case 'p': 273*0fefa676SJean-Daniel Dupas return eServerPacketType_p; 274*0fefa676SJean-Daniel Dupas 275*0fefa676SJean-Daniel Dupas case 'P': 276*0fefa676SJean-Daniel Dupas return eServerPacketType_P; 277*0fefa676SJean-Daniel Dupas 278*0fefa676SJean-Daniel Dupas case 's': 279*0fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_s; 280*0fefa676SJean-Daniel Dupas break; 281*0fefa676SJean-Daniel Dupas 282*0fefa676SJean-Daniel Dupas case 'S': 283*0fefa676SJean-Daniel Dupas return eServerPacketType_S; 284*0fefa676SJean-Daniel Dupas 285*0fefa676SJean-Daniel Dupas case 'T': 286*0fefa676SJean-Daniel Dupas return eServerPacketType_T; 287*0fefa676SJean-Daniel Dupas 288*0fefa676SJean-Daniel Dupas case 'z': 289*0fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 290*0fefa676SJean-Daniel Dupas return eServerPacketType_z; 291*0fefa676SJean-Daniel Dupas break; 292*0fefa676SJean-Daniel Dupas 293*0fefa676SJean-Daniel Dupas case 'Z': 294*0fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 295*0fefa676SJean-Daniel Dupas return eServerPacketType_Z; 296*0fefa676SJean-Daniel Dupas break; 297576d8834SGreg Clayton } 298576d8834SGreg Clayton return eServerPacketType_unimplemented; 299576d8834SGreg Clayton } 300576d8834SGreg Clayton 301576d8834SGreg Clayton bool 302576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const 303576d8834SGreg Clayton { 304576d8834SGreg Clayton return GetResponseType () == eOK; 30530fdc8d8SChris Lattner } 30630fdc8d8SChris Lattner 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner bool 309576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const 31030fdc8d8SChris Lattner { 311576d8834SGreg Clayton return GetResponseType () == eUnsupported; 31230fdc8d8SChris Lattner } 31330fdc8d8SChris Lattner 31430fdc8d8SChris Lattner bool 315576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const 31630fdc8d8SChris Lattner { 317576d8834SGreg Clayton return GetResponseType () == eResponse; 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner 32030fdc8d8SChris Lattner bool 321576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const 32230fdc8d8SChris Lattner { 323576d8834SGreg Clayton return GetResponseType () == eError && 32430fdc8d8SChris Lattner m_packet.size() == 3 && 32530fdc8d8SChris Lattner isxdigit(m_packet[1]) && 32630fdc8d8SChris Lattner isxdigit(m_packet[2]); 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner 32930fdc8d8SChris Lattner uint8_t 33030fdc8d8SChris Lattner StringExtractorGDBRemote::GetError () 33130fdc8d8SChris Lattner { 332576d8834SGreg Clayton if (GetResponseType() == eError) 33330fdc8d8SChris Lattner { 33430fdc8d8SChris Lattner SetFilePos(1); 33530fdc8d8SChris Lattner return GetHexU8(255); 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner return 0; 33830fdc8d8SChris Lattner } 339e0f8f574SDaniel Malea 340e0f8f574SDaniel Malea size_t 341e0f8f574SDaniel Malea StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str) 342e0f8f574SDaniel Malea { 343e0f8f574SDaniel Malea str.clear(); 344e0f8f574SDaniel Malea char ch; 345e0f8f574SDaniel Malea while (GetBytesLeft()) 346e0f8f574SDaniel Malea { 347e0f8f574SDaniel Malea ch = GetChar(); 348e0f8f574SDaniel Malea if (ch == 0x7d) 349e0f8f574SDaniel Malea ch = (GetChar() ^ 0x20); 350e0f8f574SDaniel Malea str.append(1,ch); 351e0f8f574SDaniel Malea } 352e0f8f574SDaniel Malea return str.size(); 353e0f8f574SDaniel Malea } 354e0f8f574SDaniel Malea 355