/* Header file for GDB command decoding library.

   Copyright (C) 2000-2021 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef CLI_CLI_DECODE_H
#define CLI_CLI_DECODE_H

/* This file defines the private interfaces for any code implementing
   command internals.  */

/* Include the public interfaces.  */
#include "command.h"
#include "gdb_regex.h"
#include "cli-script.h"
#include "completer.h"

/* Not a set/show command.  Note that some commands which begin with
   "set" or "show" might be in this category, if their syntax does
   not fall into one of the following categories.  */
enum cmd_types
{
  not_set_cmd,
  set_cmd,
  show_cmd
};

/* This structure records one command'd definition.  */


struct cmd_list_element
{
  cmd_list_element (const char *name_, enum command_class theclass_,
		    const char *doc_)
    : name (name_),
      theclass (theclass_),
      cmd_deprecated (0),
      deprecated_warn_user (0),
      malloced_replacement (0),
      doc_allocated (0),
      name_allocated (0),
      hook_in (0),
      allow_unknown (0),
      abbrev_flag (0),
      type (not_set_cmd),
      var_type (var_boolean),
      doc (doc_)
  {
    memset (&function, 0, sizeof (function));
  }

  ~cmd_list_element ()
  {
    if (doc && doc_allocated)
      xfree ((char *) doc);
    if (name_allocated)
      xfree ((char *) name);
  }

  DISABLE_COPY_AND_ASSIGN (cmd_list_element);

  /* For prefix commands, return a string containing prefix commands to
     get here: this one plus any others needed to get to it.  Ends in a
     space.  It is used before the word "command" in describing the
     commands reached through this prefix.

     For non-prefix commands, return an empty string.  */
  std::string prefixname () const;

  /* Return true if this command is an alias of another command.  */
  bool is_alias () const
  { return this->alias_target != nullptr; }

  /* Return true if this command is a prefix command.  */
  bool is_prefix () const
  { return this->subcommands != nullptr; }

  /* Return true if this command is a "command class help" command.  For
     instance, a "stack" dummy command is registered so that one can do
     "help stack" and show help for all commands of the "stack" class.  */
  bool is_command_class_help () const
  { return this->func == nullptr; }

  void set_context (void *context)
  {
    gdb_assert (m_context == nullptr);
    m_context = context;
  }

  void *context () const
  { return m_context; }

  /* Points to next command in this list.  */
  struct cmd_list_element *next = nullptr;

  /* Name of this command.  */
  const char *name;

  /* Command class; class values are chosen by application program.  */
  enum command_class theclass;

  /* When 1 indicated that this command is deprecated.  It may be
     removed from gdb's command set in the future.  */

  unsigned int cmd_deprecated : 1;

  /* The user needs to be warned that this is a deprecated command.
     The user should only be warned the first time a command is
     used.  */

  unsigned int deprecated_warn_user : 1;

  /* When functions are deprecated at compile time (this is the way
     it should, in general, be done) the memory containing the
     replacement string is statically allocated.  In some cases it
     makes sense to deprecate commands at runtime (the testsuite is
     one example).  In this case the memory for replacement is
     malloc'ed.  When a command is undeprecated or re-deprecated at
     runtime we don't want to risk calling free on statically
     allocated memory, so we check this flag.  */

  unsigned int malloced_replacement : 1;

  /* Set if the doc field should be xfree'd.  */

  unsigned int doc_allocated : 1;

  /* Set if the name field should be xfree'd.  */

  unsigned int name_allocated : 1;

  /* Flag that specifies if this command is already running its hook.  */
  /* Prevents the possibility of hook recursion.  */
  unsigned int hook_in : 1;

  /* For prefix commands only:
     nonzero means do not get an error if subcommand is not
     recognized; call the prefix's own function in that case.  */
  unsigned int allow_unknown : 1;

  /* Nonzero says this is an abbreviation, and should not
     be mentioned in lists of commands.
     This allows "br<tab>" to complete to "break", which it
     otherwise wouldn't.  */
  unsigned int abbrev_flag : 1;

  /* Type of "set" or "show" command (or SET_NOT_SET if not "set"
     or "show").  */
  ENUM_BITFIELD (cmd_types) type : 2;

  /* What kind of variable is *VAR?  */
  ENUM_BITFIELD (var_types) var_type : 4;

  /* Function definition of this command.  NULL for command class
     names and for help topics that are not really commands.  NOTE:
     cagney/2002-02-02: This function signature is evolving.  For
     the moment suggest sticking with either set_cmd_cfunc() or
     set_cmd_sfunc().  */
  cmd_func_ftype *func;

