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