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>
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
/* Built-in parser for default options. */
|
/* Built-in parser for default options. */
|
||||||
#define SHORT_ARG_HELP -100
|
|
||||||
#define SHORT_ARG_USAGE -101
|
|
||||||
|
|
||||||
static const struct grub_arg_option help_options[] =
|
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},
|
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},
|
N_("Display the usage of this command and exit."), 0, ARG_TYPE_NONE},
|
||||||
{0, 0, 0, 0, 0, 0}
|
{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))
|
if (opt->shortarg && grub_isgraph (opt->shortarg))
|
||||||
grub_printf ("-%c%c ", opt->shortarg, opt->longarg ? ',':' ');
|
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, ");
|
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, ");
|
grub_printf ("-u, ");
|
||||||
else
|
else
|
||||||
grub_printf (" ");
|
grub_printf (" ");
|
||||||
|
@ -180,50 +177,34 @@ grub_arg_show_help (grub_extcmd_t cmd)
|
||||||
|
|
||||||
|
|
||||||
static int
|
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);
|
grub_arg_show_help (cmd);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
case SHORT_ARG_USAGE:
|
if (opt == help_options + 1)
|
||||||
|
{
|
||||||
show_usage (cmd);
|
show_usage (cmd);
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +288,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
||||||
it can have an argument value. */
|
it can have an argument value. */
|
||||||
if (*curshort)
|
if (*curshort)
|
||||||
{
|
{
|
||||||
if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
|
if (parse_option (cmd, opt, 0, usr) || grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -411,7 +392,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
||||||
/* XXX: Not implemented. */
|
/* XXX: Not implemented. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (parse_option (cmd, opt->shortarg, option, usr) || grub_errno)
|
if (parse_option (cmd, opt, option, usr) || grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -424,7 +405,7 @@ grub_arg_parse (grub_extcmd_t cmd, int argc, char **argv,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
|
if (parse_option (cmd, opt, 0, usr) || grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue