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

// Overview:    CMICmdCmdGdbShow 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

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

//++
//============================================================================
// Details: MI command class. MI commands derived from the command base class.
//          *this class implements MI command "gdb-show".
//          This command does not follow the MI documentation exactly. While
//          *this
//          command is implemented it does not do anything with the gdb-set
//          variable past in.
//          The design of matching the info request to a request action (or
//          command) is very simple. The request function which carries out
//          the task of information gathering and printing to stdout is part of
//          *this class. Should the request function become more complicated
//          then
//          that request should really reside in a command type class. Then this
//          class instantiates a request info command for a matching request.
//          The
//          design/code of *this class then does not then become bloated. Use a
//          lightweight version of the current MI command system.
//--
class CMICmdCmdGdbShow : public CMICmdBase {
  // Statics:
public:
  // Required by the CMICmdFactory when registering *this command
  static CMICmdBase *CreateSelf();

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

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

  // Typedefs:
private:
  typedef bool (CMICmdCmdGdbShow::*FnGdbOptionPtr)(
      const CMIUtilString::VecString_t &vrWords);
  typedef std::map<CMIUtilString, FnGdbOptionPtr>
      MapGdbOptionNameToFnGdbOptionPtr_t;

  // Methods:
private:
  bool GetOptionFn(const CMIUtilString &vrGdbOptionName,
                   FnGdbOptionPtr &vrwpFn) const;
  bool OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords);
  bool OptionFnPrint(const CMIUtilString::VecString_t &vrWords);
  bool OptionFnLanguage(const CMIUtilString::VecString_t &vrWords);
  bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords);
  bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);

  // Attributes:
private:
  const static MapGdbOptionNameToFnGdbOptionPtr_t
      ms_mapGdbOptionNameToFnGdbOptionPtr;

  const CMIUtilString m_constStrArgNamedGdbOption;
  bool m_bGdbOptionRecognised; // True = This command has a function with a name
                               // that matches the Print argument, false = not
                               // found
  bool m_bGdbOptionFnSuccessful; // True = The print function completed its task
                                 // ok, false = function failed for some reason
  bool m_bGbbOptionFnHasError;   // True = The option function has an error
                                 // condition (not the command!), false = option
                                 // function ok.
  CMIUtilString m_strGdbOptionName;
  CMIUtilString m_strGdbOptionFnError;
  CMIUtilString m_strValue;
};
