//===-- 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 <string.h>

// 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 {
#define PACKET_MATCHES(s)                                                      \
  ((packet_size == (sizeof(s) - 1)) && (strcmp((packet_cstr), (s)) == 0))
#define PACKET_STARTS_WITH(s)                                                  \
  ((packet_size >= (sizeof(s) - 1)) &&                                         \
   ::strncmp(packet_cstr, s, (sizeof(s) - 1)) == 0)

  // Empty is not a supported packet...
  if (m_packet.empty())
    return eServerPacketType_invalid;

  const size_t packet_size = m_packet.size();
  const char *packet_cstr = m_packet.c_str();
  switch (m_packet[0]) {

  case '%':
    return eServerPacketType_notify;

  case '\x03':
    if (packet_size == 1)
      return eServerPacketType_interrupt;
    break;

  case '-':
    if (packet_size == 1)
      return eServerPacketType_nack;
    break;

  case '+':
    if (packet_size == 1)
      return eServerPacketType_ack;
    break;

  case 'A':
    return eServerPacketType_A;

  case 'Q':

    switch (packet_cstr[1]) {
    case 'E':
      if (PACKET_STARTS_WITH("QEnvironment:"))
        return eServerPacketType_QEnvironment;
      if (PACKET_STARTS_WITH("QEnvironmentHexEncoded:"))
        return eServerPacketType_QEnvironmentHexEncoded;
      break;

    case 'S':
      if (PACKET_MATCHES("QStartNoAckMode"))
        return eServerPacketType_QStartNoAckMode;
      if (PACKET_STARTS_WITH("QSaveRegisterState"))
        return eServerPacketType_QSaveRegisterState;
      if (PACKET_STARTS_WITH("QSetDisableASLR:"))
        return eServerPacketType_QSetDisableASLR;
      if (PACKET_STARTS_WITH("QSetDetachOnError:"))
        return eServerPacketType_QSetDetachOnError;
      if (PACKET_STARTS_WITH("QSetSTDIN:"))
        return eServerPacketType_QSetSTDIN;
      if (PACKET_STARTS_WITH("QSetSTDOUT:"))
        return eServerPacketType_QSetSTDOUT;
      if (PACKET_STARTS_WITH("QSetSTDERR:"))
        return eServerPacketType_QSetSTDERR;
      if (PACKET_STARTS_WITH("QSetWorkingDir:"))
        return eServerPacketType_QSetWorkingDir;
      if (PACKET_STARTS_WITH("QSetLogging:"))
        return eServerPacketType_QSetLogging;
      if (PACKET_STARTS_WITH("QSetMaxPacketSize:"))
        return eServerPacketType_QSetMaxPacketSize;
      if (PACKET_STARTS_WITH("QSetMaxPayloadSize:"))
        return eServerPacketType_QSetMaxPayloadSize;
      if (PACKET_STARTS_WITH("QSetEnableAsyncProfiling;"))
        return eServerPacketType_QSetEnableAsyncProfiling;
      if (PACKET_STARTS_WITH("QSyncThreadState:"))
        return eServerPacketType_QSyncThreadState;
      break;

    case 'L':
      if (PACKET_STARTS_WITH("QLaunchArch:"))
        return eServerPacketType_QLaunchArch;
      if (PACKET_MATCHES("QListThreadsInStopReply"))
        return eServerPacketType_QListThreadsInStopReply;
      break;

    case 'R':
      if (PACKET_STARTS_WITH("QRestoreRegisterState:"))
        return eServerPacketType_QRestoreRegisterState;
      break;

    case 'T':
      if (PACKET_MATCHES("QThreadSuffixSupported"))
        return eServerPacketType_QThreadSuffixSupported;
      break;
    }
    break;

  case 'q':
    switch (packet_cstr[1]) {
    case 's':
      if (PACKET_MATCHES("qsProcessInfo"))
        return eServerPacketType_qsProcessInfo;
      if (PACKET_MATCHES("qsThreadInfo"))
        return eServerPacketType_qsThreadInfo;
      break;

    case 'f':
      if (PACKET_STARTS_WITH("qfProcessInfo"))
        return eServerPacketType_qfProcessInfo;
      if (PACKET_STARTS_WITH("qfThreadInfo"))
        return eServerPacketType_qfThreadInfo;
      break;

    case 'C':
      if (packet_size == 2)
        return eServerPacketType_qC;
      break;

    case 'E':
      if (PACKET_STARTS_WITH("qEcho:"))
        return eServerPacketType_qEcho;
      break;

    case 'F':
      if (PACKET_STARTS_WITH("qFileLoadAddress:"))
        return eServerPacketType_qFileLoadAddress;
      break;

    case 'G':
      if (PACKET_STARTS_WITH("qGroupName:"))
        return eServerPacketType_qGroupName;
      if (PACKET_MATCHES("qGetWorkingDir"))
        return eServerPacketType_qGetWorkingDir;
      if (PACKET_MATCHES("qGetPid"))
        return eServerPacketType_qGetPid;
      if (PACKET_STARTS_WITH("qGetProfileData;"))
        return eServerPacketType_qGetProfileData;
      if (PACKET_MATCHES("qGDBServerVersion"))
        return eServerPacketType_qGDBServerVersion;
      break;

    case 'H':
      if (PACKET_MATCHES("qHostInfo"))
        return eServerPacketType_qHostInfo;
      break;

    case 'K':
      if (PACKET_STARTS_WITH("qKillSpawnedProcess"))
        return eServerPacketType_qKillSpawnedProcess;
      break;

    case 'L':
      if (PACKET_STARTS_WITH("qLaunchGDBServer"))
        return eServerPacketType_qLaunchGDBServer;
      if (PACKET_MATCHES("qLaunchSuccess"))
        return eServerPacketType_qLaunchSuccess;
      break;

    case 'M':
      if (PACKET_STARTS_WITH("qMemoryRegionInfo:"))
        return eServerPacketType_qMemoryRegionInfo;
      if (PACKET_MATCHES("qMemoryRegionInfo"))
        return eServerPacketType_qMemoryRegionInfoSupported;
      if (PACKET_STARTS_WITH("qModuleInfo:"))
        return eServerPacketType_qModuleInfo;
      break;

    case 'P':
      if (PACKET_STARTS_WITH("qProcessInfoPID:"))
        return eServerPacketType_qProcessInfoPID;
      if (PACKET_STARTS_WITH("qPlatform_shell:"))
        return eServerPacketType_qPlatform_shell;
      if (PACKET_STARTS_WITH("qPlatform_mkdir:"))
        return eServerPacketType_qPlatform_mkdir;
      if (PACKET_STARTS_WITH("qPlatform_chmod:"))
        return eServerPacketType_qPlatform_chmod;
      if (PACKET_MATCHES("qProcessInfo"))
        return eServerPacketType_qProcessInfo;
      break;

    case 'Q':
      if (PACKET_MATCHES("qQueryGDBServer"))
        return eServerPacketType_qQueryGDBServer;
      break;

    case 'R':
      if (PACKET_STARTS_WITH("qRcmd,"))
        return eServerPacketType_qRcmd;
      if (PACKET_STARTS_WITH("qRegisterInfo"))
        return eServerPacketType_qRegisterInfo;
      break;

    case 'S':
      if (PACKET_STARTS_WITH("qSpeedTest:"))
        return eServerPacketType_qSpeedTest;
      if (PACKET_MATCHES("qShlibInfoAddr"))
        return eServerPacketType_qShlibInfoAddr;
      if (PACKET_MATCHES("qStepPacketSupported"))
        return eServerPacketType_qStepPacketSupported;
      if (PACKET_STARTS_WITH("qSupported"))
        return eServerPacketType_qSupported;
      if (PACKET_MATCHES("qSyncThreadStateSupported"))
        return eServerPacketType_qSyncThreadStateSupported;
      break;

    case 'T':
      if (PACKET_STARTS_WITH("qThreadExtraInfo,"))
        return eServerPacketType_qThreadExtraInfo;
      if (PACKET_STARTS_WITH("qThreadStopInfo"))
        return eServerPacketType_qThreadStopInfo;
      break;

    case 'U':
      if (PACKET_STARTS_WITH("qUserName:"))
        return eServerPacketType_qUserName;
      break;

    case 'V':
      if (PACKET_MATCHES("qVAttachOrWaitSupported"))
        return eServerPacketType_qVAttachOrWaitSupported;
      break;

    case 'W':
      if (PACKET_STARTS_WITH("qWatchpointSupportInfo:"))
        return eServerPacketType_qWatchpointSupportInfo;
      if (PACKET_MATCHES("qWatchpointSupportInfo"))
        return eServerPacketType_qWatchpointSupportInfoSupported;
      break;

    case 'X':
      if (PACKET_STARTS_WITH("qXfer:auxv:read::"))
        return eServerPacketType_qXfer_auxv_read;
      break;
    }
    break;

  case 'j':
    if (PACKET_MATCHES("jSignalsInfo"))
      return eServerPacketType_jSignalsInfo;
    if (PACKET_MATCHES("jThreadsInfo"))
      return eServerPacketType_jThreadsInfo;
    break;

  case 'v':
    if (PACKET_STARTS_WITH("vFile:")) {
      if (PACKET_STARTS_WITH("vFile:open:"))
        return eServerPacketType_vFile_open;
      else if (PACKET_STARTS_WITH("vFile:close:"))
        return eServerPacketType_vFile_close;
      else if (PACKET_STARTS_WITH("vFile:pread"))
        return eServerPacketType_vFile_pread;
      else if (PACKET_STARTS_WITH("vFile:pwrite"))
        return eServerPacketType_vFile_pwrite;
      else if (PACKET_STARTS_WITH("vFile:size"))
        return eServerPacketType_vFile_size;
      else if (PACKET_STARTS_WITH("vFile:exists"))
        return eServerPacketType_vFile_exists;
      else if (PACKET_STARTS_WITH("vFile:stat"))
        return eServerPacketType_vFile_stat;
      else if (PACKET_STARTS_WITH("vFile:mode"))
        return eServerPacketType_vFile_mode;
      else if (PACKET_STARTS_WITH("vFile:MD5"))
        return eServerPacketType_vFile_md5;
      else if (PACKET_STARTS_WITH("vFile:symlink"))
        return eServerPacketType_vFile_symlink;
      else if (PACKET_STARTS_WITH("vFile:unlink"))
        return eServerPacketType_vFile_unlink;

    } else {
      if (PACKET_STARTS_WITH("vAttach;"))
        return eServerPacketType_vAttach;
      if (PACKET_STARTS_WITH("vAttachWait;"))
        return eServerPacketType_vAttachWait;
      if (PACKET_STARTS_WITH("vAttachOrWait;"))
        return eServerPacketType_vAttachOrWait;
      if (PACKET_STARTS_WITH("vAttachName;"))
        return eServerPacketType_vAttachName;
      if (PACKET_STARTS_WITH("vCont;"))
        return eServerPacketType_vCont;
      if (PACKET_MATCHES("vCont?"))
        return eServerPacketType_vCont_actions;
    }
    break;
  case '_':
    switch (packet_cstr[1]) {
    case 'M':
      return eServerPacketType__M;

    case 'm':
      return eServerPacketType__m;
    }
    break;

  case '?':
    if (packet_size == 1)
      return eServerPacketType_stop_reason;
    break;

  case 'c':
    return eServerPacketType_c;

  case 'C':
    return eServerPacketType_C;

  case 'D':
    if (packet_size == 1)
      return eServerPacketType_D;
    break;

  case 'g':
    if (packet_size == 1)
      return eServerPacketType_g;
    break;

  case 'G':
    return eServerPacketType_G;

  case 'H':
    return eServerPacketType_H;

  case 'I':
    return eServerPacketType_I;

  case 'k':
    if (packet_size == 1)
      return eServerPacketType_k;
    break;

  case 'm':
    return eServerPacketType_m;

  case 'M':
    return eServerPacketType_M;

  case 'p':
    return eServerPacketType_p;

  case 'P':
    return eServerPacketType_P;

  case 's':
    if (packet_size == 1)
      return eServerPacketType_s;
    break;

  case 'S':
    return eServerPacketType_S;

  case 'x':
    return eServerPacketType_x;

  case 'X':
    return eServerPacketType_X;

  case 'T':
    return eServerPacketType_T;

  case 'z':
    if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
      return eServerPacketType_z;
    break;

  case 'Z':
    if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
      return eServerPacketType_Z;
    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;
}

