/* Header file for command creation.

   Copyright (C) 1986-2024 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 GDB_COMMAND_H
#define GDB_COMMAND_H

#include "gdbsupport/scoped_restore.h"

struct completion_tracker;

/* This file defines the public interface for any code wanting to
   create commands.  */

/* Command classes are top-level categories into which commands are
   broken down for "help" purposes.

   The class_alias is used for the user-defined aliases, defined
   using the "alias" command.

   Aliases pre-defined by GDB (e.g. the alias "bt" of the "backtrace" command)
   are not using the class_alias.
   Different pre-defined aliases of the same command do not necessarily
   have the same classes.  For example, class_stack is used for the
   "backtrace" and its "bt" alias", while "info stack" (also an alias
   of "backtrace" uses class_info.  */

enum command_class
{
  /* Classes of commands followed by a comment giving the name
     to use in "help <classname>".
     Note that help accepts unambiguous abbreviated class names.  */

  /* Special classes to help_list */
  all_classes = -2,  /* help without <classname> */
  all_commands = -1, /* all */

  /* Classes of commands */
  no_class = -1,
  class_run = 0,     /* running */
  class_vars,        /* data */
  class_stack,       /* stack */
  class_files,       /* files */
  class_support,     /* support */
  class_info,        /* status */
  class_breakpoint,  /* breakpoints */
  class_trace,       /* tracepoints */
  class_alias,       /* aliases */
  class_bookmark,
  class_obscure,     /* obscure */
  class_maintenance, /* internals */
  class_tui,         /* text-user-interface */
  class_user,        /* user-defined */

  /* Used for "show" commands that have no corresponding "set" command.  */
  no_set_class
};

/* Types of "set" or "show" command.  */
enum var_types
  {
    /* "on" or "off".  *VAR is a bool which is true for on,
       false for off.  */
    var_boolean,

    /* "on" / "true" / "enable" or "off" / "false" / "disable" or
       "auto.  *VAR is an ``enum auto_boolean''.  NOTE: In general a
       custom show command will need to be implemented - one that for
       "auto" prints both the "auto" and the current auto-selected
       value.  */
    var_auto_boolean,

    /* Unsigned Integer.  *VAR is an unsigned int.  In the Guile and Python
       APIs 0 means unlimited, which is stored in *VAR as UINT_MAX.  */
    var_uinteger,

    /* Like var_uinteger but signed.  *VAR is an int.  In the Guile and
       Python APIs 0 means unlimited, which is stored in *VAR as INT_MAX.  */
    var_integer,

    /* Like var_integer but negative numbers are not allowed,
       except for special values.  *VAR is an int.  */
    var_pinteger,

    /* String which the user enters with escapes (e.g. the user types
       \n and it is a real newline in the stored string).
       *VAR is a std::string, "" if the string is empty.  */
    var_string,
    /* String which stores what the user types verbatim.
       *VAR is std::string, "" if the string is empty.  */
    var_string_noescape,
    /* String which stores a filename.  (*VAR) is a std::string,
       "" if the string was empty.  */
    var_optional_filename,
    /* String which stores a filename.  (*VAR) is a std::string.  */
    var_filename,
    /* Enumerated type.  Can only have one of the specified values.
       *VAR is a char pointer to the name of the element that we
       find.  */
    var_enum,
    /* Color type.  *VAR is a ui_file_style::color structure.  */
    var_color
  };

/* A structure describing an extra literal accepted and shown in place
   of a number.  */
struct literal_def
{
  /* The literal to define, e.g. "unlimited".  */
  const char *literal;

  /* The number to substitute internally for LITERAL or VAL;
     the use of this number is not allowed (unless the same as VAL).  */
  LONGEST use;

  /* An optional number accepted that stands for the literal.  */
  std::optional<LONGEST> val;
};

/* Return true if a setting of type VAR_TYPE is backed with type T.

   This function is left without definition intentionally.  This template is
   specialized for all valid types that are used to back var_types.  Therefore
   if one tries to instantiate this un-specialized template it means the T
   parameter is not a type used to back a var_type and it is most likely a
   programming error.  */
