1 //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // C Includes 11 #include <string.h> 12 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "Utility/StringExtractorGDBRemote.h" 17 18 19 20 StringExtractorGDBRemote::ResponseType 21 StringExtractorGDBRemote::GetResponseType () const 22 { 23 if (m_packet.empty()) 24 return eUnsupported; 25 26 switch (m_packet[0]) 27 { 28 case 'E': 29 if (m_packet.size() == 3 && 30 isxdigit(m_packet[1]) && 31 isxdigit(m_packet[2])) 32 return eError; 33 break; 34 35 case 'O': 36 if (m_packet.size() == 2 && m_packet[1] == 'K') 37 return eOK; 38 break; 39 40 case '+': 41 if (m_packet.size() == 1) 42 return eAck; 43 break; 44 45 case '-': 46 if (m_packet.size() == 1) 47 return eNack; 48 break; 49 } 50 return eResponse; 51 } 52 53 StringExtractorGDBRemote::ServerPacketType 54 StringExtractorGDBRemote::GetServerPacketType () const 55 { 56 // Empty is not a supported packet... 57 if (m_packet.empty()) 58 return eServerPacketType_invalid; 59 60 const char *packet_cstr = m_packet.c_str(); 61 switch (m_packet[0]) 62 { 63 case '\x03': 64 if (m_packet.size() == 1) 65 return eServerPacketType_interrupt; 66 break; 67 68 case '-': 69 if (m_packet.size() == 1) 70 return eServerPacketType_nack; 71 break; 72 73 case '+': 74 if (m_packet.size() == 1) 75 return eServerPacketType_ack; 76 break; 77 78 case 'Q': 79 if (strcmp (packet_cstr, "QStartNoAckMode") == 0) 80 return eServerPacketType_QStartNoAckMode; 81 break; 82 83 case 'q': 84 if (packet_cstr[1] == 'S' && 0 == ::strncmp(packet_cstr, "qSpeedTest:", strlen("qSpeedTest:"))) 85 return eServerPacketType_qSpeedTest; 86 else if (packet_cstr[1] == 'H' && 0 == ::strcmp (packet_cstr, "qHostInfo")) 87 return eServerPacketType_qHostInfo; 88 else if (packet_cstr[1] == 'P' && 0 == ::strncmp(packet_cstr, "qProcessInfoPID:", strlen("qProcessInfoPID:"))) 89 return eServerPacketType_qProcessInfoPID; 90 else if (packet_cstr[1] == 'f' && 0 == ::strncmp(packet_cstr, "qfProcessInfo", strlen("qfProcessInfo"))) 91 return eServerPacketType_qfProcessInfo; 92 else if (packet_cstr[1] == 'U' && 0 == ::strncmp(packet_cstr, "qUserName:", strlen("qUserName:"))) 93 return eServerPacketType_qUserName; 94 else if (packet_cstr[1] == 'G' && 0 == ::strncmp(packet_cstr, "qGroupName:", strlen("qGroupName:"))) 95 return eServerPacketType_qGroupName; 96 else if (packet_cstr[1] == 's' && 0 == ::strcmp (packet_cstr, "qsProcessInfo")) 97 return eServerPacketType_qsProcessInfo; 98 break; 99 } 100 return eServerPacketType_unimplemented; 101 } 102 103 bool 104 StringExtractorGDBRemote::IsOKResponse() const 105 { 106 return GetResponseType () == eOK; 107 } 108 109 110 bool 111 StringExtractorGDBRemote::IsUnsupportedResponse() const 112 { 113 return GetResponseType () == eUnsupported; 114 } 115 116 bool 117 StringExtractorGDBRemote::IsNormalResponse() const 118 { 119 return GetResponseType () == eResponse; 120 } 121 122 bool 123 StringExtractorGDBRemote::IsErrorResponse() const 124 { 125 return GetResponseType () == eError && 126 m_packet.size() == 3 && 127 isxdigit(m_packet[1]) && 128 isxdigit(m_packet[2]); 129 } 130 131 uint8_t 132 StringExtractorGDBRemote::GetError () 133 { 134 if (GetResponseType() == eError) 135 { 136 SetFilePos(1); 137 return GetHexU8(255); 138 } 139 return 0; 140 } 141