size_t StringExtractorGDBRemote::GetEscapedBinaryData(std::string &str) {
  // Just get the data bytes in the string as
  // GDBRemoteCommunication::CheckForPacket()
  // already removes any 0x7d escaped characters. If any 0x7d characters are
  // left in
  // the packet, then they are supposed to be there...
  str.clear();
  const size_t bytes_left = GetBytesLeft();
  if (bytes_left > 0) {
    str.assign(m_packet, m_index, bytes_left);
    m_index += bytes_left;
  }
  return str.size();
}

static bool
OKErrorNotSupportedResponseValidator(void *,
                                     const StringExtractorGDBRemote &response) {
  switch (response.GetResponseType()) {
  case StringExtractorGDBRemote::eOK:
  case StringExtractorGDBRemote::eError:
  case StringExtractorGDBRemote::eUnsupported:
    return true;

  case StringExtractorGDBRemote::eAck:
  case StringExtractorGDBRemote::eNack:
  case StringExtractorGDBRemote::eResponse:
    break;
  }
  return false;
}

static bool JSONResponseValidator(void *,
                                  const StringExtractorGDBRemote &response) {
  switch (response.GetResponseType()) {
  case StringExtractorGDBRemote::eUnsupported:
  case StringExtractorGDBRemote::eError:
    return true; // Accept unsupported or EXX as valid responses

  case StringExtractorGDBRemote::eOK:
  case StringExtractorGDBRemote::eAck:
  case StringExtractorGDBRemote::eNack:
    break;

  case StringExtractorGDBRemote::eResponse:
    // JSON that is returned in from JSON query packets is currently always
    // either a dictionary which starts with a '{', or an array which
    // starts with a '['. This is a quick validator to just make sure the
    // response could be valid JSON without having to validate all of the
    // JSON content.
    switch (response.GetStringRef()[0]) {
    case '{':
      return true;
    case '[':
      return true;
    default:
      break;
    }
    break;
  }
  return false;
}