template<typename T>
bool var_type_uses (var_types var_type) = delete;

/* Return true if a setting of type T is backed by a bool variable.  */
template<>
inline bool var_type_uses<bool> (var_types t)
{
  return t == var_boolean;
};

/* Return true if a setting of type T is backed by a auto_boolean variable.
*/
template<>
inline bool var_type_uses<enum auto_boolean> (var_types t)
{
  return t == var_auto_boolean;
}

/* Return true if a setting of type T is backed by an unsigned int variable.
*/
template<>
inline bool var_type_uses<unsigned int> (var_types t)
{
  return t == var_uinteger;
}

/* Return true if a setting of type T is backed by an int variable.  */
template<>
inline bool var_type_uses<int> (var_types t)
{
  return t == var_integer || t == var_pinteger;
}

/* Return true if a setting of type T is backed by a std::string variable.  */
template<>
inline bool var_type_uses<std::string> (var_types t)
{
  return (t == var_string || t == var_string_noescape
	  || t == var_optional_filename || t == var_filename);
}

/* Return true if a setting of type T is backed by a const char * variable.
*/
template<>
inline bool var_type_uses<const char *> (var_types t)
{
  return t == var_enum;
}

/* Return true if a setting of type T is backed by an ui_file_style::color
   variable.  */
template<>
inline bool var_type_uses<ui_file_style::color> (var_types t)
{
  return t == var_color;
}

template<bool is_scalar, typename T> struct setting_func_types_1;

template<typename T>
struct setting_func_types_1<true, T>
{
  using type = T;
  using set = void (*) (type);
  using get = type (*) ();
};

template<typename T>
struct setting_func_types_1<false, T>
{
  using type = const T &;
  using set = void (*) (type);
  using get = type (*) ();
};

template<typename T>
struct setting_func_types
{
  using type = typename setting_func_types_1<std::is_scalar<T>::value, T>::type;
  using set = typename setting_func_types_1<std::is_scalar<T>::value, T>::set;
  using get = typename setting_func_types_1<std::is_scalar<T>::value, T>::get;
};

/* Generic/type-erased function pointer.  */

using erased_func = void (*) ();

/* Interface for getting and setting a setting's value.

   The underlying data can be of any VAR_TYPES type.  */
struct setting
{
  /* Create a setting backed by a variable of type T.

     Type T must match the var type VAR_TYPE (see VAR_TYPE_USES).  */
  template<typename T>
  setting (var_types var_type, T *var,
	   const literal_def *extra_literals = nullptr)
    : m_var_type (var_type), m_var (var), m_extra_literals (extra_literals)
  {
    gdb_assert (var != nullptr);
    gdb_assert (var_type_uses<T> (var_type));
  }

  /* A setting can also be constructed with a pre-validated
     type-erased variable.  Use the following function to
     validate & type-erase said variable/function pointers.  */

  struct erased_args
  {
    void *var;
    erased_func setter;
    erased_func getter;
  };

  template<typename T>
  static erased_args erase_args (var_types var_type,
				 T *var,
				 typename setting_func_types<T>::set set_setting_func,
				 typename setting_func_types<T>::get get_setting_func)
  {
    gdb_assert (var_type_uses<T> (var_type));
  /* The getter and the setter must be both provided or both omitted.  */
    gdb_assert
      ((set_setting_func == nullptr) == (get_setting_func == nullptr));

  /* The caller must provide a pointer to a variable or get/set functions, but
     not both.  */
    gdb_assert ((set_setting_func == nullptr) != (var == nullptr));

    return {
	var,
	reinterpret_cast<erased_func> (set_setting_func),
	reinterpret_cast<erased_func> (get_setting_func)
    };
  }

