]> git.proxmox.com Git - grub2.git/commitdiff
merge with mainline
authorBVK Chaitanya <bvk@dbook>
Sat, 4 Sep 2010 17:04:32 +0000 (22:34 +0530)
committerBVK Chaitanya <bvk@dbook>
Sat, 4 Sep 2010 17:04:32 +0000 (22:34 +0530)
1  2 
Makefile.util.def
grub-core/Makefile.core.def
grub-core/commands/regexp.c
grub-core/script/argv.c
grub-core/script/execute.c
include/grub/script_sh.h

index 31985811ce041db87c48ae54910360c2eee1d75e,a3d5381d42c1318f26d3f72cdb12e700a1552277..dd38774fdfa4d321dc7d1a47f2a00676f02bd9fc
@@@ -507,12 -507,24 +507,30 @@@ script = 
    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;
Simple merge
index 8e0ec5a3a61aef2abfa5799133ecf7785200aeb6,8edf818a3a356848923314d5417cb1acc53aefee..4329483af2a52ed60afa1e3b9ff48bc9765134e7
  #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;
@@@ -70,16 -135,12 +136,16 @@@ static grub_extcmd_t cmd
  \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;
  }
Simple merge
index e6be1fa315be9979d701992f5bf499c9c50c9e78,f35e9ce76cacb80410870942dc533c8d8fc9d1cb..a7baee96cfede8f75ed34cb705b595472a68a947
@@@ -42,9 -48,23 +48,26 @@@ struct grub_script_scop
  };
  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[])
  {
Simple merge