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 #include "Utility/StringExtractorGDBRemote.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 17 18 19 StringExtractorGDBRemote::ResponseType 20 StringExtractorGDBRemote::GetResponseType () const 21 { 22 if (m_packet.empty()) 23 return eUnsupported; 24 25 switch (m_packet[0]) 26 { 27 case 'E': 28 if (m_packet.size() == 3 && 29 isxdigit(m_packet[1]) && 30 isxdigit(m_packet[2])) 31 return eError; 32 break; 33 34 case 'O': 35 if (m_packet.size() == 2 && m_packet[1] == 'K') 36 return eOK; 37 break; 38 39 case '+': 40 if (m_packet.size() == 1) 41 return eAck; 42 break; 43 44 case '-': 45 if (m_packet.size() == 1) 46 return eNack; 47 break; 48 } 49 return eResponse; 50 } 51 52 StringExtractorGDBRemote::ServerPacketType 53 StringExtractorGDBRemote::GetServerPacketType () const 54 { 55 // Empty is not a supported packet... 56 if (m_packet.empty()) 57 return eServerPacketType_invalid; 58 59 const char *packet_cstr = m_packet.c_str(); 60 switch (m_packet[0]) 61 { 62 case '\x03': 63 if (m_packet.size() == 1) 64 return eServerPacketType_interrupt; 65 break; 66 67 case '-': 68 if (m_packet.size() == 1) 69 return eServerPacketType_nack; 70 break; 71 72 case '+': 73 if (m_packet.size() == 1) 74 return eServerPacketType_ack; 75 break; 76 77 case 'q': 78 if (strcmp (packet_cstr, "qHostInfo") == 0) 79 return eServerPacketType_qHostInfo; 80 break; 81 } 82 return eServerPacketType_unimplemented; 83 } 84 85 bool 86 StringExtractorGDBRemote::IsOKResponse() const 87 { 88 return GetResponseType () == eOK; 89 } 90 91 92 bool 93 StringExtractorGDBRemote::IsUnsupportedResponse() const 94 { 95 return GetResponseType () == eUnsupported; 96 } 97 98 bool 99 StringExtractorGDBRemote::IsNormalResponse() const 100 { 101 return GetResponseType () == eResponse; 102 } 103 104 bool 105 StringExtractorGDBRemote::IsErrorResponse() const 106 { 107 return GetResponseType () == eError && 108 m_packet.size() == 3 && 109 isxdigit(m_packet[1]) && 110 isxdigit(m_packet[2]); 111 } 112 113 uint8_t 114 StringExtractorGDBRemote::GetError () 115 { 116 if (GetResponseType() == eError) 117 { 118 SetFilePos(1); 119 return GetHexU8(255); 120 } 121 return 0; 122 } 123