  /* Create a setting backed by pre-validated type-erased args and using
     EXTRA_LITERALS.  ERASED_VAR's fields' real types must match the var
     type VAR_TYPE (see VAR_TYPE_USES).  */
  setting (var_types var_type, const literal_def *extra_literals,
	   const erased_args &args)
    : m_var_type (var_type),
      m_var (args.var),
      m_extra_literals (extra_literals),
      m_getter (args.getter),
      m_setter (args.setter)
  {
  }

  /* Create a setting backed by setter and getter functions.

     Type T must match the var type VAR_TYPE (see VAR_TYPE_USES).  */
  template<typename T>
  setting (var_types var_type,
	   typename setting_func_types<T>::set setter,
	   typename setting_func_types<T>::get getter)
    : m_var_type (var_type)
  {
    gdb_assert (var_type_uses<T> (var_type));

    /* Getters and setters are cast to and from the arbitrary `void (*) ()`
       function pointer type.  Make sure that the two types are really of the
       same size.  */
    static_assert (sizeof (m_getter) == sizeof (getter));
    static_assert (sizeof (m_setter) == sizeof (setter));

    m_getter = reinterpret_cast<erased_func> (getter);
    m_setter = reinterpret_cast<erased_func> (setter);
  }

  /* Access the type of the current setting.  */
  var_types type () const
  { return m_var_type; }

  /* Access any extra literals accepted.  */
  const literal_def *extra_literals () const
  { return m_extra_literals; }

  /* Return the current value.

     The template parameter T is the type of the variable used to store the
     setting.  */
  template<typename T>
  typename setting_func_types<T>::type get () const
  {
    gdb_assert (var_type_uses<T> (m_var_type));

    if (m_var == nullptr)
      {
	gdb_assert (m_getter != nullptr);
	auto getter = reinterpret_cast<typename setting_func_types<T>::get> (m_getter);
	return getter ();
      }
    else
      return *static_cast<const T *> (m_var);
  }

  /* Sets the value of the setting to V.  Returns true if the setting was
     effectively changed, false if the update failed and the setting is left
     unchanged.

     If we have a user-provided setter, use it to set the setting.  Otherwise
     copy the value V to the internally referenced buffer.

     The template parameter T indicates the type of the variable used to store
     the setting.

     The var_type of the setting must match T.  */
  template<typename T>
  bool set (const T &v)
  {
    /* Check that the current instance is of one of the supported types for
       this instantiation.  */
    gdb_assert (var_type_uses<T> (m_var_type));

    const T old_value = this->get<T> ();

    if (m_var == nullptr)
      {
	gdb_assert (m_setter != nullptr);
	auto setter = reinterpret_cast<typename setting_func_types<T>::set> (m_setter);
	setter (v);
      }
    else
      *static_cast<T *> (m_var) = v;

    return old_value != this->get<T> ();
  }

private:
  /* The type of the variable M_VAR is pointing to, or that M_GETTER / M_SETTER
     get or set.  */
  var_types m_var_type;

  /* Pointer to the enclosed variable

     Either M_VAR is non-nullptr, or both M_GETTER and M_SETTER are
     non-nullptr.  */
  void *m_var = nullptr;

  /* Any extra literals accepted.  */
  const literal_def *m_extra_literals = nullptr;

  /* Pointer to a user provided getter.  */
  erased_func m_getter = nullptr;

  /* Pointer to a user provided setter.  */
  erased_func m_setter = nullptr;
};

/* This structure records one command'd definition.  */
struct cmd_list_element;

/* The "simple" signature of command callbacks, which doesn't include a
   cmd_list_element parameter.  */

typedef void cmd_simple_func_ftype (const char *args, int from_tty);

/* This structure specifies notifications to be suppressed by a cli
   command interpreter.  */

struct cli_suppress_notification
{
  /* Inferior, thread, frame selected notification suppressed?  */
  bool user_selected_context = false;

  /* Normal stop event suppressed? */
  bool normal_stop = false;
};

extern struct cli_suppress_notification cli_suppress_notification;

/* Forward-declarations of the entry-points of cli/cli-decode.c.  */

/* API to the manipulation of command lists.  */

