blob: 7e06a0f59bc9eda9e9619f75b50c3f9020b47ae3 [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 Claytonb72d0f02011-04-12 05:54:46 +000056#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)
58
Greg Clayton61d043b2011-03-22 04:00:09 +000059 // Empty is not a supported packet...
60 if (m_packet.empty())
61 return eServerPacketType_invalid;
62
Greg Claytonb72d0f02011-04-12 05:54:46 +000063 const size_t packet_size = m_packet.size();
Greg Clayton61d043b2011-03-22 04:00:09 +000064 const char *packet_cstr = m_packet.c_str();
65 switch (m_packet[0])
66 {
Greg Claytoncb8977d2011-03-23 00:09:55 +000067 case '\x03':
Greg Claytonb72d0f02011-04-12 05:54:46 +000068 if (packet_size == 1) return eServerPacketType_interrupt;
Greg Claytoncb8977d2011-03-23 00:09:55 +000069 break;
70
Greg Clayton61d043b2011-03-22 04:00:09 +000071 case '-':
Greg Claytonb72d0f02011-04-12 05:54:46 +000072 if (packet_size == 1) return eServerPacketType_nack;
Greg Clayton61d043b2011-03-22 04:00:09 +000073 break;
74
75 case '+':
Greg Claytonb72d0f02011-04-12 05:54:46 +000076 if (packet_size == 1) return eServerPacketType_ack;
Greg Clayton61d043b2011-03-22 04:00:09 +000077 break;
78
Greg Claytonb72d0f02011-04-12 05:54:46 +000079 case 'A':
80 return eServerPacketType_A;
81
Greg Clayton58e26e02011-03-24 04:28:38 +000082 case 'Q':
Greg Claytonb72d0f02011-04-12 05:54:46 +000083 switch (packet_cstr[1])
84 {
85 case 'E':
86 if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment;
87 break;
88
89 case 'S':
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;
96 break;
97 }
Greg Clayton58e26e02011-03-24 04:28:38 +000098 break;
99
Greg Clayton61d043b2011-03-22 04:00:09 +0000100 case 'q':
Greg Claytonb72d0f02011-04-12 05:54:46 +0000101 switch (packet_cstr[1])
102 {
103 case 's':
104 if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo;
105 break;
106
107 case 'f':
108 if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo;
109 break;
110
111 case 'C':
112 if (packet_size == 2) return eServerPacketType_qC;
113 break;
114
115 case 'G':
116 if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName;
117 break;
118
119 case 'H':
120 if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
121 break;
122
123 case 'L':
124 if (PACKET_MATCHES ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
125 if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
126 break;
127
128 case 'P':
129 if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
130 break;
131
132 case 'S':
133 if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest;
134 break;
135
136 case 'U':
137 if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName;
138 break;
139 }
Greg Clayton61d043b2011-03-22 04:00:09 +0000140 break;
141 }
142 return eServerPacketType_unimplemented;
143}
144
145bool
146StringExtractorGDBRemote::IsOKResponse() const
147{
148 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +0000149}
150
151
152bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000153StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000154{
Greg Clayton61d043b2011-03-22 04:00:09 +0000155 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +0000156}
157
158bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000159StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000160{
Greg Clayton61d043b2011-03-22 04:00:09 +0000161 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000165StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000166{
Greg Clayton61d043b2011-03-22 04:00:09 +0000167 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000168 m_packet.size() == 3 &&
169 isxdigit(m_packet[1]) &&
170 isxdigit(m_packet[2]);
171}
172
173uint8_t
174StringExtractorGDBRemote::GetError ()
175{
Greg Clayton61d043b2011-03-22 04:00:09 +0000176 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000177 {
178 SetFilePos(1);
179 return GetHexU8(255);
180 }
181 return 0;
182}