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 { 67*78baa197SEwan Crawford 68*78baa197SEwan Crawford case '%': 69*78baa197SEwan Crawford return eServerPacketType_notify; 70*78baa197SEwan Crawford 71d314e810SGreg Clayton case '\x03': 728b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_interrupt; 73d314e810SGreg Clayton break; 74d314e810SGreg Clayton 75576d8834SGreg Clayton case '-': 768b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_nack; 77576d8834SGreg Clayton break; 78576d8834SGreg Clayton 79576d8834SGreg Clayton case '+': 808b82f087SGreg Clayton if (packet_size == 1) return eServerPacketType_ack; 81576d8834SGreg Clayton break; 82576d8834SGreg Clayton 838b82f087SGreg Clayton case 'A': 848b82f087SGreg Clayton return eServerPacketType_A; 858b82f087SGreg Clayton 861cb6496eSGreg Clayton case 'Q': 870fefa676SJean-Daniel Dupas 888b82f087SGreg Clayton switch (packet_cstr[1]) 898b82f087SGreg Clayton { 908b82f087SGreg Clayton case 'E': 918b82f087SGreg Clayton if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment; 920fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QEnvironmentHexEncoded:")) return eServerPacketType_QEnvironmentHexEncoded; 938b82f087SGreg Clayton break; 948b82f087SGreg Clayton 958b82f087SGreg Clayton case 'S': 968b82f087SGreg Clayton if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode; 970fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSaveRegisterState")) return eServerPacketType_QSaveRegisterState; 980fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR; 99106d0286SJim Ingham if (PACKET_STARTS_WITH ("QSetDetachOnError:")) return eServerPacketType_QSetDetachOnError; 1000fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN; 1010fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT; 1020fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR; 1030fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir; 1040fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetLogging:")) return eServerPacketType_QSetLogging; 1050fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetMaxPacketSize:")) return eServerPacketType_QSetMaxPacketSize; 1060fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetMaxPayloadSize:")) return eServerPacketType_QSetMaxPayloadSize; 1070fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSetEnableAsyncProfiling;")) return eServerPacketType_QSetEnableAsyncProfiling; 1080fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QSyncThreadState:")) return eServerPacketType_QSyncThreadState; 1098b82f087SGreg Clayton break; 1100fefa676SJean-Daniel Dupas 111e0f8f574SDaniel Malea case 'L': 112e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch; 1130fefa676SJean-Daniel Dupas if (PACKET_MATCHES("QListThreadsInStopReply")) return eServerPacketType_QListThreadsInStopReply; 1140fefa676SJean-Daniel Dupas break; 1150fefa676SJean-Daniel Dupas 1160fefa676SJean-Daniel Dupas case 'R': 1170fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("QRestoreRegisterState:")) return eServerPacketType_QRestoreRegisterState; 1180fefa676SJean-Daniel Dupas break; 1190fefa676SJean-Daniel Dupas 1200fefa676SJean-Daniel Dupas case 'T': 1210fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("QThreadSuffixSupported")) return eServerPacketType_QThreadSuffixSupported; 122e0f8f574SDaniel Malea break; 1238b82f087SGreg Clayton } 1241cb6496eSGreg Clayton break; 1251cb6496eSGreg Clayton 126576d8834SGreg Clayton case 'q': 1278b82f087SGreg Clayton switch (packet_cstr[1]) 1288b82f087SGreg Clayton { 1298b82f087SGreg Clayton case 's': 1308b82f087SGreg Clayton if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo; 1310fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qsThreadInfo")) return eServerPacketType_qsThreadInfo; 1328b82f087SGreg Clayton break; 1338b82f087SGreg Clayton 1348b82f087SGreg Clayton case 'f': 1358b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo; 1360fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qfThreadInfo")) return eServerPacketType_qfThreadInfo; 1378b82f087SGreg Clayton break; 1388b82f087SGreg Clayton 1398b82f087SGreg Clayton case 'C': 1408b82f087SGreg Clayton if (packet_size == 2) return eServerPacketType_qC; 1418b82f087SGreg Clayton break; 1428b82f087SGreg Clayton 1438b82f087SGreg Clayton case 'G': 1448b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName; 145fbb76349SGreg Clayton if (PACKET_MATCHES ("qGetWorkingDir")) return eServerPacketType_qGetWorkingDir; 1460fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qGetPid")) return eServerPacketType_qGetPid; 1470fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qGetProfileData;")) return eServerPacketType_qGetProfileData; 1480fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qGDBServerVersion")) return eServerPacketType_qGDBServerVersion; 1498b82f087SGreg Clayton break; 1508b82f087SGreg Clayton 1518b82f087SGreg Clayton case 'H': 1528b82f087SGreg Clayton if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo; 1538b82f087SGreg Clayton break; 1548b82f087SGreg Clayton 155e0f8f574SDaniel Malea case 'K': 156e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess; 157e0f8f574SDaniel Malea break; 158e0f8f574SDaniel Malea 1598b82f087SGreg Clayton case 'L': 160e0f8f574SDaniel Malea if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer; 1618b82f087SGreg Clayton if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess; 1628b82f087SGreg Clayton break; 1638b82f087SGreg Clayton 1640fefa676SJean-Daniel Dupas case 'M': 1650fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qMemoryRegionInfo:")) return eServerPacketType_qMemoryRegionInfo; 1660fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qMemoryRegionInfo")) return eServerPacketType_qMemoryRegionInfoSupported; 1676801be33SOleksiy Vyalov if (PACKET_STARTS_WITH ("qModuleInfo:")) return eServerPacketType_qModuleInfo; 1680fefa676SJean-Daniel Dupas break; 1690fefa676SJean-Daniel Dupas 1708b82f087SGreg Clayton case 'P': 1718b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID; 172fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_shell:")) return eServerPacketType_qPlatform_shell; 173fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_mkdir:")) return eServerPacketType_qPlatform_mkdir; 174fbb76349SGreg Clayton if (PACKET_STARTS_WITH ("qPlatform_chmod:")) return eServerPacketType_qPlatform_chmod; 1750fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qProcessInfo")) return eServerPacketType_qProcessInfo; 1768b82f087SGreg Clayton break; 1778b82f087SGreg Clayton 1780fefa676SJean-Daniel Dupas case 'R': 1790fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qRcmd,")) return eServerPacketType_qRcmd; 1800fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qRegisterInfo")) return eServerPacketType_qRegisterInfo; 1810fefa676SJean-Daniel Dupas break; 182e0f8f574SDaniel Malea 1838b82f087SGreg Clayton case 'S': 1848b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest; 1850fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qShlibInfoAddr")) return eServerPacketType_qShlibInfoAddr; 1860fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qStepPacketSupported")) return eServerPacketType_qStepPacketSupported; 187af245d11STodd Fiala if (PACKET_STARTS_WITH ("qSupported")) return eServerPacketType_qSupported; 1880fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qSyncThreadStateSupported")) return eServerPacketType_qSyncThreadStateSupported; 1890fefa676SJean-Daniel Dupas break; 1900fefa676SJean-Daniel Dupas 1910fefa676SJean-Daniel Dupas case 'T': 1920fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qThreadExtraInfo,")) return eServerPacketType_qThreadExtraInfo; 1930fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qThreadStopInfo")) return eServerPacketType_qThreadStopInfo; 1948b82f087SGreg Clayton break; 1958b82f087SGreg Clayton 1968b82f087SGreg Clayton case 'U': 1978b82f087SGreg Clayton if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName; 1988b82f087SGreg Clayton break; 1990fefa676SJean-Daniel Dupas 2000fefa676SJean-Daniel Dupas case 'V': 2010fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qVAttachOrWaitSupported")) return eServerPacketType_qVAttachOrWaitSupported; 2020fefa676SJean-Daniel Dupas break; 2030fefa676SJean-Daniel Dupas 2040fefa676SJean-Daniel Dupas case 'W': 2050fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("qWatchpointSupportInfo:")) return eServerPacketType_qWatchpointSupportInfo; 2060fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("qWatchpointSupportInfo")) return eServerPacketType_qWatchpointSupportInfoSupported; 2070fefa676SJean-Daniel Dupas break; 208af245d11STodd Fiala 209af245d11STodd Fiala case 'X': 210af245d11STodd Fiala if (PACKET_STARTS_WITH ("qXfer:auxv:read::")) return eServerPacketType_qXfer_auxv_read; 211af245d11STodd Fiala break; 2128b82f087SGreg Clayton } 213576d8834SGreg Clayton break; 214e0f8f574SDaniel Malea case 'v': 215e0f8f574SDaniel Malea if (PACKET_STARTS_WITH("vFile:")) 216e0f8f574SDaniel Malea { 217fbb76349SGreg Clayton if (PACKET_STARTS_WITH("vFile:open:")) return eServerPacketType_vFile_open; 218fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:close:")) return eServerPacketType_vFile_close; 219fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:pread")) return eServerPacketType_vFile_pread; 220fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:pwrite")) return eServerPacketType_vFile_pwrite; 221fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:size")) return eServerPacketType_vFile_size; 222fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:exists")) return eServerPacketType_vFile_exists; 223fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:stat")) return eServerPacketType_vFile_stat; 224fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:mode")) return eServerPacketType_vFile_mode; 225fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:MD5")) return eServerPacketType_vFile_md5; 226fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:symlink")) return eServerPacketType_vFile_symlink; 227fbb76349SGreg Clayton else if (PACKET_STARTS_WITH("vFile:unlink")) return eServerPacketType_vFile_unlink; 228e0f8f574SDaniel Malea 2290fefa676SJean-Daniel Dupas } else { 2300fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttach;")) return eServerPacketType_vAttach; 2310fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachWait;")) return eServerPacketType_vAttachWait; 2320fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachOrWait;")) return eServerPacketType_vAttachOrWait; 2330fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH ("vAttachName;")) return eServerPacketType_vAttachName; 2340fefa676SJean-Daniel Dupas if (PACKET_STARTS_WITH("vCont;")) return eServerPacketType_vCont; 2350fefa676SJean-Daniel Dupas if (PACKET_MATCHES ("vCont?")) return eServerPacketType_vCont_actions; 236e0f8f574SDaniel Malea } 237e0f8f574SDaniel Malea break; 2380fefa676SJean-Daniel Dupas case '_': 2390fefa676SJean-Daniel Dupas switch (packet_cstr[1]) 2400fefa676SJean-Daniel Dupas { 2410fefa676SJean-Daniel Dupas case 'M': 2420fefa676SJean-Daniel Dupas return eServerPacketType__M; 2430fefa676SJean-Daniel Dupas 2440fefa676SJean-Daniel Dupas case 'm': 2450fefa676SJean-Daniel Dupas return eServerPacketType__m; 2460fefa676SJean-Daniel Dupas } 2470fefa676SJean-Daniel Dupas break; 2480fefa676SJean-Daniel Dupas 2490fefa676SJean-Daniel Dupas case '?': 2500fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_stop_reason; 2510fefa676SJean-Daniel Dupas break; 2520fefa676SJean-Daniel Dupas 2530fefa676SJean-Daniel Dupas case 'c': 2540fefa676SJean-Daniel Dupas return eServerPacketType_c; 2550fefa676SJean-Daniel Dupas 2560fefa676SJean-Daniel Dupas case 'C': 2570fefa676SJean-Daniel Dupas return eServerPacketType_C; 2580fefa676SJean-Daniel Dupas 2590fefa676SJean-Daniel Dupas case 'D': 2600fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_D; 2610fefa676SJean-Daniel Dupas break; 2620fefa676SJean-Daniel Dupas 2630fefa676SJean-Daniel Dupas case 'g': 2640fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_g; 2650fefa676SJean-Daniel Dupas break; 2660fefa676SJean-Daniel Dupas 2670fefa676SJean-Daniel Dupas case 'G': 2680fefa676SJean-Daniel Dupas return eServerPacketType_G; 2690fefa676SJean-Daniel Dupas 2700fefa676SJean-Daniel Dupas case 'H': 2710fefa676SJean-Daniel Dupas return eServerPacketType_H; 2720fefa676SJean-Daniel Dupas 273e0be425aSVince Harron case 'I': 274e0be425aSVince Harron return eServerPacketType_I; 275e0be425aSVince Harron 2760fefa676SJean-Daniel Dupas case 'k': 2770fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_k; 2780fefa676SJean-Daniel Dupas break; 2790fefa676SJean-Daniel Dupas 2800fefa676SJean-Daniel Dupas case 'm': 2810fefa676SJean-Daniel Dupas return eServerPacketType_m; 2820fefa676SJean-Daniel Dupas 2830fefa676SJean-Daniel Dupas case 'M': 2840fefa676SJean-Daniel Dupas return eServerPacketType_M; 2850fefa676SJean-Daniel Dupas 2860fefa676SJean-Daniel Dupas case 'p': 2870fefa676SJean-Daniel Dupas return eServerPacketType_p; 2880fefa676SJean-Daniel Dupas 2890fefa676SJean-Daniel Dupas case 'P': 2900fefa676SJean-Daniel Dupas return eServerPacketType_P; 2910fefa676SJean-Daniel Dupas 2920fefa676SJean-Daniel Dupas case 's': 2930fefa676SJean-Daniel Dupas if (packet_size == 1) return eServerPacketType_s; 2940fefa676SJean-Daniel Dupas break; 2950fefa676SJean-Daniel Dupas 2960fefa676SJean-Daniel Dupas case 'S': 2970fefa676SJean-Daniel Dupas return eServerPacketType_S; 2980fefa676SJean-Daniel Dupas 2990fefa676SJean-Daniel Dupas case 'T': 3000fefa676SJean-Daniel Dupas return eServerPacketType_T; 3010fefa676SJean-Daniel Dupas 3020fefa676SJean-Daniel Dupas case 'z': 3030fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 3040fefa676SJean-Daniel Dupas return eServerPacketType_z; 3050fefa676SJean-Daniel Dupas break; 3060fefa676SJean-Daniel Dupas 3070fefa676SJean-Daniel Dupas case 'Z': 3080fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 3090fefa676SJean-Daniel Dupas return eServerPacketType_Z; 3100fefa676SJean-Daniel Dupas break; 311576d8834SGreg Clayton } 312576d8834SGreg Clayton return eServerPacketType_unimplemented; 313576d8834SGreg Clayton } 314576d8834SGreg Clayton 315576d8834SGreg Clayton bool 316576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const 317576d8834SGreg Clayton { 318576d8834SGreg Clayton return GetResponseType () == eOK; 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner bool 323576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const 32430fdc8d8SChris Lattner { 325576d8834SGreg Clayton return GetResponseType () == eUnsupported; 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner bool 329576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const 33030fdc8d8SChris Lattner { 331576d8834SGreg Clayton return GetResponseType () == eResponse; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner bool 335576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const 33630fdc8d8SChris Lattner { 337576d8834SGreg Clayton return GetResponseType () == eError && 33830fdc8d8SChris Lattner m_packet.size() == 3 && 33930fdc8d8SChris Lattner isxdigit(m_packet[1]) && 34030fdc8d8SChris Lattner isxdigit(m_packet[2]); 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner uint8_t 34430fdc8d8SChris Lattner StringExtractorGDBRemote::GetError () 34530fdc8d8SChris Lattner { 346576d8834SGreg Clayton if (GetResponseType() == eError) 34730fdc8d8SChris Lattner { 34830fdc8d8SChris Lattner SetFilePos(1); 34930fdc8d8SChris Lattner return GetHexU8(255); 35030fdc8d8SChris Lattner } 35130fdc8d8SChris Lattner return 0; 35230fdc8d8SChris Lattner } 353e0f8f574SDaniel Malea 354e0f8f574SDaniel Malea size_t 355e0f8f574SDaniel Malea StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str) 356e0f8f574SDaniel Malea { 357109534cbSGreg Clayton // Just get the data bytes in the string as GDBRemoteCommunication::CheckForPacket() 358109534cbSGreg Clayton // already removes any 0x7d escaped characters. If any 0x7d characters are left in 359109534cbSGreg Clayton // the packet, then they are supposed to be there... 360e0f8f574SDaniel Malea str.clear(); 361109534cbSGreg Clayton const size_t bytes_left = GetBytesLeft(); 362109534cbSGreg Clayton if (bytes_left > 0) 363e0f8f574SDaniel Malea { 364109534cbSGreg Clayton str.assign(m_packet, m_index, bytes_left); 365109534cbSGreg Clayton m_index += bytes_left; 366e0f8f574SDaniel Malea } 367e0f8f574SDaniel Malea return str.size(); 368e0f8f574SDaniel Malea } 369e0f8f574SDaniel Malea 370