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