Hi

Attached patch adds new command, setparams to set positional parameter
values in a function scope.  It is equivalent to bash's set command
with arguments.


bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: b...@dbook-20100815063233-x4dura6g3hntvcpd
# target_branch: ../mainline/
# testament_sha1: dba25f72f7d4593480714a7f8f0b248e44b535d0
# timestamp: 2010-08-15 16:15:56 +0530
# base_revision_id: b...@dbook-20100812152242-6cxnb4ed5gbzni0q
# 
# Begin patch
=== modified file 'conf/tests.rmk'
--- conf/tests.rmk	2010-06-13 04:18:47 +0000
+++ conf/tests.rmk	2010-08-15 06:32:33 +0000
@@ -83,6 +83,9 @@
 check_SCRIPTS += grub_script_shift
 grub_script_shift_SOURCES = tests/grub_script_shift.in
 
+check_SCRIPTS += grub_script_setparams
+grub_script_setparams_SOURCES = tests/grub_script_setparams.in
+
 # List of tests to execute on "make check"
 # SCRIPTED_TESTS    = example_scripted_test
 # SCRIPTED_TESTS   += example_grub_script_test
@@ -103,6 +106,7 @@
 SCRIPTED_TESTS += grub_script_break
 SCRIPTED_TESTS += grub_script_continue
 SCRIPTED_TESTS += grub_script_shift
+SCRIPTED_TESTS += grub_script_setparams
 
 # dependencies between tests and testing-tools
 $(SCRIPTED_TESTS): grub-shell grub-shell-tester

=== modified file 'include/grub/script_sh.h'
--- include/grub/script_sh.h	2010-08-12 06:32:48 +0000
+++ include/grub/script_sh.h	2010-08-15 06:32:33 +0000
@@ -227,6 +227,7 @@
 void grub_script_fini (void);
 
 void grub_script_argv_free    (struct grub_script_argv *argv);
+int grub_script_argv_make     (struct grub_script_argv *argv, int argc, char **args);
 int grub_script_argv_next     (struct grub_script_argv *argv);
 int grub_script_argv_append   (struct grub_script_argv *argv, const char *s);
 int grub_script_argv_split_append (struct grub_script_argv *argv, char *s);
@@ -321,6 +322,9 @@
 /* SHIFT command for GRUB script.  */
 grub_err_t grub_script_shift (grub_command_t cmd, int argc, char *argv[]);
 
+/* SETPARAMS command for GRUB script functions.  */
+grub_err_t grub_script_setparams (grub_command_t cmd, int argc, char *argv[]);
+
 /* This variable points to the parsed command.  This is used to
    communicate with the bison code.  */
 extern struct grub_script_cmd *grub_script_parsed;

=== modified file 'script/argv.c'
--- script/argv.c	2010-07-22 22:35:15 +0000
+++ script/argv.c	2010-08-15 06:32:33 +0000
@@ -57,6 +57,23 @@
   argv->args = 0;
 }
 
+/* Make argv from argc, args pair.  */
+int
+grub_script_argv_make (struct grub_script_argv *argv, int argc, char **args)
+{
+  int i;
+  struct grub_script_argv r = { 0, 0};
+
+  for (i = 0; i < argc; i++)
+    if (grub_script_argv_next (&r) || grub_script_argv_append (&r, args[i]))
+      {
+	grub_script_argv_free (&r);
+	return 1;
+      }
+  *argv = r;
+  return 0;
+}
+
 /* Prepare for next argc.  */
 int
 grub_script_argv_next (struct grub_script_argv *argv)

=== modified file 'script/execute.c'
--- script/execute.c	2010-08-12 06:32:48 +0000
+++ script/execute.c	2010-08-15 06:32:33 +0000
@@ -34,13 +34,35 @@
 static unsigned long active_loops;
 static unsigned long active_breaks;
 
+#define GRUB_SCRIPT_SCOPE_MALLOCED      1
+#define GRUB_SCRIPT_SCOPE_ARGS_MALLOCED 2
+
 /* Scope for grub script functions.  */
 struct grub_script_scope
 {
+  unsigned flags;
+  unsigned shifts;
   struct grub_script_argv argv;
 };
 static struct grub_script_scope *scope = 0;
 
+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[])
 {
@@ -85,11 +107,41 @@
   if (n > scope->argv.argc)
     return GRUB_ERR_BAD_ARGUMENT;
 
+  scope->shifts += n;
   scope->argv.argc -= n;
   scope->argv.args += n;
   return GRUB_ERR_NONE;
 }
 
