blob: e78aff73e588fb86b79f7c9227238ae5df0e40a5 [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
Chris Lattner24943d22010-06-08 16:52:24 +000010// C Includes
Stephen Wilson4b274e82011-03-23 02:02:29 +000011#include <string.h>
12
Chris Lattner24943d22010-06-08 16:52:24 +000013// C++ Includes
14// Other libraries and framework includes
15// Project includes
Stephen Wilson4b274e82011-03-23 02:02:29 +000016#include "Utility/StringExtractorGDBRemote.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18
19
Greg Clayton61d043b2011-03-22 04:00:09 +000020StringExtractorGDBRemote::ResponseType
21StringExtractorGDBRemote::GetResponseType () const
Chris Lattner24943d22010-06-08 16:52:24 +000022{
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
Greg Clayton61d043b2011-03-22 04:00:09 +000053StringExtractorGDBRemote::ServerPacketType
54StringExtractorGDBRemote::GetServerPacketType () const
Chris Lattner24943d22010-06-08 16:52:24 +000055{
Greg Clayton61d043b2011-03-22 04:00:09 +000056 // 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 {
Greg Claytoncb8977d2011-03-23 00:09:55 +000063 case '\x03':
64 if (m_packet.size() == 1)
65 return eServerPacketType_interrupt;
66 break;
67
Greg Clayton61d043b2011-03-22 04:00:09 +000068 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
86bool
87StringExtractorGDBRemote::IsOKResponse() const
88{
89 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +000090}
91
92
93bool
Greg Clayton61d043b2011-03-22 04:00:09 +000094StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +000095{
Greg Clayton61d043b2011-03-22 04:00:09 +000096 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +000097}
98
99bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000100StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000101{
Greg Clayton61d043b2011-03-22 04:00:09 +0000102 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +0000103}
104
105bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000106StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000107{
Greg Clayton61d043b2011-03-22 04:00:09 +0000108 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000109 m_packet.size() == 3 &&
110 isxdigit(m_packet[1]) &&
111 isxdigit(m_packet[2]);
112}
113
114uint8_t
115StringExtractorGDBRemote::GetError ()
116{
Greg Clayton61d043b2011-03-22 04:00:09 +0000117 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000118 {
119 SetFilePos(1);
120 return GetHexU8(255);
121 }
122 return 0;
123}