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