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