blob: 4ac07b5cf85b7ceb82e5118316744f634de142a7 [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
Greg Clayton58e26e02011-03-24 04:28:38 +000078 case 'Q':
79 if (strcmp (packet_cstr, "QStartNoAckMode") == 0)
80 return eServerPacketType_QStartNoAckMode;
81 break;
82
Greg Clayton61d043b2011-03-22 04:00:09 +000083 case 'q':
84 if (strcmp (packet_cstr, "qHostInfo") == 0)
85 return eServerPacketType_qHostInfo;
86 break;
87 }
88 return eServerPacketType_unimplemented;
89}
90
91bool
92StringExtractorGDBRemote::IsOKResponse() const
93{
94 return GetResponseType () == eOK;
Chris Lattner24943d22010-06-08 16:52:24 +000095}
96
97
98bool
Greg Clayton61d043b2011-03-22 04:00:09 +000099StringExtractorGDBRemote::IsUnsupportedResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000100{
Greg Clayton61d043b2011-03-22 04:00:09 +0000101 return GetResponseType () == eUnsupported;
Chris Lattner24943d22010-06-08 16:52:24 +0000102}
103
104bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000105StringExtractorGDBRemote::IsNormalResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000106{
Greg Clayton61d043b2011-03-22 04:00:09 +0000107 return GetResponseType () == eResponse;
Chris Lattner24943d22010-06-08 16:52:24 +0000108}
109
110bool
Greg Clayton61d043b2011-03-22 04:00:09 +0000111StringExtractorGDBRemote::IsErrorResponse() const
Chris Lattner24943d22010-06-08 16:52:24 +0000112{
Greg Clayton61d043b2011-03-22 04:00:09 +0000113 return GetResponseType () == eError &&
Chris Lattner24943d22010-06-08 16:52:24 +0000114 m_packet.size() == 3 &&
115 isxdigit(m_packet[1]) &&
116 isxdigit(m_packet[2]);
117}
118
119uint8_t
120StringExtractorGDBRemote::GetError ()
121{
Greg Clayton61d043b2011-03-22 04:00:09 +0000122 if (GetResponseType() == eError)
Chris Lattner24943d22010-06-08 16:52:24 +0000123 {
124 SetFilePos(1);
125 return GetHexU8(255);
126 }
127 return 0;
128}