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 '-':
63         if (m_packet.size() == 1)
64             return eServerPacketType_nack;
65         break;
66 
67     case '+':
68         if (m_packet.size() == 1)
69             return eServerPacketType_ack;
70         break;
71 
72     case 'q':
73         if (strcmp (packet_cstr, "qHostInfo") == 0)
74             return eServerPacketType_qHostInfo;
75         break;
76     }
77     return eServerPacketType_unimplemented;
78 }
79 
80 bool
81 StringExtractorGDBRemote::IsOKResponse() const
82 {
83     return GetResponseType () == eOK;
84 }
85 
86 
87 bool
88 StringExtractorGDBRemote::IsUnsupportedResponse() const
89 {
90     return GetResponseType () == eUnsupported;
91 }
92 
93 bool
94 StringExtractorGDBRemote::IsNormalResponse() const
95 {
96     return GetResponseType () == eResponse;
97 }
98 
99 bool
100 StringExtractorGDBRemote::IsErrorResponse() const
101 {
102     return GetResponseType () == eError &&
103            m_packet.size() == 3 &&
104            isxdigit(m_packet[1]) &&
105            isxdigit(m_packet[2]);
106 }
107 
108 uint8_t
109 StringExtractorGDBRemote::GetError ()
110 {
111     if (GetResponseType() == eError)
112     {
113         SetFilePos(1);
114         return GetHexU8(255);
115     }
116     return 0;
117 }
118