/* Return TRUE if NAME is a valid user-defined command name.
   This is a stricter subset of all gdb commands,
   see find_command_name_length.  */

extern bool valid_user_defined_cmd_name_p (const char *name);

/* Return TRUE if C is a valid command character.  */

extern bool valid_cmd_char_p (int c);

/* Return value type for the add_setshow_* functions.  */

struct set_show_commands
{
  cmd_list_element *set, *show;
};

/* Const-correct variant of the above.  */

extern struct cmd_list_element *add_cmd (const char *, enum command_class,
					 cmd_simple_func_ftype *fun,
					 const char *,
					 struct cmd_list_element **);

/* Like add_cmd, but no command function is specified.  */

extern struct cmd_list_element *add_cmd (const char *, enum command_class,
					 const char *,
					 struct cmd_list_element **);

extern struct cmd_list_element *add_cmd_suppress_notification
			(const char *name, enum command_class theclass,
			 cmd_simple_func_ftype *fun, const char *doc,
			 struct cmd_list_element **list,
			 bool *suppress_notification);

extern struct cmd_list_element *add_alias_cmd (const char *,
					       cmd_list_element *,
					       enum command_class, int,
					       struct cmd_list_element **);


extern struct cmd_list_element *add_prefix_cmd (const char *, enum command_class,
						cmd_simple_func_ftype *fun,
						const char *,
						struct cmd_list_element **,
						int,
						struct cmd_list_element **);

/* Like add_prefix_cmd, but sets the callback to a function that
   simply calls help_list.  */

extern struct cmd_list_element *add_basic_prefix_cmd
  (const char *, enum command_class, const char *, struct cmd_list_element **,
   int, struct cmd_list_element **);

/* Like add_prefix_cmd, but useful for "show" prefixes.  This sets the
   callback to a function that simply calls cmd_show_list.  */

extern struct cmd_list_element *add_show_prefix_cmd
  (const char *, enum command_class, const char *, struct cmd_list_element **,
   int, struct cmd_list_element **);

/* Add matching set and show commands using add_basic_prefix_cmd and
   add_show_prefix_cmd.  */

extern set_show_commands add_setshow_prefix_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc,
   cmd_list_element **set_subcommands_list,
   cmd_list_element **show_subcommands_list,
   cmd_list_element **set_list,
   cmd_list_element **show_list);

extern struct cmd_list_element *add_prefix_cmd_suppress_notification
			(const char *name, enum command_class theclass,
			 cmd_simple_func_ftype *fun,
			 const char *doc, struct cmd_list_element **subcommands,
			 int allow_unknown,
			 struct cmd_list_element **list,
			 bool *suppress_notification);

extern struct cmd_list_element *add_abbrev_prefix_cmd (const char *,
						       enum command_class,
						       cmd_simple_func_ftype *fun,
						       const char *,
						       struct cmd_list_element
						       **, int,
						       struct cmd_list_element
						       **);

typedef void cmd_func_ftype (const char *args, int from_tty,
			     cmd_list_element *c);

/* A completion routine.  Add possible completions to tracker.

   TEXT is the text beyond what was matched for the command itself
   (leading whitespace is skipped).  It stops where we are supposed to
   stop completing (rl_point) and is '\0' terminated.  WORD points in
   the same buffer as TEXT, and completions should be returned
   relative to this position.  For example, suppose TEXT is "foo" and
   we want to complete to "foobar".  If WORD is "oo", return "oobar";
   if WORD is "baz/foo", return "baz/foobar".  */
typedef void completer_ftype (struct cmd_list_element *,
			      completion_tracker &tracker,
			      const char *text, const char *word);

/* Same, but for set_cmd_completer_handle_brkchars.  */
typedef void completer_handle_brkchars_ftype (struct cmd_list_element *,
					      completion_tracker &tracker,
					      const char *text, const char *word);

extern void set_cmd_completer (struct cmd_list_element *, completer_ftype *);

/* Set the completer_handle_brkchars callback.  */

