0743fc83c0
Currently there are many prefix commands that do nothing but call either help_list or cmd_show_list. I happened to notice that one such call, for "set print type", used the wrong command list parameter, causing incorrect output. Rather than fix this bug in isolation, I decided to eliminate this possibility by adding two new ways to add prefix commands, which simply route the call to help_list or cmd_show_list, as appropriate. This makes it impossible for a mismatch to occur. In some cases, a bit of output was removed; however, I don't think this output in general was very useful. It seemed redundant with what's already printed by help_list. A representative example is this hunk, removed from ada-lang.c: - printf_unfiltered (_(\ -"\"set ada\" must be followed by the name of a setting.\n")); This simplified the CLI style set/show commands quite a bit, and allowed the deletion of a macro. This also cleans up some unusual code in windows-tdep.c. Tested on x86-64 Fedora 30. Note that I have no way to build the go32-nat.c change. gdb/ChangeLog 2020-04-17 Tom Tromey <tromey@adacore.com> * auto-load.c (show_auto_load_cmd): Remove. (auto_load_show_cmdlist_get): Use add_show_prefix_cmd. * arc-tdep.c (_initialize_arc_tdep): Use add_show_prefix_cmd. (maintenance_print_arc_command): Remove. * tui/tui-win.c (tui_command): Remove. (tui_get_cmd_list): Use add_basic_prefix_cmd. * tui/tui-layout.c (tui_layout_command): Remove. (_initialize_tui_layout): Use add_basic_prefix_cmd. * python/python.c (user_set_python, user_show_python): Remove. (_initialize_python): Use add_basic_prefix_cmd, add_show_prefix_cmd. * guile/guile.c (set_guile_command, show_guile_command): Remove. (install_gdb_commands): Use add_basic_prefix_cmd, add_show_prefix_cmd. (info_guile_command): Remove. * dwarf2/read.c (set_dwarf_cmd, show_dwarf_cmd): Remove. (_initialize_dwarf2_read): Use add_basic_prefix_cmd, add_show_prefix_cmd. * cli/cli-style.h (class cli_style_option) <add_setshow_commands>: Remove do_set and do_show parameters. * cli/cli-style.c (set_style, show_style): Remove. (_initialize_cli_style): Use add_basic_prefix_cmd, add_show_prefix_cmd. (cli_style_option::add_setshow_commands): Remove do_set and do_show parameters. (cli_style_option::add_setshow_commands): Use add_basic_prefix_cmd, add_show_prefix_cmd. (STYLE_ADD_SETSHOW_COMMANDS): Remove macro. (set_style_name): Remove. * cli/cli-dump.c (dump_command, append_command): Remove. (srec_dump_command, ihex_dump_command, verilog_dump_command) (tekhex_dump_command, binary_dump_command) (binary_append_command): Remove. (_initialize_cli_dump): Use add_basic_prefix_cmd. * windows-tdep.c (w32_prefix_command_valid): Remove global. (init_w32_command_list): Remove; move into ... (_initialize_windows_tdep): ... here. Use add_basic_prefix_cmd. * valprint.c (set_print, show_print, set_print_raw) (show_print_raw): Remove. (_initialize_valprint): Use add_basic_prefix_cmd, add_show_prefix_cmd. * typeprint.c (set_print_type, show_print_type): Remove. (_initialize_typeprint): Use add_basic_prefix_cmd, add_show_prefix_cmd. * record.c (set_record_command, show_record_command): Remove. (_initialize_record): Use add_basic_prefix_cmd, add_show_prefix_cmd. * cli/cli-cmds.c (_initialize_cli_cmds): Use add_basic_prefix_cmd, add_show_prefix_cmd. (info_command, show_command, set_debug, show_debug): Remove. * top.h (set_history, show_history): Don't declare. * top.c (set_history, show_history): Remove. * target-descriptions.c (set_tdesc_cmd, show_tdesc_cmd) (unset_tdesc_cmd): Remove. (_initialize_target_descriptions): Use add_basic_prefix_cmd, add_show_prefix_cmd. * symtab.c (info_module_command): Remove. (_initialize_symtab): Use add_basic_prefix_cmd. * symfile.c (overlay_command): Remove. (_initialize_symfile): Use add_basic_prefix_cmd. * sparc64-tdep.c (info_adi_command): Remove. (_initialize_sparc64_adi_tdep): Use add_basic_prefix_cmd. * sh-tdep.c (show_sh_command, set_sh_command): Remove. (_initialize_sh_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * serial.c (serial_set_cmd, serial_show_cmd): Remove. (_initialize_serial): Use add_basic_prefix_cmd, add_show_prefix_cmd. * ser-tcp.c (set_tcp_cmd, show_tcp_cmd): Remove. (_initialize_ser_tcp): Use add_basic_prefix_cmd, add_show_prefix_cmd. * rs6000-tdep.c (set_powerpc_command, show_powerpc_command) (_initialize_rs6000_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * riscv-tdep.c (show_riscv_command, set_riscv_command) (show_debug_riscv_command, set_debug_riscv_command): Remove. (_initialize_riscv_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * remote.c (remote_command, set_remote_cmd): Remove. (_initialize_remote): Use add_basic_prefix_cmd. * record-full.c (set_record_full_command) (show_record_full_command): Remove. (_initialize_record_full): Use add_basic_prefix_cmd, add_show_prefix_cmd. * record-btrace.c (cmd_set_record_btrace) (cmd_show_record_btrace, cmd_set_record_btrace_bts) (cmd_show_record_btrace_bts, cmd_set_record_btrace_pt) (cmd_show_record_btrace_pt): Remove. (_initialize_record_btrace): Use add_basic_prefix_cmd, add_show_prefix_cmd. * ravenscar-thread.c (set_ravenscar_command) (show_ravenscar_command): Remove. (_initialize_ravenscar): Use add_basic_prefix_cmd, add_show_prefix_cmd. * mips-tdep.c (show_mips_command, set_mips_command) (_initialize_mips_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * maint.c (maintenance_command, maintenance_info_command) (maintenance_check_command, maintenance_print_command) (maintenance_set_cmd, maintenance_show_cmd): Remove. (_initialize_maint_cmds): Use add_basic_prefix_cmd, add_show_prefix_cmd. (show_per_command_cmd): Remove. * maint-test-settings.c (maintenance_set_test_settings_cmd): Remove. (maintenance_show_test_settings_cmd): Remove. (_initialize_maint_test_settings): Use add_basic_prefix_cmd, add_show_prefix_cmd. * maint-test-options.c (maintenance_test_options_command): Remove. (_initialize_maint_test_options): Use add_basic_prefix_cmd. * macrocmd.c (macro_command): Remove (_initialize_macrocmd): Use add_basic_prefix_cmd. * language.c (set_check, show_check): Remove. (_initialize_language): Use add_basic_prefix_cmd, add_show_prefix_cmd. * infcmd.c (unset_command): Remove. (_initialize_infcmd): Use add_basic_prefix_cmd. * i386-tdep.c (set_mpx_cmd, show_mpx_cmd): Remove. (_initialize_i386_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * go32-nat.c (go32_info_dos_command): Remove. (_initialize_go32_nat): Use add_basic_prefix_cmd. * cli/cli-decode.c (do_prefix_cmd, add_basic_prefix_cmd) (do_show_prefix_cmd, add_show_prefix_cmd): New functions. * frame.c (set_backtrace_cmd, show_backtrace_cmd): Remove. (_initialize_frame): Use add_basic_prefix_cmd, add_show_prefix_cmd. * dcache.c (set_dcache_command, show_dcache_command): Remove. (_initialize_dcache): Use add_basic_prefix_cmd, add_show_prefix_cmd. * cp-support.c (maint_cplus_command): Remove. (_initialize_cp_support): Use add_basic_prefix_cmd. * btrace.c (maint_btrace_cmd, maint_btrace_set_cmd) (maint_btrace_show_cmd, maint_btrace_pt_set_cmd) (maint_btrace_pt_show_cmd, _initialize_btrace): Use add_basic_prefix_cmd, add_show_prefix_cmd. * breakpoint.c (save_command): Remove. (_initialize_breakpoint): Use add_basic_prefix_cmd. * arm-tdep.c (set_arm_command, show_arm_command): Remove. (_initialize_arm_tdep): Use add_basic_prefix_cmd, add_show_prefix_cmd. * ada-lang.c (maint_set_ada_cmd, maint_show_ada_cmd) (set_ada_command, show_ada_command): Remove. (_initialize_ada_language): Use add_basic_prefix_cmd, add_show_prefix_cmd. * command.h (add_basic_prefix_cmd, add_show_prefix_cmd): Declare. gdb/testsuite/ChangeLog 2020-04-17 Tom Tromey <tromey@adacore.com> * gdb.cp/maint.exp (test_help): Simplify multiple_help_body. Update tests. * gdb.btrace/cpu.exp: Update tests. * gdb.base/maint.exp: Update tests. * gdb.base/default.exp: Update tests. * gdb.base/completion.exp: Update tests.
491 lines
15 KiB
C
491 lines
15 KiB
C
/* Maintenance commands for testing the options framework.
|
||
|
||
Copyright (C) 2019-2020 Free Software Foundation, Inc.
|
||
|
||
This file is part of GDB.
|
||
|
||
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/>. */
|
||
|
||
#include "defs.h"
|
||
#include "gdbcmd.h"
|
||
#include "cli/cli-option.h"
|
||
|
||
/* This file defines three "maintenance test-options" subcommands to
|
||
exercise TAB-completion and option processing:
|
||
|
||
(gdb) maint test-options require-delimiter
|
||
(gdb) maint test-options unknown-is-error
|
||
(gdb) maint test-options unknown-is-operand
|
||
|
||
And a fourth one to help with TAB-completion testing.
|
||
|
||
(gdb) maint show test-options-completion-result
|
||
|
||
Each of the test-options subcommands exercise
|
||
gdb::option::process_options with a different enum
|
||
process_options_mode value. Examples for commands they model:
|
||
|
||
- "print" and "compile print", are like "require-delimiter",
|
||
because they accept random expressions as argument.
|
||
|
||
- "backtrace" and "frame/thread apply" are like
|
||
"unknown-is-operand", because "-" is a valid command.
|
||
|
||
- "compile file" and "compile code" are like "unknown-is-error".
|
||
|
||
These commands allow exercising all aspects of option processing
|
||
without having to pick some existing command. That should be more
|
||
stable going forward than relying on an existing user command,
|
||
since if we picked say "print", that command or its options could
|
||
change in future, and then we'd be left with having to pick some
|
||
other command or option to exercise some non-command-specific
|
||
option processing detail. Also, actual user commands have side
|
||
effects that we're not interested in when we're focusing on unit
|
||
testing the options machinery. BTW, a maintenance command is used
|
||
as a sort of unit test driver instead of actual "maint selftest"
|
||
unit tests, since we need to go all the way via gdb including
|
||
readline, for proper testing of TAB completion.
|
||
|
||
These maintenance commands support options of all the different
|
||
available kinds of commands (boolean, enum, flag, string, uinteger):
|
||
|
||
(gdb) maint test-options require-delimiter -[TAB]
|
||
-bool -enum -flag -string -uinteger -xx1 -xx2
|
||
|
||
(gdb) maint test-options require-delimiter -bool o[TAB]
|
||
off on
|
||
(gdb) maint test-options require-delimiter -enum [TAB]
|
||
xxx yyy zzz
|
||
(gdb) maint test-options require-delimiter -uinteger [TAB]
|
||
NUMBER unlimited
|
||
|
||
'-xx1' and '-xx2' are flag options too. They exist in order to
|
||
test ambiguous option names, like '-xx'.
|
||
|
||
Invoking the commands makes them print out the options parsed:
|
||
|
||
(gdb) maint test-options unknown-is-error -flag -enum yyy cmdarg
|
||
-flag 1 -xx1 0 -xx2 0 -bool 0 -enum yyy -uint 0 -zuint-unl 0 -- cmdarg
|
||
|
||
(gdb) maint test-options require-delimiter -flag -enum yyy cmdarg
|
||
-flag 0 -xx1 0 -xx2 0 -bool 0 -enum xxx -uint 0 -zuint-unl 0 -- -flag -enum yyy cmdarg
|
||
(gdb) maint test-options require-delimiter -flag -enum yyy cmdarg --
|
||
Unrecognized option at: cmdarg --
|
||
(gdb) maint test-options require-delimiter -flag -enum yyy -- cmdarg
|
||
-flag 1 -xx1 0 -xx2 0 -bool 0 -enum yyy -uint 0 -zuint-unl 0 -- cmdarg
|
||
|
||
The "maint show test-options-completion-result" command exists in
|
||
order to do something similar for completion:
|
||
|
||
(gdb) maint test-options unknown-is-error -flag -b 0 -enum yyy OPERAND[TAB]
|
||
(gdb) maint show test-options-completion-result
|
||
0 OPERAND
|
||
|
||
(gdb) maint test-options unknown-is-error -flag -b 0 -enum yyy[TAB]
|
||
(gdb) maint show test-options-completion-result
|
||
1
|
||
|
||
(gdb) maint test-options require-dash -unknown[TAB]
|
||
(gdb) maint show test-options-completion-result
|
||
1
|
||
|
||
Here, "1" means the completion function processed the whole input
|
||
line, and that the command shouldn't do anything with the arguments,
|
||
since there are no operands. While "0" indicates that there are
|
||
operands after options. The text after "0" is the operands.
|
||
|
||
This level of detail is particularly important because getting the
|
||
completion function's entry point to return back to the caller the
|
||
right pointer into the operand is quite tricky in several
|
||
scenarios. */
|
||
|
||
/* Enum values for the "maintenance test-options" commands. */
|
||
const char test_options_enum_values_xxx[] = "xxx";
|
||
const char test_options_enum_values_yyy[] = "yyy";
|
||
const char test_options_enum_values_zzz[] = "zzz";
|
||
static const char *const test_options_enum_values_choices[] =
|
||
{
|
||
test_options_enum_values_xxx,
|
||
test_options_enum_values_yyy,
|
||
test_options_enum_values_zzz,
|
||
NULL
|
||
};
|
||
|
||
/* Option data for the "maintenance test-options" commands. */
|
||
|
||
struct test_options_opts
|
||
{
|
||
bool flag_opt = false;
|
||
bool xx1_opt = false;
|
||
bool xx2_opt = false;
|
||
bool boolean_opt = false;
|
||
const char *enum_opt = test_options_enum_values_xxx;
|
||
unsigned int uint_opt = 0;
|
||
int zuint_unl_opt = 0;
|
||
char *string_opt = nullptr;
|
||
|
||
test_options_opts () = default;
|
||
|
||
DISABLE_COPY_AND_ASSIGN (test_options_opts);
|
||
|
||
~test_options_opts ()
|
||
{
|
||
xfree (string_opt);
|
||
}
|
||
|
||
/* Dump the options to FILE. ARGS is the remainder unprocessed
|
||
arguments. */
|
||
void dump (ui_file *file, const char *args) const
|
||
{
|
||
fprintf_unfiltered (file,
|
||
_("-flag %d -xx1 %d -xx2 %d -bool %d "
|
||
"-enum %s -uint %s -zuint-unl %s -string '%s' -- %s\n"),
|
||
flag_opt,
|
||
xx1_opt,
|
||
xx2_opt,
|
||
boolean_opt,
|
||
enum_opt,
|
||
(uint_opt == UINT_MAX
|
||
? "unlimited"
|
||
: pulongest (uint_opt)),
|
||
(zuint_unl_opt == -1
|
||
? "unlimited"
|
||
: plongest (zuint_unl_opt)),
|
||
(string_opt != nullptr
|
||
? string_opt
|
||
: ""),
|
||
args);
|
||
}
|
||
};
|
||
|
||
/* Option definitions for the "maintenance test-options" commands. */
|
||
|
||
static const gdb::option::option_def test_options_option_defs[] = {
|
||
|
||
/* A flag option. */
|
||
gdb::option::flag_option_def<test_options_opts> {
|
||
"flag",
|
||
[] (test_options_opts *opts) { return &opts->flag_opt; },
|
||
N_("A flag option."),
|
||
},
|
||
|
||
/* A couple flags with similar names, for "ambiguous option names"
|
||
testing. */
|
||
gdb::option::flag_option_def<test_options_opts> {
|
||
"xx1",
|
||
[] (test_options_opts *opts) { return &opts->xx1_opt; },
|
||
N_("A flag option."),
|
||
},
|
||
gdb::option::flag_option_def<test_options_opts> {
|
||
"xx2",
|
||
[] (test_options_opts *opts) { return &opts->xx2_opt; },
|
||
N_("A flag option."),
|
||
},
|
||
|
||
/* A boolean option. */
|
||
gdb::option::boolean_option_def<test_options_opts> {
|
||
"bool",
|
||
[] (test_options_opts *opts) { return &opts->boolean_opt; },
|
||
nullptr, /* show_cmd_cb */
|
||
N_("A boolean option."),
|
||
},
|
||
|
||
/* An enum option. */
|
||
gdb::option::enum_option_def<test_options_opts> {
|
||
"enum",
|
||
test_options_enum_values_choices,
|
||
[] (test_options_opts *opts) { return &opts->enum_opt; },
|
||
nullptr, /* show_cmd_cb */
|
||
N_("An enum option."),
|
||
},
|
||
|
||
/* A uinteger option. */
|
||
gdb::option::uinteger_option_def<test_options_opts> {
|
||
"uinteger",
|
||
[] (test_options_opts *opts) { return &opts->uint_opt; },
|
||
nullptr, /* show_cmd_cb */
|
||
N_("A uinteger option."),
|
||
nullptr, /* show_doc */
|
||
N_("A help doc that spawns\nmultiple lines."),
|
||
},
|
||
|
||
/* A zuinteger_unlimited option. */
|
||
gdb::option::zuinteger_unlimited_option_def<test_options_opts> {
|
||
"zuinteger-unlimited",
|
||
[] (test_options_opts *opts) { return &opts->zuint_unl_opt; },
|
||
nullptr, /* show_cmd_cb */
|
||
N_("A zuinteger-unlimited option."),
|
||
nullptr, /* show_doc */
|
||
nullptr, /* help_doc */
|
||
},
|
||
|
||
/* A string option. */
|
||
gdb::option::string_option_def<test_options_opts> {
|
||
"string",
|
||
[] (test_options_opts *opts) { return &opts->string_opt; },
|
||
nullptr, /* show_cmd_cb */
|
||
N_("A string option."),
|
||
},
|
||
};
|
||
|
||
/* Create an option_def_group for the test_options_opts options, with
|
||
OPTS as context. */
|
||
|
||
static inline gdb::option::option_def_group
|
||
make_test_options_options_def_group (test_options_opts *opts)
|
||
{
|
||
return {{test_options_option_defs}, opts};
|
||
}
|
||
|
||
/* Implementation of the "maintenance test-options
|
||
require-delimiter/unknown-is-error/unknown-is-operand" commands.
|
||
Each of the commands maps to a different enum process_options_mode
|
||
enumerator. The test strategy is simply processing the options in
|
||
a number of scenarios, and printing back the parsed result. */
|
||
|
||
static void
|
||
maintenance_test_options_command_mode (const char *args,
|
||
gdb::option::process_options_mode mode)
|
||
{
|
||
test_options_opts opts;
|
||
|
||
gdb::option::process_options (&args, mode,
|
||
make_test_options_options_def_group (&opts));
|
||
|
||
if (args == nullptr)
|
||
args = "";
|
||
else
|
||
args = skip_spaces (args);
|
||
|
||
opts.dump (gdb_stdout, args);
|
||
}
|
||
|
||
/* Variable used by the "maintenance show
|
||
test-options-completion-result" command. This variable is stored
|
||
by the completer of the "maint test-options" subcommands.
|
||
|
||
If the completer returned false, this includes the text at the word
|
||
point after gdb::option::complete_options returns. If true, then
|
||
this includes a dump of the processed options. */
|
||
static std::string maintenance_test_options_command_completion_text;
|
||
|
||
/* The "maintenance show test-options-completion-result" command. */
|
||
|
||
static void
|
||
maintenance_show_test_options_completion_result (const char *args,
|
||
int from_tty)
|
||
{
|
||
puts_filtered (maintenance_test_options_command_completion_text.c_str ());
|
||
}
|
||
|
||
/* Save the completion result in the global variables read by the
|
||
"maintenance test-options require-delimiter" command. */
|
||
|
||
static void
|
||
save_completion_result (const test_options_opts &opts, bool res,
|
||
const char *text)
|
||
{
|
||
if (res)
|
||
{
|
||
string_file stream;
|
||
|
||
stream.puts ("1 ");
|
||
opts.dump (&stream, text);
|
||
maintenance_test_options_command_completion_text
|
||
= std::move (stream.string ());
|
||
}
|
||
else
|
||
{
|
||
maintenance_test_options_command_completion_text
|
||
= string_printf ("0 %s\n", text);
|
||
}
|
||
}
|
||
|
||
/* Implementation of completer for the "maintenance test-options
|
||
require-delimiter/unknown-is-error/unknown-is-operand" commands.
|
||
Each of the commands maps to a different enum process_options_mode
|
||
enumerator. */
|
||
|
||
static void
|
||
maintenance_test_options_completer_mode (completion_tracker &tracker,
|
||
const char *text,
|
||
gdb::option::process_options_mode mode)
|
||
{
|
||
test_options_opts opts;
|
||
|
||
try
|
||
{
|
||
bool res = (gdb::option::complete_options
|
||
(tracker, &text, mode,
|
||
make_test_options_options_def_group (&opts)));
|
||
|
||
save_completion_result (opts, res, text);
|
||
}
|
||
catch (const gdb_exception_error &ex)
|
||
{
|
||
save_completion_result (opts, true, text);
|
||
throw;
|
||
}
|
||
}
|
||
|
||
/* Implementation of the "maintenance test-options require-delimiter"
|
||
command. */
|
||
|
||
static void
|
||
maintenance_test_options_require_delimiter_command (const char *args,
|
||
int from_tty)
|
||
{
|
||
maintenance_test_options_command_mode
|
||
(args, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER);
|
||
}
|
||
|
||
/* Implementation of the "maintenance test-options
|
||
unknown-is-error" command. */
|
||
|
||
static void
|
||
maintenance_test_options_unknown_is_error_command (const char *args,
|
||
int from_tty)
|
||
{
|
||
maintenance_test_options_command_mode
|
||
(args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR);
|
||
}
|
||
|
||
/* Implementation of the "maintenance test-options
|
||
unknown-is-operand" command. */
|
||
|
||
static void
|
||
maintenance_test_options_unknown_is_operand_command (const char *args,
|
||
int from_tty)
|
||
{
|
||
maintenance_test_options_command_mode
|
||
(args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND);
|
||
}
|
||
|
||
/* Completer for the "maintenance test-options require-delimiter"
|
||
command. */
|
||
|
||
static void
|
||
maintenance_test_options_require_delimiter_command_completer
|
||
(cmd_list_element *ignore, completion_tracker &tracker,
|
||
const char *text, const char *word)
|
||
{
|
||
maintenance_test_options_completer_mode
|
||
(tracker, text, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER);
|
||
}
|
||
|
||
/* Completer for the "maintenance test-options unknown-is-error"
|
||
command. */
|
||
|
||
static void
|
||
maintenance_test_options_unknown_is_error_command_completer
|
||
(cmd_list_element *ignore, completion_tracker &tracker,
|
||
const char *text, const char *word)
|
||
{
|
||
maintenance_test_options_completer_mode
|
||
(tracker, text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR);
|
||
}
|
||
|
||
/* Completer for the "maintenance test-options unknown-is-operand"
|
||
command. */
|
||
|
||
static void
|
||
maintenance_test_options_unknown_is_operand_command_completer
|
||
(cmd_list_element *ignore, completion_tracker &tracker,
|
||
const char *text, const char *word)
|
||
{
|
||
maintenance_test_options_completer_mode
|
||
(tracker, text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND);
|
||
}
|
||
|
||
/* Command list for maint test-options. */
|
||
struct cmd_list_element *maintenance_test_options_list;
|
||
|
||
|
||
void _initialize_maint_test_options ();
|
||
void
|
||
_initialize_maint_test_options ()
|
||
{
|
||
cmd_list_element *cmd;
|
||
|
||
add_basic_prefix_cmd ("test-options", no_class,
|
||
_("\
|
||
Generic command for testing the options infrastructure."),
|
||
&maintenance_test_options_list,
|
||
"maintenance test-options ", 0,
|
||
&maintenancelist);
|
||
|
||
const auto def_group = make_test_options_options_def_group (nullptr);
|
||
|
||
static const std::string help_require_delim_str
|
||
= gdb::option::build_help (_("\
|
||
Command used for testing options processing.\n\
|
||
Usage: maint test-options require-delimiter [[OPTION]... --] [OPERAND]...\n\
|
||
\n\
|
||
Options:\n\
|
||
%OPTIONS%\n\
|
||
\n\
|
||
If you specify any command option, you must use a double dash (\"--\")\n\
|
||
to mark the end of option processing."),
|
||
def_group);
|
||
|
||
static const std::string help_unknown_is_error_str
|
||
= gdb::option::build_help (_("\
|
||
Command used for testing options processing.\n\
|
||
Usage: maint test-options unknown-is-error [OPTION]... [OPERAND]...\n\
|
||
\n\
|
||
Options:\n\
|
||
%OPTIONS%"),
|
||
def_group);
|
||
|
||
static const std::string help_unknown_is_operand_str
|
||
= gdb::option::build_help (_("\
|
||
Command used for testing options processing.\n\
|
||
Usage: maint test-options unknown-is-operand [OPTION]... [OPERAND]...\n\
|
||
\n\
|
||
Options:\n\
|
||
%OPTIONS%"),
|
||
def_group);
|
||
|
||
cmd = add_cmd ("require-delimiter", class_maintenance,
|
||
maintenance_test_options_require_delimiter_command,
|
||
help_require_delim_str.c_str (),
|
||
&maintenance_test_options_list);
|
||
set_cmd_completer_handle_brkchars
|
||
(cmd, maintenance_test_options_require_delimiter_command_completer);
|
||
|
||
cmd = add_cmd ("unknown-is-error", class_maintenance,
|
||
maintenance_test_options_unknown_is_error_command,
|
||
help_unknown_is_error_str.c_str (),
|
||
&maintenance_test_options_list);
|
||
set_cmd_completer_handle_brkchars
|
||
(cmd, maintenance_test_options_unknown_is_error_command_completer);
|
||
|
||
cmd = add_cmd ("unknown-is-operand", class_maintenance,
|
||
maintenance_test_options_unknown_is_operand_command,
|
||
help_unknown_is_operand_str.c_str (),
|
||
&maintenance_test_options_list);
|
||
set_cmd_completer_handle_brkchars
|
||
(cmd, maintenance_test_options_unknown_is_operand_command_completer);
|
||
|
||
add_cmd ("test-options-completion-result", class_maintenance,
|
||
maintenance_show_test_options_completion_result,
|
||
_("\
|
||
Show maintenance test-options completion result.\n\
|
||
Shows the results of completing\n\
|
||
\"maint test-options require-delimiter\",\n\
|
||
\"maint test-options unknown-is-error\", or\n\
|
||
\"maint test-options unknown-is-operand\"."),
|
||
&maintenance_show_cmdlist);
|
||
}
|