simplify lib/arg.c and allow purely long options
This commit is contained in:
parent
2980502850
commit
aa68ca1250
1 changed files with 27 additions and 46 deletions
|
@ -25,14 +25,11 @@
|
|||
#include <grub/i18n.h>
|
||||
|
||||
/* Built-in parser for default options. */
|
||||
#define SHORT_ARG_HELP -100
|
||||
#define SHORT_ARG_USAGE -101
|
||||
|
||||
static const struct grub_arg_option help_options[] =
|
||||
{
|
||||
{"help", SHORT_ARG_HELP, 0,
|
||||
{"help", 0, 0,
|
||||
N_("Display this help and exit."), 0, ARG_TYPE_NONE},
|
||||
{"usage", SHORT_ARG_USAGE, 0,
|
||||
{"usage", 0, 0,
|
||||
N_("Display the usage of this command and exit."), 0, ARG_TYPE_NONE},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
@ -125,9 +122,9 @@ grub_arg_show_help (grub_extcmd_t cmd)
|
|||
|
||||
if (opt->shortarg && grub_isgraph (opt->shortarg))
|
||||
grub_printf ("-%c%c ", opt->shortarg, opt->longarg ? ',':' ');
|
||||
else if (opt->shortarg == SHORT_ARG_HELP && ! h_is_used)
|
||||
else if (opt == help_options && ! h_is_used)
|
||||
grub_printf ("-h, ");
|
||||
else if (opt->shortarg == SHORT_ARG_USAGE && ! u_is_used)
|
||||
else if (opt == help_options + 1 && ! u_is_used)
|
||||
grub_printf ("-u, ");
|
||||
else
|
||||
grub_printf (" ");
|
||||
|
@ -180,50 +177,34 @@ grub_arg_show_help (grub_extcmd_t cmd)
|
|||
|
||||
|
||||
static int
|
||||
parse_option (grub_extcmd_t cmd, int key, char *arg, struct grub_arg_list *usr)
|
||||
parse_option (grub_extcmd_t cmd, const struct grub_arg_option *opt,
|
||||
char *arg, struct grub_arg_list *usr)
|
||||
{
|
||||
switch (key)
|
||||
if (opt == help_options)
|
||||
{
|
||||
case SHORT_ARG_HELP:
|
||||
grub_arg_show_help (cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
case SHORT_ARG_USAGE:
|
||||
if (opt == help_options + 1)
|
||||
{
|
||||
show_usage (cmd);
|
||||
return -1;
|
||||
|
||||
default:
|
||||
{
|
||||
int found = -1;
|
||||
int i = 0;
|
||||
const struct grub_arg_option *opt = cmd->options;
|
||||
|
||||
while (opt->doc)
|
||||
{
|
||||
if (opt->shortarg && key == opt->shortarg)
|
||||
{
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
opt++;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (found == -1)
|
||||
return -1;
|
||||
|
||||
if (opt->flags & GRUB_ARG_OPTION_REPEATABLE)
|
||||
{
|
||||
usr[found].args[usr[found].set++] = arg;
|
||||
usr[found].args[usr[found].set] = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
usr[found].set = 1;
|
||||
usr[found].arg = arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
int found = opt - cmd->options;
|
||||
|
||||
if (opt->flags & GRUB_ARG_OPTION_REPEATABLE)
|
||||
{
|
||||
usr[found].args[usr[found].set++] = arg;
|
||||
usr[found].args[usr[found].set] = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
usr[found].set = 1;
|
||||
usr[found].arg = arg;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -307,7 +288,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
|||
it can have an argument value. */
|
||||
if (*curshort)
|
||||
{
|
||||
if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
|
||||
if (parse_option (cmd, opt, 0, usr) || grub_errno)
|
||||
goto fail;
|
||||
}
|
||||
else
|
||||
|
@ -411,7 +392,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
|||
/* XXX: Not implemented. */
|
||||
break;
|
||||
}
|
||||
if (parse_option (cmd, opt->shortarg, option, usr) || grub_errno)
|
||||
if (parse_option (cmd, opt, option, usr) || grub_errno)
|
||||
goto fail;
|
||||
}
|
||||
else
|
||||
|
@ -424,7 +405,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
|
||||
if (parse_option (cmd, opt, 0, usr) || grub_errno)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue