xref: /llvm-project/lldb/source/Utility/StringExtractorGDBRemote.cpp (revision 1cb6496eb024249cd9b67e9c53808553128dd0e7)
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 (strcmp (packet_cstr, "qHostInfo") == 0)
85             return eServerPacketType_qHostInfo;
86         break;
87     }
88     return eServerPacketType_unimplemented;
89 }
90 
91 bool
92 StringExtractorGDBRemote::IsOKResponse() const
93 {
94     return GetResponseType () == eOK;
95 }
96 
97 
98 bool
99 StringExtractorGDBRemote::IsUnsupportedResponse() const
100 {
101     return GetResponseType () == eUnsupported;
102 }
103 
104 bool
105 StringExtractorGDBRemote::IsNormalResponse() const
106 {
107     return GetResponseType () == eResponse;
108 }
109 
110 bool
111 StringExtractorGDBRemote::IsErrorResponse() const
112 {
113     return GetResponseType () == eError &&
114            m_packet.size() == 3 &&
115            isxdigit(m_packet[1]) &&
116            isxdigit(m_packet[2]);
117 }
118 
119 uint8_t
120 StringExtractorGDBRemote::GetError ()
121 {
122     if (GetResponseType() == eError)
123     {
124         SetFilePos(1);
125         return GetHexU8(255);
126     }
127     return 0;
128 }
129