1 //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 // Other libraries and framework includes
16 #include "Utility/StringExtractorGDBRemote.h"
20 StringExtractorGDBRemote::ResponseType
21 StringExtractorGDBRemote::GetResponseType () const
29 if (m_packet.size() == 3 &&
30 isxdigit(m_packet[1]) &&
31 isxdigit(m_packet[2]))
36 if (m_packet.size() == 2 && m_packet[1] == 'K')
41 if (m_packet.size() == 1)
46 if (m_packet.size() == 1)
53 StringExtractorGDBRemote::ServerPacketType
54 StringExtractorGDBRemote::GetServerPacketType () const
56 #define PACKET_MATCHES(s) ((packet_size == (sizeof(s)-1)) && (strcmp((packet_cstr),(s)) == 0))
57 #define PACKET_STARTS_WITH(s) ((packet_size >= (sizeof(s)-1)) && ::strncmp(packet_cstr, s, (sizeof(s)-1))==0)
59 // Empty is not a supported packet...
61 return eServerPacketType_invalid;
63 const size_t packet_size = m_packet.size();
64 const char *packet_cstr = m_packet.c_str();
68 if (packet_size == 1) return eServerPacketType_interrupt;
72 if (packet_size == 1) return eServerPacketType_nack;
76 if (packet_size == 1) return eServerPacketType_ack;
80 return eServerPacketType_A;
83 switch (packet_cstr[1])
86 if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment;
90 if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode;
91 else if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR;
92 else if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN;
93 else if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT;
94 else if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR;
95 else if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir;
101 switch (packet_cstr[1])
104 if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo;
108 if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo;
112 if (packet_size == 2) return eServerPacketType_qC;
116 if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName;
120 if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
124 if (PACKET_MATCHES ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
125 if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
129 if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
133 if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest;
137 if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName;
142 return eServerPacketType_unimplemented;
146 StringExtractorGDBRemote::IsOKResponse() const
148 return GetResponseType () == eOK;
153 StringExtractorGDBRemote::IsUnsupportedResponse() const
155 return GetResponseType () == eUnsupported;
159 StringExtractorGDBRemote::IsNormalResponse() const
161 return GetResponseType () == eResponse;
165 StringExtractorGDBRemote::IsErrorResponse() const
167 return GetResponseType () == eError &&
168 m_packet.size() == 3 &&
169 isxdigit(m_packet[1]) &&
170 isxdigit(m_packet[2]);
174 StringExtractorGDBRemote::GetError ()
176 if (GetResponseType() == eError)
179 return GetHexU8(255);