common = tests/grub_script_blockarg.in;
};
+ script = {
+ testcase;
+ name = grub_script_setparams;
+ common = tests/grub_script_setparams.in;
+ };
+
+ script = {
+ testcase;
+ name = grub_script_return;
+ common = tests/grub_script_return.in;
+ };
+
+ script = {
+ testcase;
+ name = grub_cmd_regexp;
+ common = tests/grub_cmd_regexp.in;
+ };
+
+script = {
+ testcase;
+ name = grub_script_expansion;
+ common = tests/grub_script_expansion.in;
+};
+
program = {
testcase;
name = example_unit_test;
#include <grub/dl.h>
#include <grub/misc.h>
#include <grub/mm.h>
- #include <grub/command.h>
+ #include <grub/err.h>
+ #include <grub/env.h>
+ #include <grub/extcmd.h>
#include <grub/i18n.h>
+#include <grub/script_sh.h>
#include <regex.h>
+ static const struct grub_arg_option options[] =
+ {
+ { "set", 's', GRUB_ARG_OPTION_REPEATABLE,
+ N_("Variable names to update with matches."),
+ N_("[NUMBER:]VARNAME"), ARG_TYPE_STRING },
+ { 0, 0, 0, 0, 0, 0 }
+ };
+
+ static grub_err_t
+ set_matches (char **varnames, char *str, grub_size_t nmatches,
+ regmatch_t *matches)
+ {
+ int i;
+ char ch;
+ char *p;
+ char *q;
+ grub_err_t err;
+ unsigned long j;
+
+ auto void setvar (char *v, regmatch_t *m);
+ void setvar (char *v, regmatch_t *m)
+ {
+ ch = str[m->rm_eo];
+ str[m->rm_eo] = '\0';
+ err = grub_env_set (v, str + m->rm_so);
+ str[m->rm_eo] = ch;
+ }
+
+ for (i = 0; varnames && varnames[i]; i++)
+ {
+ if (! (p = grub_strchr (varnames[i], ':')))
+ {
+ /* varname w/o index defaults to 1 */
+ if (nmatches < 2 || matches[1].rm_so == -1)
+ grub_env_unset (varnames[i]);
+ else
+ setvar (varnames[i], &matches[1]);
+ }
+ else
+ {
+ j = grub_strtoul (varnames[i], &q, 10);
+ if (q != p)
+ return grub_error (GRUB_ERR_BAD_ARGUMENT,
+ "invalid variable name format %s", varnames[i]);
+
+ if (nmatches <= j || matches[j].rm_so == -1)
+ grub_env_unset (p + 1);
+ else
+ setvar (p + 1, &matches[j]);
+ }
+
+ if (err != GRUB_ERR_NONE)
+ return err;
+ }
+ return GRUB_ERR_NONE;
+ }
+
static grub_err_t
- grub_cmd_regexp (grub_command_t cmd __attribute__ ((unused)),
- int argc, char **args)
+ grub_cmd_regexp (grub_extcmd_context_t ctxt, int argc, char **args)
{
int argn = 0;
- int matches = 0;
regex_t regex;
int ret;
grub_size_t s;
\f
GRUB_MOD_INIT(regexp)
{
- cmd = grub_register_command ("regexp", grub_cmd_regexp,
- N_("REGEXP STRING"),
- N_("Test if REGEXP matches STRING."));
+ cmd = grub_register_extcmd ("regexp", grub_cmd_regexp,
+ GRUB_COMMAND_FLAG_BOTH, N_("REGEXP STRING"),
+ N_("Test if REGEXP matches STRING."), options);
+
+ /* Setup GRUB script wildcard translator. */
+ grub_wildcard_translator = &grub_filename_translator;
}
GRUB_MOD_FINI(regexp)
{
- grub_unregister_command (cmd);
+ grub_unregister_extcmd (cmd);
+ grub_wildcard_translator = 0;
}
};
static struct grub_script_scope *scope = 0;
+/* Wildcard translator for GRUB script. */
+struct grub_script_wildcard_translator *grub_wildcard_translator;
+
+ static void
+ replace_scope (struct grub_script_scope *new_scope)
+ {
+ if (scope)
+ {
+ scope->argv.argc += scope->shifts;
+ scope->argv.args -= scope->shifts;
+
+ if (scope->flags & GRUB_SCRIPT_SCOPE_ARGS_MALLOCED)
+ grub_script_argv_free (&scope->argv);
+
+ if (scope->flags & GRUB_SCRIPT_SCOPE_MALLOCED)
+ grub_free (scope);
+ }
+ scope = new_scope;
+ }
+
grub_err_t
grub_script_break (grub_command_t cmd, int argc, char *argv[])
{