extern void set_cmd_completer_handle_brkchars (struct cmd_list_element *,
					       completer_handle_brkchars_ftype *);

/* HACK: cagney/2002-02-23: Code, mostly in tracepoints.c, grubs
   around in cmd objects to test the value of the commands sfunc().  */
extern int cmd_simple_func_eq (struct cmd_list_element *cmd,
			 cmd_simple_func_ftype *cfun);

/* Execute CMD's pre/post hook.  Throw an error if the command fails.
   If already executing this pre/post hook, or there is no pre/post
   hook, the call is silently ignored.  */
extern void execute_cmd_pre_hook (struct cmd_list_element *cmd);
extern void execute_cmd_post_hook (struct cmd_list_element *cmd);

/* Flag for an ambiguous cmd_list result.  */
#define CMD_LIST_AMBIGUOUS ((struct cmd_list_element *) -1)

extern struct cmd_list_element *lookup_cmd (const char **,
					    struct cmd_list_element *,
					    const char *,
					    std::string *,
					    int, int);

/* This routine takes a line of TEXT and a CLIST in which to start the
   lookup.  When it returns it will have incremented the text pointer past
   the section of text it matched, set *RESULT_LIST to point to the list in
   which the last word was matched, and will return a pointer to the cmd
   list element which the text matches.  It will return NULL if no match at
   all was possible.  It will return -1 (cast appropriately, ick) if ambigous
   matches are possible; in this case *RESULT_LIST will be set to point to
   the list in which there are ambiguous choices (and *TEXT will be set to
   the ambiguous text string).

   if DEFAULT_ARGS is not null, *DEFAULT_ARGS is set to the found command
   default args (possibly empty).

   If the located command was an abbreviation, this routine returns the base
   command of the abbreviation.  Note that *DEFAULT_ARGS will contain the
   default args defined for the alias.

   It does no error reporting whatsoever; control will always return
   to the superior routine.

   In the case of an ambiguous return (-1), *RESULT_LIST will be set to point
   at the prefix_command (ie. the best match) *or* (special case) will be NULL
   if no prefix command was ever found.  For example, in the case of "info a",
   "info" matches without ambiguity, but "a" could be "args" or "address", so
   *RESULT_LIST is set to the cmd_list_element for "info".  So in this case
   RESULT_LIST should not be interpreted as a pointer to the beginning of a
   list; it simply points to a specific command.  In the case of an ambiguous
   return *TEXT is advanced past the last non-ambiguous prefix (e.g.
   "info t" can be "info types" or "info target"; upon return *TEXT has been
   advanced past "info ").

   If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise
   affect the operation).

   This routine does *not* modify the text pointed to by TEXT.

   If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which
   are actually help classes rather than commands (i.e. the function field of
   the struct cmd_list_element is NULL).

   When LOOKUP_FOR_COMPLETION_P is true the completion is being requested
   for the completion engine, no warnings should be printed.  */

extern struct cmd_list_element *lookup_cmd_1
	(const char **text, struct cmd_list_element *clist,
	 struct cmd_list_element **result_list, std::string *default_args,
	 int ignore_help_classes, bool lookup_for_completion_p = false);

/* Look up the command called NAME in the command list LIST.

   Unlike LOOKUP_CMD, partial matches are ignored and only exact matches
   on NAME are considered.

   LIST is a chain of struct cmd_list_element's.

   If IGNORE_HELP_CLASSES is true (the default), ignore any command list
   elements which are actually help classes rather than commands (i.e.
   the function field of the struct cmd_list_element is null).

   If found, return the struct cmd_list_element for that command,
   otherwise return NULLPTR.  */

extern struct cmd_list_element *lookup_cmd_exact
			(const char *name,
			 struct cmd_list_element *list,
			 bool ignore_help_classes = true);

extern struct cmd_list_element *deprecate_cmd (struct cmd_list_element *,
					       const char * );

extern void deprecated_cmd_warning (const char *, struct cmd_list_element *);

