simplify lib/arg.c and allow purely long options

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2011-12-23 21:13:09 +01:00
parent 2980502850
commit aa68ca1250

View file

@ -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;
} }
} }