static bool
ASCIIHexBytesResponseValidator(void *,
                               const StringExtractorGDBRemote &response) {
  switch (response.GetResponseType()) {
  case StringExtractorGDBRemote::eUnsupported:
  case StringExtractorGDBRemote::eError:
    return true; // Accept unsupported or EXX as valid responses

  case StringExtractorGDBRemote::eOK:
  case StringExtractorGDBRemote::eAck:
  case StringExtractorGDBRemote::eNack:
    break;

  case StringExtractorGDBRemote::eResponse: {
    uint32_t valid_count = 0;
    for (const char ch : response.GetStringRef()) {
      if (!isxdigit(ch)) {
        return false;
      }
      if (++valid_count >= 16)
        break; // Don't validate all the characters in case the packet is very
               // large
    }
    return true;
  } break;
  }
  return false;
}

void StringExtractorGDBRemote::CopyResponseValidator(
    const StringExtractorGDBRemote &rhs) {
  m_validator = rhs.m_validator;
  m_validator_baton = rhs.m_validator_baton;
}

void StringExtractorGDBRemote::SetResponseValidator(
    ResponseValidatorCallback callback, void *baton) {
  m_validator = callback;
  m_validator_baton = baton;
}

void StringExtractorGDBRemote::SetResponseValidatorToOKErrorNotSupported() {
  m_validator = OKErrorNotSupportedResponseValidator;
  m_validator_baton = nullptr;
}

void StringExtractorGDBRemote::SetResponseValidatorToASCIIHexBytes() {
  m_validator = ASCIIHexBytesResponseValidator;
  m_validator_baton = nullptr;
}

void StringExtractorGDBRemote::SetResponseValidatorToJSON() {
  m_validator = JSONResponseValidator;
  m_validator_baton = nullptr;
}

bool StringExtractorGDBRemote::ValidateResponse() const {
  // If we have a validator callback, try to validate the callback
  if (m_validator)
    return m_validator(m_validator_baton, *this);
  else
    return true; // No validator, so response is valid
}
