blob: fc64b275e55c2334c581917bfc406297a1fc09e8 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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
Greg Clayton54e7afa2010-07-09 20:39:50 +000010#include "Utility/StringExtractorGDBRemote.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16
17
18
Greg Clayton61d043b2011-03-22 04:00:09 +000019StringExtractorGDBRemote::ResponseType
20StringExtractorGDBRemote::GetResponseType () const
Chris Lattner24943d22010-06-08 16:52:24 +000021{
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
Greg Clayton61d043b2011-03-22 04:00:09 +000052StringExtractorGDBRemote::ServerPacketType
53StringExtractorGDBRemote::GetServerPacketType () const
Chris Lattner24943d22010-06-08 16:52:24 +000054{
Greg Clayton61d043b2011-03-22 04:00:09 +000055 // 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
80bool
81StringExtractorGDBRemote::IsOKResponse() const
82{
83 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +000084}
85
86
87bool
Greg Clayton61d043b2011-03-22 04:00:09 +000088StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +000089{
Greg Clayton61d043b2011-03-22 04:00:09 +000090 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +000091}
92
93bool
Greg Clayton61d043b2011-03-22 04:00:09 +000094StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +000095{
Greg Clayton61d043b2011-03-22 04:00:09 +000096 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +000097}
98
99bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000100StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000101{
Greg Clayton61d043b2011-03-22 04:00:09 +0000102 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000103 m_packet.size() == 3 &&
104 isxdigit(m_packet[1]) &&
105 isxdigit(m_packet[2]);
106}
107
108uint8_t
109StringExtractorGDBRemote::GetError ()
110{
Greg Clayton61d043b2011-03-22 04:00:09 +0000111 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000112 {
113 SetFilePos(1);
114 return GetHexU8(255);
115 }
116 return 0;
117}