//===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "Utility/StringExtractorGDBRemote.h"

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes



StringExtractorGDBRemote::Type
StringExtractorGDBRemote::GetType () 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;
}

bool
StringExtractorGDBRemote::IsOKPacket() const
{
    return GetType () == eOK;
}


bool
StringExtractorGDBRemote::IsUnsupportedPacket() const
{
    return GetType () == eUnsupported;
}

bool
StringExtractorGDBRemote::IsNormalPacket() const
{
    return GetType () == eResponse;
}

bool
StringExtractorGDBRemote::IsErrorPacket() const
{
    return GetType () == eError &&
           m_packet.size() == 3 &&
           isxdigit(m_packet[1]) &&
           isxdigit(m_packet[2]);
}

uint8_t
StringExtractorGDBRemote::GetError ()
{
    if (GetType() == eError)
    {
        SetFilePos(1);
        return GetHexU8(255);
    }
    return 0;
}
