blob: 372eaee501cce64a9c2d9dc772ada3c6870fa8e2 [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 {
Greg Claytoncb8977d2011-03-23 00:09:55 +000062 case '\x03':
63 if (m_packet.size() == 1)
64 return eServerPacketType_interrupt;
65 break;
66
Greg Clayton61d043b2011-03-22 04:00:09 +000067 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
85bool
86StringExtractorGDBRemote::IsOKResponse() const
87{
88 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91
92bool
Greg Clayton61d043b2011-03-22 04:00:09 +000093StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +000094{
Greg Clayton61d043b2011-03-22 04:00:09 +000095 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +000096}
97
98bool
Greg Clayton61d043b2011-03-22 04:00:09 +000099StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000100{
Greg Clayton61d043b2011-03-22 04:00:09 +0000101 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +0000102}
103
104bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000105StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000106{
Greg Clayton61d043b2011-03-22 04:00:09 +0000107 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000108 m_packet.size() == 3 &&
109 isxdigit(m_packet[1]) &&
110 isxdigit(m_packet[2]);
111}
112
113uint8_t
114StringExtractorGDBRemote::GetError ()
115{
Greg Clayton61d043b2011-03-22 04:00:09 +0000116 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000117 {
118 SetFilePos(1);
119 return GetHexU8(255);
120 }
121 return 0;
122}