extern int lookup_cmd_composition (const char *text,
				   struct cmd_list_element **alias,
				   struct cmd_list_element **prefix_cmd,
				   struct cmd_list_element **cmd);

extern struct cmd_list_element *add_com (const char *, enum command_class,
					 cmd_simple_func_ftype *fun,
					 const char *);

extern cmd_list_element *add_com_alias (const char *name,
					cmd_list_element *target,
					command_class theclass,
					int abbrev_flag);

extern struct cmd_list_element *add_com_suppress_notification
		       (const char *name, enum command_class theclass,
			cmd_simple_func_ftype *fun, const char *doc,
			bool *suppress_notification);

extern struct cmd_list_element *add_info (const char *,
					  cmd_simple_func_ftype *fun,
					  const char *);

extern cmd_list_element *add_info_alias (const char *name,
					 cmd_list_element *target,
					 int abbrev_flag);

extern void complete_on_cmdlist (struct cmd_list_element *,
				 completion_tracker &tracker,
				 const char *, const char *, int);

extern void complete_on_enum (completion_tracker &tracker,
			      const char *const *enumlist,
			      const char *, const char *);

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

extern void help_list (struct cmd_list_element *, const char *,
		       enum command_class, struct ui_file *);

/* Method for show a set/show variable's VALUE on FILE.  */
typedef void (show_value_ftype) (struct ui_file *file,
				 int from_tty,
				 struct cmd_list_element *cmd,
				 const char *value);

/* Various sets of extra literals accepted.  */
extern const literal_def integer_unlimited_literals[];
extern const literal_def uinteger_unlimited_literals[];
extern const literal_def pinteger_unlimited_literals[];

