mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
Teach gdb::option about string options
A following patch will make the "pipe" command use the gdb::option framework for option processing. However, "pipe"'s only option today is a string option, "-d DELIM", and gdb::option does not support string options yet. This commit adds support for string options, mapped to var_string. For now, a string is parsed up until the first whitespace. I imagine that we'll need to add support for quoting so that we could do: (gdb) cmd -option 'some -string' without gdb confusing the "-string" for an option. This doesn't seem important for pipe, so I'm leaving it for another day. One thing I'm not happy with, is that the string data is managed as a raw malloc-allocated char *, which means that we need to xfree it manually. This is because var_string settings work that way too. Although with var_string settings we're leaking the strings at gdb exit, that was never really a problem. For options though, leaking is undesirable. I think we should tackle that for both settings and options at the same time, so for now I'm just managing the malloced data manually. It's a bit ugly in option_def_and_value, but at least that's hidden from view. For testing, this adds a new "-string" option to "maint test-settings", and then tweaks gdb.base/options.exp to exercise it. gdb/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * cli/cli-option.c (union option_value) <string>: New field. (struct option_def_and_value): Add ctor, move ctor, dtor and use DISABLE_COPY_AND_ASSIGN. (option_def_and_value::clear_value): New. (parse_option, save_option_value_in_ctx, get_val_type_str) (add_setshow_cmds_for_options): Handle var_string. * cli-option.h (union option_def::var_address) <string>: New field. (struct string_option_def): New. * maint-test-options.c (struct test_options_opts): Add default ctor and use DISABLE_COPY_AND_ASSIGN. <string_opt>: New field. (test_options_opts::~test_options_opts): New. (test_options_opts::dump): Also dump "-string". (test_options_option_defs): Install "string. gdb/testsuite/ChangeLog: 2019-07-03 Pedro Alves <palves@redhat.com> * gdb.base/options.exp (expect_none, expect_flag, expect_bool) (expect_integer): Adjust to expect "-string". (expect_string): New. (all_options): Expect "-string". (test-flag, test-boolean): Adjust to expect "-string". (test-string): New proc. (top level): Call it.
This commit is contained in:
@@ -86,6 +86,7 @@ public:
|
||||
unsigned int *(*uinteger) (const option_def &, void *ctx);
|
||||
int *(*integer) (const option_def &, void *ctx);
|
||||
const char **(*enumeration) (const option_def &, void *ctx);
|
||||
char **(*string) (const option_def &, void *ctx);
|
||||
}
|
||||
var_address;
|
||||
|
||||
@@ -261,6 +262,26 @@ struct enum_option_def : option_def
|
||||
}
|
||||
};
|
||||
|
||||
/* A var_string command line option. */
|
||||
|
||||
template<typename Context>
|
||||
struct string_option_def : option_def
|
||||
{
|
||||
string_option_def (const char *long_option_,
|
||||
char **(*get_var_address_cb_) (Context *),
|
||||
show_value_ftype *show_cmd_cb_,
|
||||
const char *set_doc_,
|
||||
const char *show_doc_ = nullptr,
|
||||
const char *help_doc_ = nullptr)
|
||||
: option_def (long_option_, var_string,
|
||||
(erased_get_var_address_ftype *) get_var_address_cb_,
|
||||
show_cmd_cb_,
|
||||
set_doc_, show_doc_, help_doc_)
|
||||
{
|
||||
var_address.enumeration = detail::get_var_address<const char *, Context>;
|
||||
}
|
||||
};
|
||||
|
||||
/* A group of options that all share the same context pointer to pass
|
||||
to the options' get-current-value callbacks. */
|
||||
struct option_def_group
|
||||
|
||||
Reference in New Issue
Block a user