130fdc8d8SChris Lattner //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10c982c768SGreg Clayton #include "Utility/StringExtractorGDBRemote.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // C Includes
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner 
19*576d8834SGreg Clayton StringExtractorGDBRemote::ResponseType
20*576d8834SGreg Clayton StringExtractorGDBRemote::GetResponseType () const
2130fdc8d8SChris Lattner {
2230fdc8d8SChris Lattner     if (m_packet.empty())
2330fdc8d8SChris Lattner         return eUnsupported;
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner     switch (m_packet[0])
2630fdc8d8SChris Lattner     {
2730fdc8d8SChris Lattner     case 'E':
2830fdc8d8SChris Lattner         if (m_packet.size() == 3 &&
2930fdc8d8SChris Lattner             isxdigit(m_packet[1]) &&
3030fdc8d8SChris Lattner             isxdigit(m_packet[2]))
3130fdc8d8SChris Lattner             return eError;
3230fdc8d8SChris Lattner         break;
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner     case 'O':
3530fdc8d8SChris Lattner         if (m_packet.size() == 2 && m_packet[1] == 'K')
3630fdc8d8SChris Lattner             return eOK;
3730fdc8d8SChris Lattner         break;
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner     case '+':
4030fdc8d8SChris Lattner         if (m_packet.size() == 1)
4130fdc8d8SChris Lattner             return eAck;
4230fdc8d8SChris Lattner         break;
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner     case '-':
4530fdc8d8SChris Lattner         if (m_packet.size() == 1)
4630fdc8d8SChris Lattner             return eNack;
4730fdc8d8SChris Lattner         break;
4830fdc8d8SChris Lattner     }
4930fdc8d8SChris Lattner     return eResponse;
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
52*576d8834SGreg Clayton StringExtractorGDBRemote::ServerPacketType
53*576d8834SGreg Clayton StringExtractorGDBRemote::GetServerPacketType () const
5430fdc8d8SChris Lattner {
55*576d8834SGreg Clayton     // Empty is not a supported packet...
56*576d8834SGreg Clayton     if (m_packet.empty())
57*576d8834SGreg Clayton         return eServerPacketType_invalid;
58*576d8834SGreg Clayton 
59*576d8834SGreg Clayton     const char *packet_cstr = m_packet.c_str();
60*576d8834SGreg Clayton     switch (m_packet[0])
61*576d8834SGreg Clayton     {
62*576d8834SGreg Clayton     case '-':
63*576d8834SGreg Clayton         if (m_packet.size() == 1)
64*576d8834SGreg Clayton             return eServerPacketType_nack;
65*576d8834SGreg Clayton         break;
66*576d8834SGreg Clayton 
67*576d8834SGreg Clayton     case '+':
68*576d8834SGreg Clayton         if (m_packet.size() == 1)
69*576d8834SGreg Clayton             return eServerPacketType_ack;
70*576d8834SGreg Clayton         break;
71*576d8834SGreg Clayton 
72*576d8834SGreg Clayton     case 'q':
73*576d8834SGreg Clayton         if (strcmp (packet_cstr, "qHostInfo") == 0)
74*576d8834SGreg Clayton             return eServerPacketType_qHostInfo;
75*576d8834SGreg Clayton         break;
76*576d8834SGreg Clayton     }
77*576d8834SGreg Clayton     return eServerPacketType_unimplemented;
78*576d8834SGreg Clayton }
79*576d8834SGreg Clayton 
80*576d8834SGreg Clayton bool
81*576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const
82*576d8834SGreg Clayton {
83*576d8834SGreg Clayton     return GetResponseType () == eOK;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner bool
88*576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const
8930fdc8d8SChris Lattner {
90*576d8834SGreg Clayton     return GetResponseType () == eUnsupported;
9130fdc8d8SChris Lattner }
9230fdc8d8SChris Lattner 
9330fdc8d8SChris Lattner bool
94*576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const
9530fdc8d8SChris Lattner {
96*576d8834SGreg Clayton     return GetResponseType () == eResponse;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner bool
100*576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const
10130fdc8d8SChris Lattner {
102*576d8834SGreg Clayton     return GetResponseType () == eError &&
10330fdc8d8SChris Lattner            m_packet.size() == 3 &&
10430fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
10530fdc8d8SChris Lattner            isxdigit(m_packet[2]);
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner uint8_t
10930fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
11030fdc8d8SChris Lattner {
111*576d8834SGreg Clayton     if (GetResponseType() == eError)
11230fdc8d8SChris Lattner     {
11330fdc8d8SChris Lattner         SetFilePos(1);
11430fdc8d8SChris Lattner         return GetHexU8(255);
11530fdc8d8SChris Lattner     }
11630fdc8d8SChris Lattner     return 0;
11730fdc8d8SChris Lattner }
118