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 
19576d8834SGreg Clayton StringExtractorGDBRemote::ResponseType
20576d8834SGreg 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 
52576d8834SGreg Clayton StringExtractorGDBRemote::ServerPacketType
53576d8834SGreg Clayton StringExtractorGDBRemote::GetServerPacketType () const
5430fdc8d8SChris Lattner {
55576d8834SGreg Clayton     // Empty is not a supported packet...
56576d8834SGreg Clayton     if (m_packet.empty())
57576d8834SGreg Clayton         return eServerPacketType_invalid;
58576d8834SGreg Clayton 
59576d8834SGreg Clayton     const char *packet_cstr = m_packet.c_str();
60576d8834SGreg Clayton     switch (m_packet[0])
61576d8834SGreg Clayton     {
62*d314e810SGreg Clayton     case '\x03':
63*d314e810SGreg Clayton         if (m_packet.size() == 1)
64*d314e810SGreg Clayton             return eServerPacketType_interrupt;
65*d314e810SGreg Clayton         break;
66*d314e810SGreg Clayton 
67576d8834SGreg Clayton     case '-':
68576d8834SGreg Clayton         if (m_packet.size() == 1)
69576d8834SGreg Clayton             return eServerPacketType_nack;
70576d8834SGreg Clayton         break;
71576d8834SGreg Clayton 
72576d8834SGreg Clayton     case '+':
73576d8834SGreg Clayton         if (m_packet.size() == 1)
74576d8834SGreg Clayton             return eServerPacketType_ack;
75576d8834SGreg Clayton         break;
76576d8834SGreg Clayton 
77576d8834SGreg Clayton     case 'q':
78576d8834SGreg Clayton         if (strcmp (packet_cstr, "qHostInfo") == 0)
79576d8834SGreg Clayton             return eServerPacketType_qHostInfo;
80576d8834SGreg Clayton         break;
81576d8834SGreg Clayton     }
82576d8834SGreg Clayton     return eServerPacketType_unimplemented;
83576d8834SGreg Clayton }
84576d8834SGreg Clayton 
85576d8834SGreg Clayton bool
86576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const
87576d8834SGreg Clayton {
88576d8834SGreg Clayton     return GetResponseType () == eOK;
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner bool
93576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const
9430fdc8d8SChris Lattner {
95576d8834SGreg Clayton     return GetResponseType () == eUnsupported;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner bool
99576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const
10030fdc8d8SChris Lattner {
101576d8834SGreg Clayton     return GetResponseType () == eResponse;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner bool
105576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const
10630fdc8d8SChris Lattner {
107576d8834SGreg Clayton     return GetResponseType () == eError &&
10830fdc8d8SChris Lattner            m_packet.size() == 3 &&
10930fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
11030fdc8d8SChris Lattner            isxdigit(m_packet[2]);
11130fdc8d8SChris Lattner }
11230fdc8d8SChris Lattner 
11330fdc8d8SChris Lattner uint8_t
11430fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
11530fdc8d8SChris Lattner {
116576d8834SGreg Clayton     if (GetResponseType() == eError)
11730fdc8d8SChris Lattner     {
11830fdc8d8SChris Lattner         SetFilePos(1);
11930fdc8d8SChris Lattner         return GetHexU8(255);
12030fdc8d8SChris Lattner     }
12130fdc8d8SChris Lattner     return 0;
12230fdc8d8SChris Lattner }
123