+2009-12-20 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * kern/parser.c (grub_parser_split_cmdline): Fix incorrect counting
+ of arguments. Return number of tokens and not arguments. All users
+ updated.
+
2009-12-20 Vladimir Serbinenko <phcoder@gmail.com>
* util/i386/pc/grub-setup.c (setup): Don't install on non-GPT,
*(bp++) = *val;
}
- *argc = 1;
+ *argc = 0;
do
{
if (! *rd)
state = newstate;
}
} while (state != GRUB_PARSER_STATE_TEXT && !check_varstate (state));
- *(bp++) = '\0';
/* A special case for when the last character was part of a
variable. */
add_var (GRUB_PARSER_STATE_TEXT);
+ if (bp != buffer && *(bp - 1))
+ {
+ *(bp++) = '\0';
+ (*argc)++;
+ }
/* Reserve memory for the return values. */
args = grub_malloc (bp - buffer);
bp++;
}
- (*argc)--;
-
return 0;
}
if (grub_parser_split_cmdline (line, getline, &n, &args) || n < 0)
return grub_errno;
+ if (n == 0)
+ return GRUB_ERR_NONE;
+
/* In case of an assignment set the environment accordingly
instead of calling a function. */
- if (n == 0 && grub_strchr (line, '='))
+ if (n == 1 && grub_strchr (line, '='))
{
char *val = grub_strchr (args[0], '=');
val[0] = 0;
cmd = grub_command_find (name);
if (cmd)
{
- (cmd->func) (cmd, n, &args[1]);
+ (cmd->func) (cmd, n - 1, &args[1]);
}
else
{
if (grub_parser_split_cmdline (buf, 0, &argc, &argv))
return 0;
- current_word = argv[argc];
+ if (argc == 0)
+ current_word = "";
+ else
+ current_word = argv[argc - 1];
/* Determine the state the command line is in, depending on the
state, it can be determined how to complete. */
cmdline_state = get_state (buf);
- if (argc == 0)
+ if (argc == 1 || argc == 0)
{
/* Complete a command. */
if (grub_command_iterate (iterate_command))
goto fail;
}
- grub_free (argv[0]);
+ if (argc != 0)
+ grub_free (argv[0]);
grub_free (match);
return ret;
}
fail:
- grub_free (argv[0]);
+ if (argc != 0)
+ grub_free (argv[0]);
grub_free (match);
grub_errno = GRUB_ERR_NONE;