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     {
6778baa197SEwan Crawford 
6878baa197SEwan Crawford     case '%':
6978baa197SEwan Crawford         return eServerPacketType_notify;
7078baa197SEwan 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 
143*420562aaSGreg Clayton         case 'E':
144*420562aaSGreg Clayton             if (PACKET_STARTS_WITH ("qEcho:"))                  return eServerPacketType_qEcho;
145*420562aaSGreg Clayton             break;
146*420562aaSGreg Clayton 
1478b82f087SGreg Clayton         case 'G':
1488b82f087SGreg Clayton             if (PACKET_STARTS_WITH ("qGroupName:"))             return eServerPacketType_qGroupName;
149fbb76349SGreg Clayton             if (PACKET_MATCHES ("qGetWorkingDir"))              return eServerPacketType_qGetWorkingDir;
1500fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qGetPid"))                     return eServerPacketType_qGetPid;
1510fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qGetProfileData;"))        return eServerPacketType_qGetProfileData;
1520fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qGDBServerVersion"))           return eServerPacketType_qGDBServerVersion;
1538b82f087SGreg Clayton             break;
1548b82f087SGreg Clayton 
1558b82f087SGreg Clayton         case 'H':
1568b82f087SGreg Clayton             if (PACKET_MATCHES ("qHostInfo"))                   return eServerPacketType_qHostInfo;
1578b82f087SGreg Clayton             break;
1588b82f087SGreg Clayton 
159e0f8f574SDaniel Malea         case 'K':
160e0f8f574SDaniel Malea             if (PACKET_STARTS_WITH ("qKillSpawnedProcess"))     return eServerPacketType_qKillSpawnedProcess;
161e0f8f574SDaniel Malea             break;
162e0f8f574SDaniel Malea 
1638b82f087SGreg Clayton         case 'L':
164e0f8f574SDaniel Malea             if (PACKET_STARTS_WITH ("qLaunchGDBServer"))        return eServerPacketType_qLaunchGDBServer;
1658b82f087SGreg Clayton             if (PACKET_MATCHES ("qLaunchSuccess"))              return eServerPacketType_qLaunchSuccess;
1668b82f087SGreg Clayton             break;
1678b82f087SGreg Clayton 
1680fefa676SJean-Daniel Dupas         case 'M':
1690fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qMemoryRegionInfo:"))      return eServerPacketType_qMemoryRegionInfo;
1700fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qMemoryRegionInfo"))           return eServerPacketType_qMemoryRegionInfoSupported;
1716801be33SOleksiy Vyalov             if (PACKET_STARTS_WITH ("qModuleInfo:"))             return eServerPacketType_qModuleInfo;
1720fefa676SJean-Daniel Dupas             break;
1730fefa676SJean-Daniel Dupas 
1748b82f087SGreg Clayton         case 'P':
1758b82f087SGreg Clayton             if (PACKET_STARTS_WITH ("qProcessInfoPID:"))        return eServerPacketType_qProcessInfoPID;
176fbb76349SGreg Clayton             if (PACKET_STARTS_WITH ("qPlatform_shell:"))        return eServerPacketType_qPlatform_shell;
177fbb76349SGreg Clayton             if (PACKET_STARTS_WITH ("qPlatform_mkdir:"))        return eServerPacketType_qPlatform_mkdir;
178fbb76349SGreg Clayton             if (PACKET_STARTS_WITH ("qPlatform_chmod:"))        return eServerPacketType_qPlatform_chmod;
1790fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qProcessInfo"))                return eServerPacketType_qProcessInfo;
1808b82f087SGreg Clayton             break;
1818b82f087SGreg Clayton 
1820fefa676SJean-Daniel Dupas         case 'R':
1830fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qRcmd,"))                  return eServerPacketType_qRcmd;
1840fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qRegisterInfo"))           return eServerPacketType_qRegisterInfo;
1850fefa676SJean-Daniel Dupas             break;
186e0f8f574SDaniel Malea 
1878b82f087SGreg Clayton         case 'S':
1888b82f087SGreg Clayton             if (PACKET_STARTS_WITH ("qSpeedTest:"))             return eServerPacketType_qSpeedTest;
1890fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qShlibInfoAddr"))              return eServerPacketType_qShlibInfoAddr;
1900fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qStepPacketSupported"))        return eServerPacketType_qStepPacketSupported;
191af245d11STodd Fiala             if (PACKET_STARTS_WITH ("qSupported"))              return eServerPacketType_qSupported;
1920fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qSyncThreadStateSupported"))   return eServerPacketType_qSyncThreadStateSupported;
1930fefa676SJean-Daniel Dupas             break;
1940fefa676SJean-Daniel Dupas 
1950fefa676SJean-Daniel Dupas         case 'T':
1960fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qThreadExtraInfo,"))       return eServerPacketType_qThreadExtraInfo;
1970fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qThreadStopInfo"))         return eServerPacketType_qThreadStopInfo;
1988b82f087SGreg Clayton             break;
1998b82f087SGreg Clayton 
2008b82f087SGreg Clayton         case 'U':
2018b82f087SGreg Clayton             if (PACKET_STARTS_WITH ("qUserName:"))              return eServerPacketType_qUserName;
2028b82f087SGreg Clayton             break;
2030fefa676SJean-Daniel Dupas 
2040fefa676SJean-Daniel Dupas         case 'V':
2050fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qVAttachOrWaitSupported"))     return eServerPacketType_qVAttachOrWaitSupported;
2060fefa676SJean-Daniel Dupas             break;
2070fefa676SJean-Daniel Dupas 
2080fefa676SJean-Daniel Dupas         case 'W':
2090fefa676SJean-Daniel Dupas             if (PACKET_STARTS_WITH ("qWatchpointSupportInfo:")) return eServerPacketType_qWatchpointSupportInfo;
2100fefa676SJean-Daniel Dupas             if (PACKET_MATCHES ("qWatchpointSupportInfo"))      return eServerPacketType_qWatchpointSupportInfoSupported;
2110fefa676SJean-Daniel Dupas             break;
212af245d11STodd Fiala 
213af245d11STodd Fiala         case 'X':
214af245d11STodd Fiala             if (PACKET_STARTS_WITH ("qXfer:auxv:read::"))       return eServerPacketType_qXfer_auxv_read;
215af245d11STodd Fiala             break;
2168b82f087SGreg Clayton         }
217576d8834SGreg Clayton         break;
218e0f8f574SDaniel Malea     case 'v':
219e0f8f574SDaniel Malea             if (PACKET_STARTS_WITH("vFile:"))
220e0f8f574SDaniel Malea             {
221fbb76349SGreg Clayton                 if (PACKET_STARTS_WITH("vFile:open:"))          return eServerPacketType_vFile_open;
222fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:close:"))    return eServerPacketType_vFile_close;
223fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:pread"))     return eServerPacketType_vFile_pread;
224fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:pwrite"))    return eServerPacketType_vFile_pwrite;
225fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:size"))      return eServerPacketType_vFile_size;
226fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:exists"))    return eServerPacketType_vFile_exists;
227fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:stat"))      return eServerPacketType_vFile_stat;
228fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:mode"))      return eServerPacketType_vFile_mode;
229fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:MD5"))       return eServerPacketType_vFile_md5;
230fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:symlink"))   return eServerPacketType_vFile_symlink;
231fbb76349SGreg Clayton                 else if (PACKET_STARTS_WITH("vFile:unlink"))    return eServerPacketType_vFile_unlink;
232e0f8f574SDaniel Malea 
2330fefa676SJean-Daniel Dupas             } else {
2340fefa676SJean-Daniel Dupas               if (PACKET_STARTS_WITH ("vAttach;"))              return eServerPacketType_vAttach;
2350fefa676SJean-Daniel Dupas               if (PACKET_STARTS_WITH ("vAttachWait;"))          return eServerPacketType_vAttachWait;
2360fefa676SJean-Daniel Dupas               if (PACKET_STARTS_WITH ("vAttachOrWait;"))        return eServerPacketType_vAttachOrWait;
2370fefa676SJean-Daniel Dupas               if (PACKET_STARTS_WITH ("vAttachName;"))          return eServerPacketType_vAttachName;
2380fefa676SJean-Daniel Dupas               if (PACKET_STARTS_WITH("vCont;"))                 return eServerPacketType_vCont;
2390fefa676SJean-Daniel Dupas               if (PACKET_MATCHES ("vCont?"))                    return eServerPacketType_vCont_actions;
240e0f8f574SDaniel Malea             }
241e0f8f574SDaniel Malea             break;
2420fefa676SJean-Daniel Dupas       case '_':
2430fefa676SJean-Daniel Dupas         switch (packet_cstr[1])
2440fefa676SJean-Daniel Dupas         {
2450fefa676SJean-Daniel Dupas         case 'M':
2460fefa676SJean-Daniel Dupas             return eServerPacketType__M;
2470fefa676SJean-Daniel Dupas 
2480fefa676SJean-Daniel Dupas         case 'm':
2490fefa676SJean-Daniel Dupas             return eServerPacketType__m;
2500fefa676SJean-Daniel Dupas         }
2510fefa676SJean-Daniel Dupas         break;
2520fefa676SJean-Daniel Dupas 
2530fefa676SJean-Daniel Dupas       case '?':
2540fefa676SJean-Daniel Dupas         if (packet_size == 1) return eServerPacketType_stop_reason;
2550fefa676SJean-Daniel Dupas         break;
2560fefa676SJean-Daniel Dupas 
2570fefa676SJean-Daniel Dupas       case 'c':
2580fefa676SJean-Daniel Dupas         return eServerPacketType_c;
2590fefa676SJean-Daniel Dupas 
2600fefa676SJean-Daniel Dupas       case 'C':
2610fefa676SJean-Daniel Dupas         return eServerPacketType_C;
2620fefa676SJean-Daniel Dupas 
2630fefa676SJean-Daniel Dupas       case 'D':
2640fefa676SJean-Daniel Dupas         if (packet_size == 1) return eServerPacketType_D;
2650fefa676SJean-Daniel Dupas         break;
2660fefa676SJean-Daniel Dupas 
2670fefa676SJean-Daniel Dupas       case 'g':
2680fefa676SJean-Daniel Dupas         if (packet_size == 1) return eServerPacketType_g;
2690fefa676SJean-Daniel Dupas         break;
2700fefa676SJean-Daniel Dupas 
2710fefa676SJean-Daniel Dupas       case 'G':
2720fefa676SJean-Daniel Dupas         return eServerPacketType_G;
2730fefa676SJean-Daniel Dupas 
2740fefa676SJean-Daniel Dupas       case 'H':
2750fefa676SJean-Daniel Dupas         return eServerPacketType_H;
2760fefa676SJean-Daniel Dupas 
277e0be425aSVince Harron       case 'I':
278e0be425aSVince Harron         return eServerPacketType_I;
279e0be425aSVince Harron 
2800fefa676SJean-Daniel Dupas       case 'k':
2810fefa676SJean-Daniel Dupas         if (packet_size == 1) return eServerPacketType_k;
2820fefa676SJean-Daniel Dupas         break;
2830fefa676SJean-Daniel Dupas 
2840fefa676SJean-Daniel Dupas       case 'm':
2850fefa676SJean-Daniel Dupas         return eServerPacketType_m;
2860fefa676SJean-Daniel Dupas 
2870fefa676SJean-Daniel Dupas       case 'M':
2880fefa676SJean-Daniel Dupas         return eServerPacketType_M;
2890fefa676SJean-Daniel Dupas 
2900fefa676SJean-Daniel Dupas       case 'p':
2910fefa676SJean-Daniel Dupas         return eServerPacketType_p;
2920fefa676SJean-Daniel Dupas 
2930fefa676SJean-Daniel Dupas       case 'P':
2940fefa676SJean-Daniel Dupas         return eServerPacketType_P;
2950fefa676SJean-Daniel Dupas 
2960fefa676SJean-Daniel Dupas       case 's':
2970fefa676SJean-Daniel Dupas         if (packet_size == 1) return eServerPacketType_s;
2980fefa676SJean-Daniel Dupas         break;
2990fefa676SJean-Daniel Dupas 
3000fefa676SJean-Daniel Dupas       case 'S':
3010fefa676SJean-Daniel Dupas         return eServerPacketType_S;
3020fefa676SJean-Daniel Dupas 
3030fefa676SJean-Daniel Dupas       case 'T':
3040fefa676SJean-Daniel Dupas         return eServerPacketType_T;
3050fefa676SJean-Daniel Dupas 
3060fefa676SJean-Daniel Dupas       case 'z':
3070fefa676SJean-Daniel Dupas         if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
3080fefa676SJean-Daniel Dupas           return eServerPacketType_z;
3090fefa676SJean-Daniel Dupas         break;
3100fefa676SJean-Daniel Dupas 
3110fefa676SJean-Daniel Dupas       case 'Z':
3120fefa676SJean-Daniel Dupas         if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
3130fefa676SJean-Daniel Dupas           return eServerPacketType_Z;
3140fefa676SJean-Daniel Dupas         break;
315576d8834SGreg Clayton     }
316576d8834SGreg Clayton     return eServerPacketType_unimplemented;
317576d8834SGreg Clayton }
318576d8834SGreg Clayton 
319576d8834SGreg Clayton bool
320576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const
321576d8834SGreg Clayton {
322576d8834SGreg Clayton     return GetResponseType () == eOK;
32330fdc8d8SChris Lattner }
32430fdc8d8SChris Lattner 
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner bool
327576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const
32830fdc8d8SChris Lattner {
329576d8834SGreg Clayton     return GetResponseType () == eUnsupported;
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
33230fdc8d8SChris Lattner bool
333576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const
33430fdc8d8SChris Lattner {
335576d8834SGreg Clayton     return GetResponseType () == eResponse;
33630fdc8d8SChris Lattner }
33730fdc8d8SChris Lattner 
33830fdc8d8SChris Lattner bool
339576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const
34030fdc8d8SChris Lattner {
341576d8834SGreg Clayton     return GetResponseType () == eError &&
34230fdc8d8SChris Lattner            m_packet.size() == 3 &&
34330fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
34430fdc8d8SChris Lattner            isxdigit(m_packet[2]);
34530fdc8d8SChris Lattner }
34630fdc8d8SChris Lattner 
34730fdc8d8SChris Lattner uint8_t
34830fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
34930fdc8d8SChris Lattner {
350576d8834SGreg Clayton     if (GetResponseType() == eError)
35130fdc8d8SChris Lattner     {
35230fdc8d8SChris Lattner         SetFilePos(1);
35330fdc8d8SChris Lattner         return GetHexU8(255);
35430fdc8d8SChris Lattner     }
35530fdc8d8SChris Lattner     return 0;
35630fdc8d8SChris Lattner }
357e0f8f574SDaniel Malea 
358e0f8f574SDaniel Malea size_t
359e0f8f574SDaniel Malea StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str)
360e0f8f574SDaniel Malea {
361109534cbSGreg Clayton     // Just get the data bytes in the string as GDBRemoteCommunication::CheckForPacket()
362109534cbSGreg Clayton     // already removes any 0x7d escaped characters. If any 0x7d characters are left in
363109534cbSGreg Clayton     // the packet, then they are supposed to be there...
364e0f8f574SDaniel Malea     str.clear();
365109534cbSGreg Clayton     const size_t bytes_left = GetBytesLeft();
366109534cbSGreg Clayton     if (bytes_left > 0)
367e0f8f574SDaniel Malea     {
368109534cbSGreg Clayton         str.assign(m_packet, m_index, bytes_left);
369109534cbSGreg Clayton         m_index += bytes_left;
370e0f8f574SDaniel Malea     }
371e0f8f574SDaniel Malea     return str.size();
372e0f8f574SDaniel Malea }
373e0f8f574SDaniel Malea 
374