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 
1030fdc8d8SChris Lattner // C Includes
11*ad65c051SStephen Wilson #include <string.h>
12*ad65c051SStephen Wilson 
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
16*ad65c051SStephen Wilson #include "Utility/StringExtractorGDBRemote.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner 
20576d8834SGreg Clayton StringExtractorGDBRemote::ResponseType
21576d8834SGreg Clayton StringExtractorGDBRemote::GetResponseType () const
2230fdc8d8SChris Lattner {
2330fdc8d8SChris Lattner     if (m_packet.empty())
2430fdc8d8SChris Lattner         return eUnsupported;
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner     switch (m_packet[0])
2730fdc8d8SChris Lattner     {
2830fdc8d8SChris Lattner     case 'E':
2930fdc8d8SChris Lattner         if (m_packet.size() == 3 &&
3030fdc8d8SChris Lattner             isxdigit(m_packet[1]) &&
3130fdc8d8SChris Lattner             isxdigit(m_packet[2]))
3230fdc8d8SChris Lattner             return eError;
3330fdc8d8SChris Lattner         break;
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner     case 'O':
3630fdc8d8SChris Lattner         if (m_packet.size() == 2 && m_packet[1] == 'K')
3730fdc8d8SChris Lattner             return eOK;
3830fdc8d8SChris Lattner         break;
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner     case '+':
4130fdc8d8SChris Lattner         if (m_packet.size() == 1)
4230fdc8d8SChris Lattner             return eAck;
4330fdc8d8SChris Lattner         break;
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner     case '-':
4630fdc8d8SChris Lattner         if (m_packet.size() == 1)
4730fdc8d8SChris Lattner             return eNack;
4830fdc8d8SChris Lattner         break;
4930fdc8d8SChris Lattner     }
5030fdc8d8SChris Lattner     return eResponse;
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
53576d8834SGreg Clayton StringExtractorGDBRemote::ServerPacketType
54576d8834SGreg Clayton StringExtractorGDBRemote::GetServerPacketType () const
5530fdc8d8SChris Lattner {
56576d8834SGreg Clayton     // Empty is not a supported packet...
57576d8834SGreg Clayton     if (m_packet.empty())
58576d8834SGreg Clayton         return eServerPacketType_invalid;
59576d8834SGreg Clayton 
60576d8834SGreg Clayton     const char *packet_cstr = m_packet.c_str();
61576d8834SGreg Clayton     switch (m_packet[0])
62576d8834SGreg Clayton     {
63d314e810SGreg Clayton     case '\x03':
64d314e810SGreg Clayton         if (m_packet.size() == 1)
65d314e810SGreg Clayton             return eServerPacketType_interrupt;
66d314e810SGreg Clayton         break;
67d314e810SGreg Clayton 
68576d8834SGreg Clayton     case '-':
69576d8834SGreg Clayton         if (m_packet.size() == 1)
70576d8834SGreg Clayton             return eServerPacketType_nack;
71576d8834SGreg Clayton         break;
72576d8834SGreg Clayton 
73576d8834SGreg Clayton     case '+':
74576d8834SGreg Clayton         if (m_packet.size() == 1)
75576d8834SGreg Clayton             return eServerPacketType_ack;
76576d8834SGreg Clayton         break;
77576d8834SGreg Clayton 
78576d8834SGreg Clayton     case 'q':
79576d8834SGreg Clayton         if (strcmp (packet_cstr, "qHostInfo") == 0)
80576d8834SGreg Clayton             return eServerPacketType_qHostInfo;
81576d8834SGreg Clayton         break;
82576d8834SGreg Clayton     }
83576d8834SGreg Clayton     return eServerPacketType_unimplemented;
84576d8834SGreg Clayton }
85576d8834SGreg Clayton 
86576d8834SGreg Clayton bool
87576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const
88576d8834SGreg Clayton {
89576d8834SGreg Clayton     return GetResponseType () == eOK;
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner 
9330fdc8d8SChris Lattner bool
94576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const
9530fdc8d8SChris Lattner {
96576d8834SGreg Clayton     return GetResponseType () == eUnsupported;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner bool
100576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const
10130fdc8d8SChris Lattner {
102576d8834SGreg Clayton     return GetResponseType () == eResponse;
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner bool
106576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const
10730fdc8d8SChris Lattner {
108576d8834SGreg Clayton     return GetResponseType () == eError &&
10930fdc8d8SChris Lattner            m_packet.size() == 3 &&
11030fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
11130fdc8d8SChris Lattner            isxdigit(m_packet[2]);
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner uint8_t
11530fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
11630fdc8d8SChris Lattner {
117576d8834SGreg Clayton     if (GetResponseType() == eError)
11830fdc8d8SChris Lattner     {
11930fdc8d8SChris Lattner         SetFilePos(1);
12030fdc8d8SChris Lattner         return GetHexU8(255);
12130fdc8d8SChris Lattner     }
12230fdc8d8SChris Lattner     return 0;
12330fdc8d8SChris Lattner }
124