8bf12c4f75
This adds a special meaning for 'help' and '?' as options to the keyval parser. Instead of being an error (because of a missing value) or a value for an implied key, they now request help, which is a new boolean output of the parser in addition to the QDict. A new parameter 'p_help' is added to keyval_parse() that contains on return whether help was requested. If NULL is passed, requesting help results in an error and all other cases work like before. Turning previous error cases into help is a compatible extension. The behaviour potentially changes for implied keys: They could previously get 'help' as their value, which is now interpreted as requesting help. This is not a problem in practice because 'help' and '?' are not a valid values for the implied key of any option parsed with keyval_parse(): * audiodev: union Audiodev, implied key "driver" is enum AudiodevDriver, "help" and "?" are not among its values * display: union DisplayOptions, implied key "type" is enum DisplayType, "help" and "?" are not among its values * blockdev: union BlockdevOptions, implied key "driver is enum BlockdevDriver, "help" and "?" are not among its values * export: union BlockExport, implied key "type" is enum BlockExportType, "help" and "?" are not among its values * monitor: struct MonitorOptions, implied key "mode" is enum MonitorMode, "help" and "?" are not among its values * nbd-server: struct NbdServerOptions, no implied key. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20201011073505.1185335-5-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
34 lines
810 B
C
34 lines
810 B
C
#ifndef QEMU_HELP_OPTION_H
|
|
#define QEMU_HELP_OPTION_H
|
|
|
|
/**
|
|
* is_help_option:
|
|
* @s: string to test
|
|
*
|
|
* Check whether @s is one of the standard strings which indicate
|
|
* that the user is asking for a list of the valid values for a
|
|
* command option like -cpu or -M. The current accepted strings
|
|
* are 'help' and '?'. '?' is deprecated (it is a shell wildcard
|
|
* which makes it annoying to use in a reliable way) but provided
|
|
* for backwards compatibility.
|
|
*
|
|
* Returns: true if @s is a request for a list.
|
|
*/
|
|
static inline bool is_help_option(const char *s)
|
|
{
|
|
return !strcmp(s, "?") || !strcmp(s, "help");
|
|
}
|
|
|
|
static inline int starts_with_help_option(const char *s)
|
|
{
|
|
if (*s == '?') {
|
|
return 1;
|
|
}
|
|
if (g_str_has_prefix(s, "help")) {
|
|
return 4;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#endif
|