  /* The command's real callback.  At present func() bounces through
     to one of the below.  */
  union
    {
      /* Most commands don't need the cmd_list_element parameter passed to FUNC.
	 They therefore register a command of this type, which doesn't have the
	 cmd_list_element parameter.  do_simple_func is installed as FUNC, and
	 acts as a shim between the two.  */
      cmd_simple_func_ftype *simple_func;
    }
  function;

  /* Documentation of this command (or help topic).
     First line is brief documentation; remaining lines form, with it,
     the full documentation.  First line should end with a period.
     Entire string should also end with a period, not a newline.  */
  const char *doc;

  /* For set/show commands.  A method for printing the output to the
     specified stream.  */
  show_value_ftype *show_value_func = nullptr;

  /* If this command is deprecated, this is the replacement name.  */
  const char *replacement = nullptr;

  /* Hook for another command to be executed before this command.  */
  struct cmd_list_element *hook_pre = nullptr;

  /* Hook for another command to be executed after this command.  */
  struct cmd_list_element *hook_post = nullptr;

  /* Default arguments to automatically prepend to the user
     provided arguments when running this command or alias.  */
  std::string default_args;

  /* Nonzero identifies a prefix command.  For them, the address
     of the variable containing the list of subcommands.  */
  struct cmd_list_element **subcommands = nullptr;

  /* The prefix command of this command.  */
  struct cmd_list_element *prefix = nullptr;

  /* Completion routine for this command.  */
  completer_ftype *completer = symbol_completer;

  /* Handle the word break characters for this completer.  Usually
     this function need not be defined, but for some types of
     completers (e.g., Python completers declared as methods inside
     a class) the word break chars may need to be redefined
     depending on the completer type (e.g., for filename
     completers).  */
  completer_handle_brkchars_ftype *completer_handle_brkchars = nullptr;

  /* Destruction routine for this command.  If non-NULL, this is
     called when this command instance is destroyed.  This may be
     used to finalize the CONTEXT field, if needed.  */
  void (*destroyer) (struct cmd_list_element *self, void *context) = nullptr;

  /* Pointer to variable affected by "set" and "show".  Doesn't
     matter if type is not_set.  */
  void *var = nullptr;

  /* Pointer to NULL terminated list of enumerated values (like
     argv).  */
  const char *const *enums = nullptr;

  /* Pointer to command strings of user-defined commands */
  counted_command_line user_commands;

  /* Pointer to command that is hooked by this one, (by hook_pre)
     so the hook can be removed when this one is deleted.  */
  struct cmd_list_element *hookee_pre = nullptr;

  /* Pointer to command that is hooked by this one, (by hook_post)
     so the hook can be removed when this one is deleted.  */
  struct cmd_list_element *hookee_post = nullptr;

  /* Pointer to command that is aliased by this one, so the
     aliased command can be located in case it has been hooked.  */
  struct cmd_list_element *alias_target = nullptr;

  /* Start of a linked list of all aliases of this command.  */
  struct cmd_list_element *aliases = nullptr;

  /* Link pointer for aliases on an alias list.  */
  struct cmd_list_element *alias_chain = nullptr;

  /* If non-null, the pointer to a field in 'struct
     cli_suppress_notification', which will be set to true in cmd_func
     when this command is being executed.  It will be set back to false
     when the command has been executed.  */
  int *suppress_notification = nullptr;

private:
  /* Local state (context) for this command.  This can be anything.  */
  void *m_context = nullptr;
};

/* Functions that implement commands about CLI commands.  */

extern void help_cmd (const char *, struct ui_file *);

extern void apropos_cmd (struct ui_file *, struct cmd_list_element *,
			 bool verbose, compiled_regex &, const char *);

/* Used to mark commands that don't do anything.  If we just leave the
   function field NULL, the command is interpreted as a help topic, or
   as a class of commands.  */

extern void not_just_help_class_command (const char *arg, int from_tty);

/* Print only the first line of STR on STREAM.
   FOR_VALUE_PREFIX true indicates that the first line is output
   to be a prefix to show a value (see deprecated_show_value_hack):
   the first character is printed in uppercase, and the trailing
   dot character is not printed.  */

extern void print_doc_line (struct ui_file *stream, const char *str,
			    bool for_value_prefix);

/* The enums of boolean commands.  */
extern const char * const boolean_enums[];

/* The enums of auto-boolean commands.  */
extern const char * const auto_boolean_enums[];

/* Verify whether a given cmd_list_element is a user-defined command.
   Return 1 if it is user-defined.  Return 0 otherwise.  */

extern int cli_user_command_p (struct cmd_list_element *);

extern int find_command_name_length (const char *);

#endif /* CLI_CLI_DECODE_H */
