blob: 3c0a9cab86f3ea33ab5c979c6a63fe02ad831ebb [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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
Chris Lattner24943d22010-06-08 16:52:24 +000010// C Includes
Stephen Wilson4b274e82011-03-23 02:02:29 +000011#include <string.h>
12
Chris Lattner24943d22010-06-08 16:52:24 +000013// C++ Includes
14// Other libraries and framework includes
15// Project includes
Stephen Wilson4b274e82011-03-23 02:02:29 +000016#include "Utility/StringExtractorGDBRemote.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18
19
Greg Clayton61d043b2011-03-22 04:00:09 +000020StringExtractorGDBRemote::ResponseType
21StringExtractorGDBRemote::GetResponseType () const
Chris Lattner24943d22010-06-08 16:52:24 +000022{
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
Greg Clayton61d043b2011-03-22 04:00:09 +000053StringExtractorGDBRemote::ServerPacketType
54StringExtractorGDBRemote::GetServerPacketType () const
Chris Lattner24943d22010-06-08 16:52:24 +000055{
Greg Clayton61d043b2011-03-22 04:00:09 +000056 // 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 {
Greg Claytoncb8977d2011-03-23 00:09:55 +000063 case '\x03':
64 if (m_packet.size() == 1)
65 return eServerPacketType_interrupt;
66 break;
67
Greg Clayton61d043b2011-03-22 04:00:09 +000068 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
Greg Clayton58e26e02011-03-24 04:28:38 +000078 case 'Q':
79 if (strcmp (packet_cstr, "QStartNoAckMode") == 0)
80 return eServerPacketType_QStartNoAckMode;
81 break;
82
Greg Clayton61d043b2011-03-22 04:00:09 +000083 case 'q':
Greg Clayton06d7cc82011-04-04 18:18:57 +000084 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"))
Greg Clayton61d043b2011-03-22 04:00:09 +000087 return eServerPacketType_qHostInfo;
Greg Clayton24bc5d92011-03-30 18:16:51 +000088 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;
Greg Clayton61d043b2011-03-22 04:00:09 +000098 break;
99 }
100 return eServerPacketType_unimplemented;
101}
102
103bool
104StringExtractorGDBRemote::IsOKResponse() const
105{
106 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
109
110bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000111StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000112{
Greg Clayton61d043b2011-03-22 04:00:09 +0000113 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +0000114}
115
116bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000117StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000118{
Greg Clayton61d043b2011-03-22 04:00:09 +0000119 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +0000120}
121
122bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000123StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000124{
Greg Clayton61d043b2011-03-22 04:00:09 +0000125 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000126 m_packet.size() == 3 &&
127 isxdigit(m_packet[1]) &&
128 isxdigit(m_packet[2]);
129}
130
131uint8_t
132StringExtractorGDBRemote::GetError ()
133{
Greg Clayton61d043b2011-03-22 04:00:09 +0000134 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000135 {
136 SetFilePos(1);
137 return GetHexU8(255);
138 }
139 return 0;
140}