xref: /llvm-project/lldb/source/Utility/StringExtractorGDBRemote.cpp (revision d314e810a70e9104c8d30d9b0719bc5a3dc0acab)
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 #include "Utility/StringExtractorGDBRemote.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 
17 
18 
19 StringExtractorGDBRemote::ResponseType
20 StringExtractorGDBRemote::GetResponseType () const
21 {
22     if (m_packet.empty())
23         return eUnsupported;
24 
25     switch (m_packet[0])
26     {
27     case 'E':
28         if (m_packet.size() == 3 &&
29             isxdigit(m_packet[1]) &&
30             isxdigit(m_packet[2]))
31             return eError;
32         break;
33 
34     case 'O':
35         if (m_packet.size() == 2 && m_packet[1] == 'K')
36             return eOK;
37         break;
38 
39     case '+':
40         if (m_packet.size() == 1)
41             return eAck;
42         break;
43 
44     case '-':
45         if (m_packet.size() == 1)
46             return eNack;
47         break;
48     }
49     return eResponse;
50 }
51 
52 StringExtractorGDBRemote::ServerPacketType
53 StringExtractorGDBRemote::GetServerPacketType () const
54 {
55     // Empty is not a supported packet...
56     if (m_packet.empty())
57         return eServerPacketType_invalid;
58 
59     const char *packet_cstr = m_packet.c_str();
60     switch (m_packet[0])
61     {
62     case '\x03':
63         if (m_packet.size() == 1)
64             return eServerPacketType_interrupt;
65         break;
66 
67     case '-':
68         if (m_packet.size() == 1)
69             return eServerPacketType_nack;
70         break;
71 
72     case '+':
73         if (m_packet.size() == 1)
74             return eServerPacketType_ack;
75         break;
76 
77     case 'q':
78         if (strcmp (packet_cstr, "qHostInfo") == 0)
79             return eServerPacketType_qHostInfo;
80         break;
81     }
82     return eServerPacketType_unimplemented;
83 }
84 
85 bool
86 StringExtractorGDBRemote::IsOKResponse() const
87 {
88     return GetResponseType () == eOK;
89 }
90 
91 
92 bool
93 StringExtractorGDBRemote::IsUnsupportedResponse() const
94 {
95     return GetResponseType () == eUnsupported;
96 }
97 
98 bool
99 StringExtractorGDBRemote::IsNormalResponse() const
100 {
101     return GetResponseType () == eResponse;
102 }
103 
104 bool
105 StringExtractorGDBRemote::IsErrorResponse() const
106 {
107     return GetResponseType () == eError &&
108            m_packet.size() == 3 &&
109            isxdigit(m_packet[1]) &&
110            isxdigit(m_packet[2]);
111 }
112 
113 uint8_t
114 StringExtractorGDBRemote::GetError ()
115 {
116     if (GetResponseType() == eError)
117     {
118         SetFilePos(1);
119         return GetHexU8(255);
120     }
121     return 0;
122 }
123