1 //===-- 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 
10 // C Includes
11 #include <string.h>
12 
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "Utility/StringExtractorGDBRemote.h"
17 
18 
19 
20 StringExtractorGDBRemote::ResponseType
21 StringExtractorGDBRemote::GetResponseType () const
22 {
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 
53 StringExtractorGDBRemote::ServerPacketType
54 StringExtractorGDBRemote::GetServerPacketType () const
55 {
56     // 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     {
63     case '\x03':
64         if (m_packet.size() == 1)
65             return eServerPacketType_interrupt;
66         break;
67 
68     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 
78     case 'Q':
79         if (strcmp (packet_cstr, "QStartNoAckMode") == 0)
80             return eServerPacketType_QStartNoAckMode;
81         break;
82 
83     case 'q':
84              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"))
87             return eServerPacketType_qHostInfo;
88         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;
98         break;
99     }
100     return eServerPacketType_unimplemented;
101 }
102 
103 bool
104 StringExtractorGDBRemote::IsOKResponse() const
105 {
106     return GetResponseType () == eOK;
107 }
108 
109 
110 bool
111 StringExtractorGDBRemote::IsUnsupportedResponse() const
112 {
113     return GetResponseType () == eUnsupported;
114 }
115 
116 bool
117 StringExtractorGDBRemote::IsNormalResponse() const
118 {
119     return GetResponseType () == eResponse;
120 }
121 
122 bool
123 StringExtractorGDBRemote::IsErrorResponse() const
124 {
125     return GetResponseType () == eError &&
126            m_packet.size() == 3 &&
127            isxdigit(m_packet[1]) &&
128            isxdigit(m_packet[2]);
129 }
130 
131 uint8_t
132 StringExtractorGDBRemote::GetError ()
133 {
134     if (GetResponseType() == eError)
135     {
136         SetFilePos(1);
137         return GetHexU8(255);
138     }
139     return 0;
140 }
141