diff options
| author | Michael Brown | 2013-07-18 17:11:39 +0200 |
|---|---|---|
| committer | Michael Brown | 2013-07-22 17:30:44 +0200 |
| commit | 1625a8c05fe72b7c53cff049c646e913d6dab362 (patch) | |
| tree | c937d5c72c1eb2b7a74c821165debc3bd5a50f25 /src | |
| parent | [parseopt] Move parse_settings() to parseopt.c (diff) | |
| download | ipxe-1625a8c05fe72b7c53cff049c646e913d6dab362.tar.gz ipxe-1625a8c05fe72b7c53cff049c646e913d6dab362.tar.xz ipxe-1625a8c05fe72b7c53cff049c646e913d6dab362.zip | |
[parseopt] Add parse_setting()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/parseopt.c | 55 | ||||
| -rw-r--r-- | src/include/ipxe/parseopt.h | 16 |
2 files changed, 70 insertions, 1 deletions
diff --git a/src/core/parseopt.c b/src/core/parseopt.c index 15cca0859..65ad4ec51 100644 --- a/src/core/parseopt.c +++ b/src/core/parseopt.c @@ -196,6 +196,61 @@ int parse_settings ( char *text, struct settings **value ) { } /** + * Parse setting name + * + * @v text Text + * @v setting Named setting to fill in + * @v get_child Function to find or create child settings block + * @ret rc Return status code + * + * Note that this function modifies the original @c text. + */ +int parse_setting ( char *text, struct named_setting *setting, + get_child_settings_t get_child ) { + int rc; + + /* Sanity check */ + assert ( text != NULL ); + + /* Parse setting name */ + if ( ( rc = parse_setting_name ( text, get_child, &setting->settings, + &setting->setting ) ) != 0 ) { + printf ( "\"%s\": invalid setting\n", text ); + return rc; + } + + return 0; +} + +/** + * Parse existing setting name + * + * @v text Text + * @v setting Named setting to fill in + * @ret rc Return status code + * + * Note that this function modifies the original @c text. + */ +int parse_existing_setting ( char *text, struct named_setting *setting ) { + + return parse_setting ( text, setting, find_child_settings ); +} + +/** + * Parse and autovivify setting name + * + * @v text Text + * @v setting Named setting to fill in + * @ret rc Return status code + * + * Note that this function modifies the original @c text. + */ +int parse_autovivified_setting ( char *text, struct named_setting *setting ) { + + return parse_setting ( text, setting, autovivify_child_settings ); +} + +/** * Print command usage message * * @v cmd Command descriptor diff --git a/src/include/ipxe/parseopt.h b/src/include/ipxe/parseopt.h index 8aeed974b..2e38d231f 100644 --- a/src/include/ipxe/parseopt.h +++ b/src/include/ipxe/parseopt.h @@ -11,10 +11,10 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <stdint.h> #include <stddef.h> +#include <ipxe/settings.h> struct net_device; struct menu; -struct settings; /** A command-line option descriptor */ struct option_descriptor { @@ -115,6 +115,14 @@ struct command_descriptor { .usage = _usage, \ } +/** A parsed named setting */ +struct named_setting { + /** Settings block */ + struct settings *settings; + /** Setting */ + struct setting setting; +}; + extern int parse_string ( char *text, char **value ); extern int parse_integer ( char *text, unsigned int *value ); extern int parse_netdev ( char *text, struct net_device **netdev ); @@ -122,6 +130,12 @@ extern int parse_menu ( char *text, struct menu **menu ); extern int parse_flag ( char *text __unused, int *flag ); extern int parse_key ( char *text, unsigned int *key ); extern int parse_settings ( char *text, struct settings **settings ); +extern int parse_setting ( char *text, struct named_setting *setting, + get_child_settings_t get_child ); +extern int parse_existing_setting ( char *text, struct named_setting *setting ); +extern int parse_autovivified_setting ( char *text, + struct named_setting *setting ); +extern void print_usage ( struct command_descriptor *cmd, char **argv ); extern int reparse_options ( int argc, char **argv, struct command_descriptor *cmd, void *opts ); extern int parse_options ( int argc, char **argv, |
