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