add example usage to hello command

This commit is contained in:
BVK Chaitanya 2010-06-10 12:12:03 +05:30
parent 3db1c9eee4
commit 28be0e94db
34 changed files with 220 additions and 102 deletions

View file

@ -52,8 +52,17 @@ grub_script_argv_free (struct grub_script_argv *argv)
grub_free (argv->args);
}
if (argv->scripts)
{
for (i = 0; i < argv->argc; i++)
grub_script_free (argv->scripts[i]);
grub_free (argv->scripts);
}
argv->argc = 0;
argv->args = 0;
argv->scripts = 0;
}
/* Prepare for next argc. */
@ -61,20 +70,33 @@ int
grub_script_argv_next (struct grub_script_argv *argv)
{
char **p = argv->args;
struct grub_script **q = argv->scripts;
if (argv->args && argv->args[argv->argc - 1] == 0)
if (argv->args && argv->argc && argv->args[argv->argc - 1] == 0)
return 0;
p = grub_realloc (p, round_up_exp ((argv->argc + 2) * sizeof (char *)));
if (! p)
return 1;
q = grub_realloc (q, round_up_exp ((argv->argc + 2) * sizeof (struct grub_script *)));
if (! q)
{
grub_free (p);
return 1;
}
argv->argc++;
argv->args = p;
argv->scripts = q;
if (argv->argc == 1)
argv->args[0] = 0;
{
argv->args[0] = 0;
argv->scripts[0] = 0;
}
argv->args[argv->argc] = 0;
argv->scripts[argv->argc] = 0;
return 0;
}
@ -100,6 +122,25 @@ grub_script_argv_append (struct grub_script_argv *argv, const char *s)
return 0;
}
/* Append grub_script `s' as the last argument. */
int
grub_script_argv_script_append (struct grub_script_argv *argv,
struct grub_script *script)
{
struct grub_script *s;
s = grub_malloc (sizeof (*s));
if (! s)
return 1;
if (argv->scripts[argv->argc - 1])
grub_script_free (argv->scripts[argv->argc - 1]);
*s = *script;
argv->scripts[argv->argc - 1] = s;
return 0;
}
/* Split `s' and append words as multiple arguments. */
int
grub_script_argv_split_append (struct grub_script_argv *argv, char *s)

View file

@ -25,6 +25,7 @@
#include <grub/menu.h>
#include <grub/lib/arg.h>
#include <grub/normal.h>
#include <grub/extcmd.h>
/* Max digits for a char is 3 (0xFF is 255), similarly for an int it
is sizeof (int) * 3, and one extra for a possible -ve sign. */
@ -51,7 +52,7 @@ grub_env_special (const char *name)
static char **
grub_script_env_get (const char *name, grub_script_arg_type_t type)
{
struct grub_script_argv result = { 0, 0 };
struct grub_script_argv result = { 0, 0, 0 };
if (grub_script_argv_next (&result))
goto fail;
@ -169,7 +170,7 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
int i;
char **values = 0;
struct grub_script_arg *arg = 0;
struct grub_script_argv result = { 0, 0 };
struct grub_script_argv result = { 0, 0, 0 };
for (; arglist && arglist->arg; arglist = arglist->next)
{
@ -196,6 +197,11 @@ grub_script_arglist_to_argv (struct grub_script_arglist *arglist,
break;
case GRUB_SCRIPT_ARG_TYPE_BLOCK:
if (grub_script_argv_append (&result, arg->str) ||
grub_script_argv_script_append (&result, &arg->block))
goto fail;
break;
case GRUB_SCRIPT_ARG_TYPE_TEXT:
if (grub_strlen (arg->str) &&
grub_script_argv_append (&result, arg->str))
@ -270,7 +276,7 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
grub_script_function_t func = 0;
char errnobuf[18];
char *cmdname;
struct grub_script_argv argv = { 0, 0 };
struct grub_script_argv argv = { 0, 0, 0 };
/* Lookup the command. */
if (grub_script_arglist_to_argv (cmdline->arglist, &argv))
@ -314,7 +320,14 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
/* Execute the GRUB command or function. */
if (grubcmd)
ret = (grubcmd->func) (grubcmd, argv.argc - 1, argv.args + 1);
{
if ((grubcmd->flags & GRUB_COMMAND_FLAG_BLOCKS) &&
(grubcmd->flags & GRUB_COMMAND_FLAG_EXTCMD))
ret = grub_extcmd_dispatcher (grubcmd, argv.argc - 1, argv.args + 1,
argv.scripts + 1);
else
ret = (grubcmd->func) (grubcmd, argv.argc - 1, argv.args + 1);
}
else
ret = grub_script_function_call (func, argv.argc - 1, argv.args + 1);
@ -374,7 +387,7 @@ grub_script_execute_cmdfor (struct grub_script_cmd *cmd)
{
unsigned i;
grub_err_t result;
struct grub_script_argv argv = { 0, 0 };
struct grub_script_argv argv = { 0, 0, 0 };
struct grub_script_cmdfor *cmdfor = (struct grub_script_cmdfor *) cmd;
if (grub_script_arglist_to_argv (cmdfor->words, &argv))
@ -416,7 +429,7 @@ grub_err_t
grub_script_execute_menuentry (struct grub_script_cmd *cmd)
{
struct grub_script_cmd_menuentry *cmd_menuentry;
struct grub_script_argv argv = { 0, 0 };
struct grub_script_argv argv = { 0, 0, 0 };
cmd_menuentry = (struct grub_script_cmd_menuentry *) cmd;

View file

@ -164,7 +164,7 @@ block: "{"
if ((p = grub_script_lexer_record_stop (state, $<offset>2)))
*grub_strrchr (p, '}') = '\0';
if (arg = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p))
if ((arg = grub_script_arg_add (state, 0, GRUB_SCRIPT_ARG_TYPE_BLOCK, p)))
{
arg->block.cmd = $3;
arg->block.mem = memory;

View file

@ -96,7 +96,10 @@ grub_script_free (struct grub_script *script)
{
if (!script)
return;
grub_script_mem_free (script->mem);
if (script->mem)
grub_script_mem_free (script->mem);
grub_free (script);
}
@ -119,6 +122,9 @@ grub_script_arg_add (struct grub_parser_param *state,
return arg;
argpart->type = type;
argpart->block.mem = 0;
argpart->block.cmd = 0;
len = grub_strlen (str) + 1;
argpart->str = grub_script_malloc (state, len);
if (!argpart->str)