+2009-07-07 Pavel Roskin <proski@gnu.org>
+
+ * lib/arg.c (find_long_option): Remove.
+ (find_long): Add `len' argument, make `s' const char *.
+ (grub_arg_parse): Parse long options in place, not in a
+ temporary buffer.
+
2009-07-06 Pavel Roskin <proski@gnu.org>
* commands/search.c (search_fs): Fix potential NULL pointer
return found;
}
-static char *
-find_long_option (char *s)
-{
- char *argpos = grub_strchr (s, '=');
-
- if (argpos)
- {
- *argpos = '\0';
- return ++argpos;
- }
- return 0;
-}
-
static struct grub_arg_option *
-find_long (const struct grub_arg_option *options, char *s)
+find_long (const struct grub_arg_option *options, const char *s, int len)
{
struct grub_arg_option *found = 0;
auto struct grub_arg_option *fnd_long (const struct grub_arg_option *opt);
{
while (opt->doc)
{
- if (opt->longarg && ! grub_strcmp (opt->longarg, s))
+ if (opt->longarg && ! grub_strncmp (opt->longarg, s, len) &&
+ opt->longarg[len] == '\0')
return (struct grub_arg_option *) opt;
opt++;
}
struct grub_arg_list *usr, char ***args, int *argnum)
{
int curarg;
- char *longarg = 0;
+ int arglen;
int complete = 0;
char **argl = 0;
int num = 0;
break;
}
- longarg = (char *) grub_strdup (arg);
- if (! longarg)
- goto fail;
+ option = grub_strchr (arg, '=');
+ if (option) {
+ arglen = option - arg - 2;
+ option++;
+ } else
+ arglen = grub_strlen (arg) - 2;
- option = find_long_option (longarg);
- arg = longarg;
-
- opt = find_long (cmd->options, arg + 2);
+ opt = find_long (cmd->options, arg + 2, arglen);
if (! opt)
{
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown argument `%s'\n", arg);
if (parse_option (cmd, opt->shortarg, 0, usr) || grub_errno)
goto fail;
}
- grub_free (longarg);
- longarg = 0;
}
complete = 1;
*argnum = num;
fail:
- grub_free (longarg);
-
return complete;
}