add example usage to hello command
This commit is contained in:
parent
3db1c9eee4
commit
28be0e94db
34 changed files with 220 additions and 102 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue