1*30fdc8d8SChris Lattner //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "StringExtractorGDBRemote.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner // C Includes
13*30fdc8d8SChris Lattner // C++ Includes
14*30fdc8d8SChris Lattner // Other libraries and framework includes
15*30fdc8d8SChris Lattner // Project includes
16*30fdc8d8SChris Lattner 
17*30fdc8d8SChris Lattner 
18*30fdc8d8SChris Lattner 
19*30fdc8d8SChris Lattner StringExtractorGDBRemote::Type
20*30fdc8d8SChris Lattner StringExtractorGDBRemote::GetType () const
21*30fdc8d8SChris Lattner {
22*30fdc8d8SChris Lattner     if (m_packet.empty())
23*30fdc8d8SChris Lattner         return eUnsupported;
24*30fdc8d8SChris Lattner 
25*30fdc8d8SChris Lattner     switch (m_packet[0])
26*30fdc8d8SChris Lattner     {
27*30fdc8d8SChris Lattner     case 'E':
28*30fdc8d8SChris Lattner         if (m_packet.size() == 3 &&
29*30fdc8d8SChris Lattner             isxdigit(m_packet[1]) &&
30*30fdc8d8SChris Lattner             isxdigit(m_packet[2]))
31*30fdc8d8SChris Lattner             return eError;
32*30fdc8d8SChris Lattner         break;
33*30fdc8d8SChris Lattner 
34*30fdc8d8SChris Lattner     case 'O':
35*30fdc8d8SChris Lattner         if (m_packet.size() == 2 && m_packet[1] == 'K')
36*30fdc8d8SChris Lattner             return eOK;
37*30fdc8d8SChris Lattner         break;
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner     case '+':
40*30fdc8d8SChris Lattner         if (m_packet.size() == 1)
41*30fdc8d8SChris Lattner             return eAck;
42*30fdc8d8SChris Lattner         break;
43*30fdc8d8SChris Lattner 
44*30fdc8d8SChris Lattner     case '-':
45*30fdc8d8SChris Lattner         if (m_packet.size() == 1)
46*30fdc8d8SChris Lattner             return eNack;
47*30fdc8d8SChris Lattner         break;
48*30fdc8d8SChris Lattner     }
49*30fdc8d8SChris Lattner     return eResponse;
50*30fdc8d8SChris Lattner }
51*30fdc8d8SChris Lattner 
52*30fdc8d8SChris Lattner bool
53*30fdc8d8SChris Lattner StringExtractorGDBRemote::IsOKPacket() const
54*30fdc8d8SChris Lattner {
55*30fdc8d8SChris Lattner     return GetType () == eOK;
56*30fdc8d8SChris Lattner }
57*30fdc8d8SChris Lattner 
58*30fdc8d8SChris Lattner 
59*30fdc8d8SChris Lattner bool
60*30fdc8d8SChris Lattner StringExtractorGDBRemote::IsUnsupportedPacket() const
61*30fdc8d8SChris Lattner {
62*30fdc8d8SChris Lattner     return GetType () == eUnsupported;
63*30fdc8d8SChris Lattner }
64*30fdc8d8SChris Lattner 
65*30fdc8d8SChris Lattner bool
66*30fdc8d8SChris Lattner StringExtractorGDBRemote::IsNormalPacket() const
67*30fdc8d8SChris Lattner {
68*30fdc8d8SChris Lattner     return GetType () == eResponse;
69*30fdc8d8SChris Lattner }
70*30fdc8d8SChris Lattner 
71*30fdc8d8SChris Lattner bool
72*30fdc8d8SChris Lattner StringExtractorGDBRemote::IsErrorPacket() const
73*30fdc8d8SChris Lattner {
74*30fdc8d8SChris Lattner     return GetType () == eError &&
75*30fdc8d8SChris Lattner            m_packet.size() == 3 &&
76*30fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
77*30fdc8d8SChris Lattner            isxdigit(m_packet[2]);
78*30fdc8d8SChris Lattner }
79*30fdc8d8SChris Lattner 
80*30fdc8d8SChris Lattner uint8_t
81*30fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
82*30fdc8d8SChris Lattner {
83*30fdc8d8SChris Lattner     if (GetType() == eError)
84*30fdc8d8SChris Lattner     {
85*30fdc8d8SChris Lattner         SetFilePos(1);
86*30fdc8d8SChris Lattner         return GetHexU8(255);
87*30fdc8d8SChris Lattner     }
88*30fdc8d8SChris Lattner     return 0;
89*30fdc8d8SChris Lattner }
90