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

// Overview:    CMICmdCmdDataEvaluateExpression     interface.
//              CMICmdCmdDataDisassemble            interface.
//              CMICmdCmdDataReadMemoryBytes        interface.
//              CMICmdCmdDataReadMemory             interface.
//              CMICmdCmdDataListRegisterNames      interface.
//              CMICmdCmdDataListRegisterValues     interface.
//              CMICmdCmdDataListRegisterChanged    interface.
//              CMICmdCmdDataWriteMemoryBytes       interface.
//              CMICmdCmdDataWriteMemory            interface.
//              CMICmdCmdDataInfoLine               interface.
//
//              To implement new MI commands derive a new command class from the
//              command base
//              class. To enable the new command for interpretation add the new
//              command class
//              to the command factory. The files of relevance are:
//                  MICmdCommands.cpp
//                  MICmdBase.h / .cpp
//                  MICmdCmd.h / .cpp
//              For an introduction to adding a new command see
//              CMICmdCmdSupportInfoMiCmdQuery
//              command class as an example.
//

#pragma once

// Third party headers:
#include "lldb/API/SBCommandReturnObject.h"
#include "lldb/API/SBError.h"

// In-house headers:
#include "MICmdBase.h"
#include "MICmnLLDBDebugSessionInfoVarObj.h"
#include "MICmnMIValueList.h"
#include "MICmnMIValueTuple.h"

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-evaluate-expression".
//--
class CMICmdCmdDataEvaluateExpression : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataEvaluateExpression();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataEvaluateExpression() override;

  // Methods:
private:
  bool HaveInvalidCharacterInExpression(const CMIUtilString &vrExpr,
                                        char &vrwInvalidChar);

  // Attributes:
private:
  bool m_bExpressionValid;     // True = yes is valid, false = not valid
  bool m_bEvaluatedExpression; // True = yes is expression evaluated, false =
                               // failed
  lldb::SBError m_Error;       // Status object, which is examined when
                               // m_bEvaluatedExpression is false
  CMIUtilString m_strValue;
  CMICmnMIValueTuple m_miValueTuple;
  bool m_bFoundInvalidChar; // True = yes found unexpected character in the
                            // expression, false = all ok
  char m_cExpressionInvalidChar;
  const CMIUtilString m_constStrArgExpr;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-disassemble".
//--
class CMICmdCmdDataDisassemble : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataDisassemble();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataDisassemble() override;

  // Attributes:
private:
  const CMIUtilString
      m_constStrArgAddrStart; // MI spec non mandatory, *this command mandatory
  const CMIUtilString
      m_constStrArgAddrEnd; // MI spec non mandatory, *this command mandatory
  const CMIUtilString m_constStrArgMode;
  CMICmnMIValueList m_miValueList;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-read-memory-bytes".
//--
class CMICmdCmdDataReadMemoryBytes : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataReadMemoryBytes();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataReadMemoryBytes() override;

  // Attributes:
private:
  const CMIUtilString m_constStrArgByteOffset;
  const CMIUtilString m_constStrArgAddrExpr;
  const CMIUtilString m_constStrArgNumBytes;
  unsigned char *m_pBufferMemory;
  MIuint64 m_nAddrStart;
  MIuint64 m_nAddrNumBytesToRead;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-read-memory".
//--
class CMICmdCmdDataReadMemory : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataReadMemory();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataReadMemory() override;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-list-register-names".
//--
class CMICmdCmdDataListRegisterNames : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataListRegisterNames();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataListRegisterNames() override;

  // Methods:
private:
  lldb::SBValue GetRegister(const MIuint vRegisterIndex) const;

  // Attributes:
private:
  const CMIUtilString m_constStrArgRegNo; // Not handled by *this command
  CMICmnMIValueList m_miValueList;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-list-register-values".
//--
class CMICmdCmdDataListRegisterValues : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataListRegisterValues();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataListRegisterValues() override;

  // Methods:
private:
  lldb::SBValue GetRegister(const MIuint vRegisterIndex) const;
  void AddToOutput(const MIuint vnIndex, const lldb::SBValue &vrValue,
                   CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat);

  // Attributes:
private:
  const CMIUtilString m_constStrArgSkip; // Not handled by *this command
  const CMIUtilString m_constStrArgFormat;
  const CMIUtilString m_constStrArgRegNo;
  CMICmnMIValueList m_miValueList;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-list-changed-registers".
//--
class CMICmdCmdDataListRegisterChanged : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataListRegisterChanged();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataListRegisterChanged() override;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-read-memory-bytes".
//--
class CMICmdCmdDataWriteMemoryBytes : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataWriteMemoryBytes();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataWriteMemoryBytes() override;

  // Attributes:
private:
  const CMIUtilString m_constStrArgAddr;
  const CMIUtilString m_constStrArgContents;
  const CMIUtilString m_constStrArgCount;
  CMIUtilString m_strContents;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-read-memory".
//          Not specified in MI spec but Eclipse gives *this command.
//--
class CMICmdCmdDataWriteMemory : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataWriteMemory();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataWriteMemory() override;

  // Attributes:
private:
  const CMIUtilString m_constStrArgOffset; // Not specified in MI spec but
                                           // Eclipse gives this option.
  const CMIUtilString m_constStrArgAddr; // Not specified in MI spec but Eclipse
                                         // gives this option.
  const CMIUtilString
      m_constStrArgD; // Not specified in MI spec but Eclipse gives this option.
  const CMIUtilString m_constStrArgNumber;   // Not specified in MI spec but
                                             // Eclipse gives this option.
  const CMIUtilString m_constStrArgContents; // Not specified in MI spec but
                                             // Eclipse gives this option.
  MIuint64 m_nAddr;
  CMIUtilString m_strContents;
  MIuint64 m_nCount;
  unsigned char *m_pBufferMemory;
};

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "data-info-line".
//          See MIExtensions.txt for details.
//--
class CMICmdCmdDataInfoLine : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

  // Methods:
public:
  /* ctor */ CMICmdCmdDataInfoLine();

  // Overridden:
public:
  // From CMICmdInvoker::ICmd
  bool Execute() override;
  bool Acknowledge() override;
  bool ParseArgs() override;
  // From CMICmnBase
  /* dtor */ ~CMICmdCmdDataInfoLine() override;

  // Attributes:
private:
  lldb::SBCommandReturnObject m_lldbResult;
  const CMIUtilString m_constStrArgLocation;
};
