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
11ad65c051SStephen Wilson #include <string.h>
12ad65c051SStephen Wilson 
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
16ad65c051SStephen 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 
78*1cb6496eSGreg Clayton     case 'Q':
79*1cb6496eSGreg Clayton         if (strcmp (packet_cstr, "QStartNoAckMode") == 0)
80*1cb6496eSGreg Clayton             return eServerPacketType_QStartNoAckMode;
81*1cb6496eSGreg Clayton         break;
82*1cb6496eSGreg Clayton 
83576d8834SGreg Clayton     case 'q':
84576d8834SGreg Clayton         if (strcmp (packet_cstr, "qHostInfo") == 0)
85576d8834SGreg Clayton             return eServerPacketType_qHostInfo;
86576d8834SGreg Clayton         break;
87576d8834SGreg Clayton     }
88576d8834SGreg Clayton     return eServerPacketType_unimplemented;
89576d8834SGreg Clayton }
90576d8834SGreg Clayton 
91576d8834SGreg Clayton bool
92576d8834SGreg Clayton StringExtractorGDBRemote::IsOKResponse() const
93576d8834SGreg Clayton {
94576d8834SGreg Clayton     return GetResponseType () == eOK;
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner bool
99576d8834SGreg Clayton StringExtractorGDBRemote::IsUnsupportedResponse() const
10030fdc8d8SChris Lattner {
101576d8834SGreg Clayton     return GetResponseType () == eUnsupported;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner bool
105576d8834SGreg Clayton StringExtractorGDBRemote::IsNormalResponse() const
10630fdc8d8SChris Lattner {
107576d8834SGreg Clayton     return GetResponseType () == eResponse;
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner bool
111576d8834SGreg Clayton StringExtractorGDBRemote::IsErrorResponse() const
11230fdc8d8SChris Lattner {
113576d8834SGreg Clayton     return GetResponseType () == eError &&
11430fdc8d8SChris Lattner            m_packet.size() == 3 &&
11530fdc8d8SChris Lattner            isxdigit(m_packet[1]) &&
11630fdc8d8SChris Lattner            isxdigit(m_packet[2]);
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner uint8_t
12030fdc8d8SChris Lattner StringExtractorGDBRemote::GetError ()
12130fdc8d8SChris Lattner {
122576d8834SGreg Clayton     if (GetResponseType() == eError)
12330fdc8d8SChris Lattner     {
12430fdc8d8SChris Lattner         SetFilePos(1);
12530fdc8d8SChris Lattner         return GetHexU8(255);
12630fdc8d8SChris Lattner     }
12730fdc8d8SChris Lattner     return 0;
12830fdc8d8SChris Lattner }
129