//===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // C Includes #include // C++ Includes // Other libraries and framework includes // Project includes #include "Utility/StringExtractorGDBRemote.h" StringExtractorGDBRemote::ResponseType StringExtractorGDBRemote::GetResponseType () const { if (m_packet.empty()) return eUnsupported; switch (m_packet[0]) { case 'E': if (m_packet.size() == 3 && isxdigit(m_packet[1]) && isxdigit(m_packet[2])) return eError; break; case 'O': if (m_packet.size() == 2 && m_packet[1] == 'K') return eOK; break; case '+': if (m_packet.size() == 1) return eAck; break; case '-': if (m_packet.size() == 1) return eNack; break; } return eResponse; } StringExtractorGDBRemote::ServerPacketType StringExtractorGDBRemote::GetServerPacketType () const { // Empty is not a supported packet... if (m_packet.empty()) return eServerPacketType_invalid; const char *packet_cstr = m_packet.c_str(); switch (m_packet[0]) { case '\x03': if (m_packet.size() == 1) return eServerPacketType_interrupt; break; case '-': if (m_packet.size() == 1) return eServerPacketType_nack; break; case '+': if (m_packet.size() == 1) return eServerPacketType_ack; break; case 'Q': if (strcmp (packet_cstr, "QStartNoAckMode") == 0) return eServerPacketType_QStartNoAckMode; break; case 'q': if (packet_cstr[1] == 'S' && 0 == ::strncmp(packet_cstr, "qSpeedTest:", strlen("qSpeedTest:"))) return eServerPacketType_qSpeedTest; else if (packet_cstr[1] == 'H' && 0 == ::strcmp (packet_cstr, "qHostInfo")) return eServerPacketType_qHostInfo; else if (packet_cstr[1] == 'P' && 0 == ::strncmp(packet_cstr, "qProcessInfoPID:", strlen("qProcessInfoPID:"))) return eServerPacketType_qProcessInfoPID; else if (packet_cstr[1] == 'f' && 0 == ::strncmp(packet_cstr, "qfProcessInfo", strlen("qfProcessInfo"))) return eServerPacketType_qfProcessInfo; else if (packet_cstr[1] == 'U' && 0 == ::strncmp(packet_cstr, "qUserName:", strlen("qUserName:"))) return eServerPacketType_qUserName; else if (packet_cstr[1] == 'G' && 0 == ::strncmp(packet_cstr, "qGroupName:", strlen("qGroupName:"))) return eServerPacketType_qGroupName; else if (packet_cstr[1] == 's' && 0 == ::strcmp (packet_cstr, "qsProcessInfo")) return eServerPacketType_qsProcessInfo; break; } return eServerPacketType_unimplemented; } bool StringExtractorGDBRemote::IsOKResponse() const { return GetResponseType () == eOK; } bool StringExtractorGDBRemote::IsUnsupportedResponse() const { return GetResponseType () == eUnsupported; } bool StringExtractorGDBRemote::IsNormalResponse() const { return GetResponseType () == eResponse; } bool StringExtractorGDBRemote::IsErrorResponse() const { return GetResponseType () == eError && m_packet.size() == 3 && isxdigit(m_packet[1]) && isxdigit(m_packet[2]); } uint8_t StringExtractorGDBRemote::GetError () { if (GetResponseType() == eError) { SetFilePos(1); return GetHexU8(255); } return 0; }