mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
6f937416b9
This is sort of a continuation of Keith's parse_exp_1 constification patch. It started out by undoing these bits: @@ -754,9 +754,12 @@ validate_actionline (char **line, struct tmp_p = p; for (loc = t->base.loc; loc; loc = loc->next) { - p = tmp_p; - exp = parse_exp_1 (&p, loc->address, + const char *q; + + q = tmp_p; + exp = parse_exp_1 (&q, loc->address, block_for_pc (loc->address), 1); + p = (char *) q; and progressively making more things const upwards, fixing fallout, rinse repeat, until GDB built again (--enable-targets=all). That ended up constifying lookup_cmd/add_cmd and (lots of) friends, and the completers. I didn't try to constify the command hooks themselves, because I know upfront there are commands that write to the command string argument, and I think I managed to stop at a nice non-hacky split point already. I think the only non-really-super-obvious changes are tracepoint.c:validate_actionline, and tracepoint.c:trace_dump_actions. The rest is just mostly about 'char *' => 'const char *', 'char **'=> 'const char **', and the occasional (e.g., deprecated_cmd_warning) case of 'char **'=> 'const char *', where/when I noticed that nothing actually cares about the pointer to pointer output. Tested on x86_64 Fedora 17, native and gdbserver. gdb/ 2013-03-13 Pedro Alves <palves@redhat.com> * ada-lang.c (struct add_partial_datum) <text, text0, word>: Make fields const. (ada_make_symbol_completion_list): Make "text0" parameter const. * ax-gdb.c (agent_eval_command_one): Make "exp" parameter const. * breakpoint.c (condition_completer): Make "text" and "word" parameters const. Adjust. (check_tracepoint_command): Adjust to validate_actionline prototype change. (catch_syscall_completer): Make "text" and "word" parameters const. * cli/cli-cmds.c (show_user): Make "comname" local const. (valid_command_p): Make "command" parameter const. (alias_command): Make "alias_prefix" and "command_prefix" locals const. * cli/cli-decode.c (add_cmd): Make "name" parameter const. (add_alias_cmd): Make "name" and "oldname" parameters const. Adjust. No longer make copy of OLDNAME. (add_prefix_cmd, add_abbrev_prefix_cmd, add_set_or_show_cmd) (add_setshow_cmd_full, add_setshow_enum_cmd) (add_setshow_auto_boolean_cmd, add_setshow_boolean_cmd) (add_setshow_filename_cmd, add_setshow_string_cmd) (add_setshow_string_noescape_cmd) (add_setshow_optional_filename_cmd, add_setshow_integer_cmd) (add_setshow_uinteger_cmd, add_setshow_zinteger_cmd) (add_setshow_zuinteger_unlimited_cmd, add_setshow_zuinteger_cmd) (delete_cmd, add_info, add_info_alias, add_com, add_com_alias): Make "name" parameter const. (help_cmd): Rename "command" parameter to "arg". New const local "command". (find_cmd): Make "command" parameter const. (lookup_cmd_1): Make "text" parameter pointer to const. Adjust to deprecated_cmd_warning prototype change. (undef_cmd_error): Make "cmdtype" parameter const. (lookup_cmd): Make "line" parameter const. (deprecated_cmd_warning): Change type of "text" parameter to pointer to const char, from pointer to pointer to char. Adjust. (lookup_cmd_composition): Make "text" parameter const. (complete_on_cmdlist, complete_on_enum): Make "text" and "word" parameters const. * cli/cli-decode.h (struct cmd_list_element) <name>: Make field const. * cli/cli-script.c (validate_comname): Make "tem" local const. (define_command): New const local "tem_c". Use it in calls to lookup_cmd. (document_command): Make "tem" and "comfull" locals const. (show_user_1): Make "prefix" and "name" parameters const. * cli-script.h (show_user_1): Make "prefix" and "name" parameters const. * command.h (add_cmd, add_alias_cmd, add_prefix_cmd) (add_abbrev_prefix_cmd, completer_ftype, lookup_cmd, lookup_cmd_1) (deprecated_cmd_warning, lookup_cmd_composition, add_com) (add_com_alias, add_info, add_info_alias, complete_on_cmdlist) (complete_on_enum, add_setshow_enum_cmd) (add_setshow_auto_boolean_cmd, add_setshow_boolean_cmd) (add_setshow_filename_cmd, add_setshow_string_cmd) (add_setshow_string_noescape_cmd) (add_setshow_optional_filename_cmd, add_setshow_integer_cmd) (add_setshow_uinteger_cmd, add_setshow_zinteger_cmd) (add_setshow_zuinteger_cmd, add_setshow_zuinteger_unlimited_cmd): Change prototypes, constifying strings. * completer.c (noop_completer, filename_completer): Make "text" and "prefix" parameters const. (location_completer, expression_completer) (complete_line_internal): Make "text" and "prefix" parameters const and adjust. (command_completer, signal_completer): Make "text" and "prefix" parameters const. * completer.h (noop_completer, filename_completer) (expression_completer, location_completer, command_completer) (signal_completer): Change prototypes. * corefile.c (complete_set_gnutarget): Make "text" and "word" parameters const. * cp-abi.c (cp_abi_completer): Likewise. * expression.h (parse_expression_for_completion): Change prototype. * f-lang.c (f_make_symbol_completion_list): Make "text" and "word" parameters const. * infcmd.c (_initialize_infcmd): Make "cmd_name" local const. * infrun.c (handle_completer): Make "text" and "word" parameters const. * interps.c (interpreter_completer): Make "text" and "word" parameters const. * language.h (struct language_defn) <la_make_symbol_completion_list>: Make "text" and "word" parameters const. * parse.c (parse_exp_1): Move const hack to parse_exp_in_context. (parse_exp_in_context): Rename to ... (parse_exp_in_context_1): ... this. (parse_exp_in_context): Reimplement, with const hack from parse_exp_1. (parse_expression_for_completion): Make "string" parameter const. * printcmd.c (decode_format): Make "string_ptr" parameter pointer to pointer to const char. Adjust. (print_command_1): Make "exp" parameter const. (output_command): Rename to ... (output_command_const): ... this. Make "exp" parameter const. (output_command): Reimplement. (x_command): Adjust. (display_command): Rename "exp" parameter to "arg". New "exp" local, const version of "arg". * python/py-auto-load.c (gdbpy_initialize_auto_load): Make "cmd_name" local const. * python/py-cmd.c (cmdpy_destroyer): Cast const away in xfree call. (cmdpy_completer): Make "text" and "word" parameters const. (gdbpy_parse_command_name): Make "prefix_text2" local const. * python/py-param.c (add_setshow_generic): Make "tmp_name" local const. * remote.c (_initialize_remote): Make "cmd_name" local const. * symtab.c (language_search_unquoted_string): Make "text" and "p" parameters const. Adjust. (completion_list_add_fields): Make "sym_text", "text" and "word" parameters const. (struct add_name_data) <sym_text, text, word>: Make fields const. (default_make_symbol_completion_list_break_on): Make "text" and "word" parameters const. Adjust locals. (default_make_symbol_completion_list) (make_symbol_completion_list, make_symbol_completion_type) (make_symbol_completion_list_fn): Make "text" and "word" parameters const. (make_file_symbol_completion_list): Make "text", "word" and "srcfile" parameters const. Adjust locals. (add_filename_to_list): Make "text" and "word" parameters const. (struct add_partial_filename_data) <text, word>: Make fields const. (make_source_files_completion_list): Make "text" and "word" parameters const. * symtab.h (default_make_symbol_completion_list_break_on) (default_make_symbol_completion_list, make_symbol_completion_list) (make_symbol_completion_type enum type_code) (make_symbol_completion_list_fn make_file_symbol_completion_list) (make_source_files_completion_list): Change prototype. * top.c (execute_command): Adjust to pass pointer to pointer to const char to lookup_cmd, and to deprecated_cmd_warning prototype change. (set_verbose): Make "cmdname" local const. * tracepoint.c (decode_agent_options): Make "exp" parameter const, and adjust. (validate_actionline): Make "line" parameter a pointer to const char, and adjust. (encode_actions_1): Make "action_exp" local const, and adjust. (encode_actions): Adjust. (replace_comma): Delete. (trace_dump_actions): Make "action_exp" and "next_comma" locals const, and adjust. Don't frob the action string while splitting it at commas. Instead, make a copy of each split substring in turn. (trace_dump_command): Adjust to validate_actionline prototype change. * tracepoint.h (decode_agent_options, decode_agent_options) (encode_actions, validate_actionline): Change prototypes. * valprint.h (output_command): Delete declaration. (output_command_const): Declare. * value.c (function_destroyer): Cast const away in xfree call.
401 lines
14 KiB
C
401 lines
14 KiB
C
/* Header file for command creation.
|
|
|
|
Copyright (C) 1986-2013 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/>. */
|
|
|
|
#if !defined (COMMAND_H)
|
|
#define COMMAND_H 1
|
|
|
|
#include "gdb_vecs.h"
|
|
|
|
/* 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.
|
|
|
|
Notes on classes: class_alias is for alias commands which are not
|
|
abbreviations of the original command. class-pseudo is for
|
|
commands which are not really commands nor help topics ("stop"). */
|
|
|
|
enum command_class
|
|
{
|
|
/* Special args to help_list */
|
|
class_deprecated = -3, all_classes = -2, all_commands = -1,
|
|
/* Classes of commands */
|
|
no_class = -1, class_run = 0, class_vars, class_stack, class_files,
|
|
class_support, class_info, class_breakpoint, class_trace,
|
|
class_alias, class_bookmark, class_obscure, class_maintenance,
|
|
class_pseudo, class_tui, class_user, class_xdb,
|
|
no_set_class /* Used for "show" commands that have no corresponding
|
|
"set" command. */
|
|
};
|
|
|
|
/* FIXME: cagney/2002-03-17: Once cmd_type() has been removed, ``enum
|
|
cmd_types'' can be moved from "command.h" to "cli-decode.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. */
|
|
typedef enum cmd_types
|
|
{
|
|
not_set_cmd,
|
|
set_cmd,
|
|
show_cmd
|
|
}
|
|
cmd_types;
|
|
|
|
/* Types of "set" or "show" command. */
|
|
typedef enum var_types
|
|
{
|
|
/* "on" or "off". *VAR is an integer which is nonzero for on,
|
|
zero 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. The user can type
|
|
0 to mean "unlimited", which is stored in *VAR as UINT_MAX. */
|
|
var_uinteger,
|
|
|
|
/* Like var_uinteger but signed. *VAR is an int. The user can
|
|
type 0 to mean "unlimited", which is stored in *VAR as
|
|
INT_MAX. The only remaining use of it is the Python API.
|
|
Don't use it elsewhere. */
|
|
var_integer,
|
|
|
|
/* 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 malloc'd string, or NULL if the string is empty. */
|
|
var_string,
|
|
/* String which stores what the user types verbatim.
|
|
*VAR is a malloc'd string, or NULL if the string is empty. */
|
|
var_string_noescape,
|
|
/* String which stores a filename. (*VAR) is a malloc'd string,
|
|
or "" if the string was empty. */
|
|
var_optional_filename,
|
|
/* String which stores a filename. (*VAR) is a malloc'd
|
|
string. */
|
|
var_filename,
|
|
/* ZeroableInteger. *VAR is an int. Like var_integer except
|
|
that zero really means zero. */
|
|
var_zinteger,
|
|
/* ZeroableUnsignedInteger. *VAR is an unsigned int. Zero really
|
|
means zero. */
|
|
var_zuinteger,
|
|
/* ZeroableUnsignedInteger with unlimited value. *VAR is an int,
|
|
but its range is [0, INT_MAX]. -1 stands for unlimited and
|
|
other negative numbers are not allowed. */
|
|
var_zuinteger_unlimited,
|
|
/* 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
|
|
}
|
|
var_types;
|
|
|
|
/* This structure records one command'd definition. */
|
|
struct cmd_list_element;
|
|
|
|
/* Forward-declarations of the entry-points of cli/cli-decode.c. */
|
|
|
|
/* API to the manipulation of command lists. */
|
|
|
|
extern int valid_user_defined_cmd_name_p (const char *name);
|
|
|
|
extern struct cmd_list_element *add_cmd (const char *, enum command_class,
|
|
void (*fun) (char *, int), char *,
|
|
struct cmd_list_element **);
|
|
|
|
extern struct cmd_list_element *add_alias_cmd (const char *, const char *,
|
|
enum command_class, int,
|
|
struct cmd_list_element **);
|
|
|
|
extern struct cmd_list_element *add_prefix_cmd (const char *, enum command_class,
|
|
void (*fun) (char *, int),
|
|
char *,
|
|
struct cmd_list_element **,
|
|
char *, int,
|
|
struct cmd_list_element **);
|
|
|
|
extern struct cmd_list_element *add_abbrev_prefix_cmd (const char *,
|
|
enum command_class,
|
|
void (*fun) (char *,
|
|
int),
|
|
char *,
|
|
struct cmd_list_element
|
|
**, char *, int,
|
|
struct cmd_list_element
|
|
**);
|
|
|
|
/* Set the commands corresponding callback. */
|
|
|
|
typedef void cmd_cfunc_ftype (char *args, int from_tty);
|
|
extern void set_cmd_cfunc (struct cmd_list_element *cmd,
|
|
cmd_cfunc_ftype *cfunc);
|
|
|
|
typedef void cmd_sfunc_ftype (char *args, int from_tty,
|
|
struct cmd_list_element *c);
|
|
extern void set_cmd_sfunc (struct cmd_list_element *cmd,
|
|
cmd_sfunc_ftype *sfunc);
|
|
|
|
typedef VEC (char_ptr) *completer_ftype (struct cmd_list_element *,
|
|
const char *, const char *);
|
|
|
|
extern void set_cmd_completer (struct cmd_list_element *, completer_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_cfunc_eq (struct cmd_list_element *cmd,
|
|
void (*cfunc) (char *args, int from_tty));
|
|
|
|
/* Each command object has a local context attached to it. */
|
|
extern void set_cmd_context (struct cmd_list_element *cmd,
|
|
void *context);
|
|
extern void *get_cmd_context (struct cmd_list_element *cmd);
|
|
|
|
|
|
/* 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);
|
|
|
|
/* Return the type of the command. */
|
|
extern enum cmd_types cmd_type (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 *, char *,
|
|
int, int);
|
|
|
|
extern struct cmd_list_element *lookup_cmd_1 (const char **,
|
|
struct cmd_list_element *,
|
|
struct cmd_list_element **,
|
|
int);
|
|
|
|
extern struct cmd_list_element *deprecate_cmd (struct cmd_list_element *,
|
|
char * );
|
|
|
|
extern void deprecated_cmd_warning (const char *);
|
|
|
|
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,
|
|
void (*fun) (char *, int),
|
|
char *);
|
|
|
|
extern struct cmd_list_element *add_com_alias (const char *, const char *,
|
|
enum command_class, int);
|
|
|
|
extern struct cmd_list_element *add_info (const char *,
|
|
void (*fun) (char *, int),
|
|
char *);
|
|
|
|
extern struct cmd_list_element *add_info_alias (const char *, char *, int);
|
|
|
|
extern VEC (char_ptr) *complete_on_cmdlist (struct cmd_list_element *,
|
|
const char *, const char *, int);
|
|
|
|
extern VEC (char_ptr) *complete_on_enum (const char *const *enumlist,
|
|
const char *, const char *);
|
|
|
|
/* Functions that implement commands about CLI commands. */
|
|
|
|
extern void help_list (struct cmd_list_element *, char *,
|
|
enum command_class, struct ui_file *);
|
|
|
|
/* Method for show a set/show variable's VALUE on FILE. If this
|
|
method isn't supplied deprecated_show_value_hack() is called (which
|
|
is not good). */
|
|
typedef void (show_value_ftype) (struct ui_file *file,
|
|
int from_tty,
|
|
struct cmd_list_element *cmd,
|
|
const char *value);
|
|
/* NOTE: i18n: This function is not i18n friendly. Callers should
|
|
instead print the value out directly. */
|
|
extern show_value_ftype deprecated_show_value_hack;
|
|
|
|
extern void add_setshow_enum_cmd (const char *name,
|
|
enum command_class class,
|
|
const char *const *enumlist,
|
|
const char **var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_auto_boolean_cmd (const char *name,
|
|
enum command_class class,
|
|
enum auto_boolean *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_boolean_cmd (const char *name,
|
|
enum command_class class,
|
|
int *var,
|
|
const char *set_doc, const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_filename_cmd (const char *name,
|
|
enum command_class class,
|
|
char **var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_string_cmd (const char *name,
|
|
enum command_class class,
|
|
char **var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern struct cmd_list_element *add_setshow_string_noescape_cmd
|
|
(const char *name,
|
|
enum command_class class,
|
|
char **var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_optional_filename_cmd (const char *name,
|
|
enum command_class class,
|
|
char **var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_integer_cmd (const char *name,
|
|
enum command_class class,
|
|
int *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_uinteger_cmd (const char *name,
|
|
enum command_class class,
|
|
unsigned int *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_zinteger_cmd (const char *name,
|
|
enum command_class class,
|
|
int *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void add_setshow_zuinteger_cmd (const char *name,
|
|
enum command_class class,
|
|
unsigned int *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct cmd_list_element **show_list);
|
|
|
|
extern void
|
|
add_setshow_zuinteger_unlimited_cmd (const char *name,
|
|
enum command_class class,
|
|
int *var,
|
|
const char *set_doc,
|
|
const char *show_doc,
|
|
const char *help_doc,
|
|
cmd_sfunc_ftype *set_func,
|
|
show_value_ftype *show_func,
|
|
struct cmd_list_element **set_list,
|
|
struct 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, char *);
|
|
|
|
/* Used everywhere whenever at least one parameter is required and
|
|
none is specified. */
|
|
|
|
extern void error_no_arg (char *) ATTRIBUTE_NORETURN;
|
|
|
|
extern void dont_repeat (void);
|
|
|
|
extern struct cleanup *prevent_dont_repeat (void);
|
|
|
|
/* 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 (char *, int);
|
|
|
|
/* Check function pointer. */
|
|
extern int cmd_func_p (struct cmd_list_element *cmd);
|
|
|
|
/* Call the command function. */
|
|
extern void cmd_func (struct cmd_list_element *cmd,
|
|
char *args, int from_tty);
|
|
|
|
#endif /* !defined (COMMAND_H) */
|