extern set_show_commands add_setshow_enum_cmd
  (const char *name, command_class theclass, const char *const *enumlist,
   const char **var, const char *set_doc, const char *show_doc,
   const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_enum_cmd
  (const char *name, command_class theclass, const char *const *enumlist,
   const char *set_doc, const char *show_doc,
   const char *help_doc, setting_func_types<const char *>::set set_func,
   setting_func_types<const char *>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_color_cmd
  (const char *name, command_class theclass, ui_file_style::color *var,
   const char *set_doc, const char *show_doc, const char *help_doc,
   cmd_func_ftype *set_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_color_cmd
  (const char *name, command_class theclass,
   const char *set_doc, const char *show_doc, const char *help_doc,
   setting_func_types<ui_file_style::color>::set set_func,
   setting_func_types<ui_file_style::color>::get get_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_auto_boolean_cmd
  (const char *name, command_class theclass, auto_boolean *var,
   const char *set_doc, const char *show_doc, const char *help_doc,
   cmd_func_ftype *set_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_auto_boolean_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<enum auto_boolean>::set set_func,
   setting_func_types<enum auto_boolean>::get get_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_boolean_cmd
  (const char *name, command_class theclass, bool *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_boolean_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<bool>::set set_func,
   setting_func_types<bool>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_filename_cmd
  (const char *name, command_class theclass, std::string *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_filename_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<std::string>::set set_func,
   setting_func_types<std::string>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_string_cmd
  (const char *name, command_class theclass, std::string *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_string_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<std::string>::set set_func,
   setting_func_types<std::string>::get get_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_string_noescape_cmd
  (const char *name, command_class theclass, std::string *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_string_noescape_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<std::string>::set set_func,
   setting_func_types<std::string>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_optional_filename_cmd
  (const char *name, command_class theclass, std::string *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_optional_filename_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<std::string>::set set_func,
   setting_func_types<std::string>::get get_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_integer_cmd
  (const char *name, command_class theclass, int *var,
   const literal_def *extra_literals, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_integer_cmd
  (const char *name, command_class theclass, const literal_def *extra_literals,
   const char *set_doc, const char *show_doc, const char *help_doc,
   setting_func_types<int>::set set_func,
   setting_func_types<int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_integer_cmd
  (const char *name, command_class theclass, int *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_integer_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<int>::set set_func,
   setting_func_types<int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_pinteger_cmd
  (const char *name, command_class theclass, int *var,
   const literal_def *extra_literals, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_pinteger_cmd
  (const char *name, command_class theclass, const literal_def *extra_literals,
   const char *set_doc, const char *show_doc, const char *help_doc,
   setting_func_types<int>::set set_func,
   setting_func_types<int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_uinteger_cmd
  (const char *name, command_class theclass, unsigned int *var,
   const literal_def *extra_literals,
   const char *set_doc, const char *show_doc, const char *help_doc,
   cmd_func_ftype *set_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_uinteger_cmd
  (const char *name, command_class theclass, const literal_def *extra_literals,
   const char *set_doc, const char *show_doc, const char *help_doc,
   setting_func_types<unsigned int>::set set_func,
   setting_func_types<unsigned int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_uinteger_cmd
  (const char *name, command_class theclass, unsigned int *var,
   const char *set_doc, const char *show_doc, const char *help_doc,
   cmd_func_ftype *set_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_uinteger_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<unsigned int>::set set_func,
   setting_func_types<unsigned int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_zinteger_cmd
  (const char *name, command_class theclass, int *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_zinteger_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<int>::set set_func,
   setting_func_types<int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_zuinteger_cmd
  (const char *name, command_class theclass, unsigned int *var,
   const char *set_doc, const char *show_doc, const char *help_doc,
   cmd_func_ftype *set_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_zuinteger_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<unsigned int>::set set_func,
   setting_func_types<unsigned int>::get get_func, show_value_ftype *show_func,
   cmd_list_element **set_list, cmd_list_element **show_list);

extern set_show_commands add_setshow_zuinteger_unlimited_cmd
  (const char *name, command_class theclass, int *var, const char *set_doc,
   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

extern set_show_commands add_setshow_zuinteger_unlimited_cmd
  (const char *name, command_class theclass, const char *set_doc,
   const char *show_doc, const char *help_doc,
   setting_func_types<int>::set set_func, setting_func_types<int>::get get_func,
   show_value_ftype *show_func, cmd_list_element **set_list,
   cmd_list_element **show_list);

/* Do a "show" command for each thing on a command list.  */

extern void cmd_show_list (struct cmd_list_element *, int);

/* Used everywhere whenever at least one parameter is required and
   none is specified.  */

[[noreturn]] extern void error_no_arg (const char *);


/* Command line saving and repetition.
   Each input line executed is saved to possibly be repeated either
   when the user types an empty line, or be repeated by a command
   that wants to repeat the previously executed command.  The below
   functions control command repetition.  */

/* Commands call dont_repeat if they do not want to be repeated by null
   lines or by repeat_previous ().  */

extern void dont_repeat ();

/* Commands call repeat_previous if they want to repeat the previous
   command.  Such commands that repeat the previous command must
   indicate to not repeat themselves, to avoid recursive repeat.
   repeat_previous marks the current command as not repeating, and
   ensures get_saved_command_line returns the previous command, so
   that the currently executing command can repeat it.  If there's no
   previous command, throws an error.  Otherwise, returns the result
   of get_saved_command_line, which now points at the command to
   repeat.  */

extern const char *repeat_previous ();

/* Prevent dont_repeat from working, and return a cleanup that
   restores the previous state.  */

extern scoped_restore_tmpl<int> prevent_dont_repeat (void);

/* Set the arguments that will be passed if the current command is
   repeated.  Note that the passed-in string must be a constant.  */

extern void set_repeat_arguments (const char *args);

/* Returns the saved command line to repeat.
   When a command is being executed, this is the currently executing
   command line, unless the currently executing command has called
   repeat_previous (): in this case, get_saved_command_line returns
   the previously saved command line.  */

extern char *get_saved_command_line ();

/* Takes a copy of CMD, for possible repetition.  */

extern void save_command_line (const char *cmd);

/* 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 *, int);

/* Call the command function.  */
extern void cmd_func (struct cmd_list_element *cmd,
		      const char *args, int from_tty);

#endif /* GDB_COMMAND_H */