+grub_err_t
+grub_script_setparams (grub_command_t cmd __attribute__((unused)),
+		       int argc, char **args)
+{
+  struct grub_script_scope *new_scope;
+  struct grub_script_argv argv = { 0, 0 };
+
+  if (! scope)
+    return GRUB_ERR_INVALID_COMMAND;
+
+  new_scope = grub_malloc (sizeof (*new_scope));
+  if (! new_scope)
+    return grub_errno;
+
+  if (grub_script_argv_make (&argv, argc, args))
+    {
+      grub_free (new_scope);
+      return grub_errno;
+    }
+
+  new_scope->shifts = 0;
+  new_scope->argv = argv;
+  new_scope->flags = GRUB_SCRIPT_SCOPE_MALLOCED |
+    GRUB_SCRIPT_SCOPE_ARGS_MALLOCED;
+
+  replace_scope (new_scope);
+  return GRUB_ERR_NONE;
+}
+
 static int
 grub_env_special (const char *name)
 {
@@ -104,6 +156,7 @@
 static char **
 grub_script_env_get (const char *name, grub_script_arg_type_t type)
 {
+  unsigned i;
   struct grub_script_argv result = { 0, 0 };
 
   if (grub_script_argv_next (&result))
@@ -138,8 +191,6 @@
     }
   else if (grub_strcmp (name, "*") == 0)
     {
-      unsigned i;
-
       for (i = 0; i < scope->argv.argc; i++)
 	if (type == GRUB_SCRIPT_ARG_TYPE_VAR)
 	  {
@@ -160,8 +211,6 @@
     }
   else if (grub_strcmp (name, "@") == 0)
     {
-      unsigned i;
-
       for (i = 0; i < scope->argv.argc; i++)
 	{
 	  if (i != 0 && grub_script_argv_next (&result))
@@ -302,6 +351,8 @@
   struct grub_script_scope new_scope;
 
   active_loops = 0;
+  new_scope.flags = 0;
+  new_scope.shifts = 0;
   new_scope.argv.argc = argc;
   new_scope.argv.args = args;
 
@@ -311,7 +362,7 @@
   ret = grub_script_execute (func->func);
 
   active_loops = loops;
-  scope = old_scope;
+  replace_scope (old_scope); /* free any scopes by setparams */
   return ret;
 }
 

=== modified file 'script/main.c'
--- script/main.c	2010-06-13 04:18:47 +0000
+++ script/main.c	2010-08-15 06:32:33 +0000
@@ -44,6 +44,7 @@
 static grub_command_t cmd_break;
 static grub_command_t cmd_continue;
 static grub_command_t cmd_shift;
+static grub_command_t cmd_setparams;
 
 void
 grub_script_init (void)
@@ -54,6 +55,9 @@
 					N_("[n]"), N_("Continue loops"));
   cmd_shift = grub_register_command ("shift", grub_script_shift,
 				     N_("[n]"), N_("Shift positional parameters."));
+  cmd_setparams = grub_register_command ("setparams", grub_script_setparams,
+					 N_("[VALUE]..."),
+					 N_("Set positional parameters."));
 }
 
 void
@@ -70,4 +74,8 @@
   if (cmd_shift)
     grub_unregister_command (cmd_shift);
   cmd_shift = 0;
+
+  if (cmd_setparams)
+    grub_unregister_command (cmd_setparams);
+  cmd_setparams = 0;
 }

=== added file 'tests/grub_script_setparams.in'
--- tests/grub_script_setparams.in	1970-01-01 00:00:00 +0000
+++ tests/grub_script_setparams.in	2010-08-15 06:32:33 +0000
@@ -0,0 +1,59 @@
+#! @builddir@/grub-shell-tester
+
+# Run GRUB script in a Qemu instance
+# Copyright (C) 2010  Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
+if test x$grubshell = xyes; then cmd=setparams; else cmd=set; fi
+
+function f1 {
+    echo $#
+    echo "$#"
+
+    echo $@
+    echo "$@"
+
+    echo $*
+    echo "$*"
+
+    echo $1 $2
+    for v in "$@"; do echo $v; done
+    shift
+    echo $1 $2
+    for v in "$@"; do echo $v; done
+
+    $cmd 1 2 3 4
+
+    echo $#
+    echo "$#"
+
+    echo $@
+    echo "$@"
+
+    echo $*
+    echo "$*"
+
+    echo $1 $2
+    for v in "$@"; do echo $v; done
+    shift
+    echo $1 $2
+    for v in "$@"; do echo $v; done
+}
+# f1
+# f1 a
+f1 a b
+f1 a b c
+f1 a b c d
+f1 a b c d e

=== modified file 'util/grub-script-check.c'
--- util/grub-script-check.c	2010-08-12 06:32:48 +0000
+++ util/grub-script-check.c	2010-08-15 06:32:33 +0000
@@ -73,6 +73,14 @@
   return 0;
 }
 
+grub_err_t
+grub_script_setparams (grub_command_t cmd __attribute__((unused)),
+		       int argc __attribute__((unused)),
+		       char *argv[] __attribute__((unused)))
+{
+  return 0;
+}
+
 char *
 grub_script_execute_argument_to_string (struct grub_script_arg *arg __attribute__ ((unused)))
 {

# Begin bundle
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
RThQkC01wRM=
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to