Hi,

Attached patch adds shift cmd support to grub-script.



-- 
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: bvk.gro...@gmail.com-20100512121649-kssucchekpggnms0
# target_branch: ../cmdlist/
# testament_sha1: fcbd7e7ab663a4edf0114e8dc1fbc33fb006c78e
# timestamp: 2010-05-18 22:46:20 +0530
# base_revision_id: bvk.gro...@gmail.com-20100512082350-\
#   en6z2k5s1ux46lg3
# 
# Begin patch
=== modified file 'conf/common.rmk'
--- conf/common.rmk	2010-05-12 04:49:12 +0000
+++ conf/common.rmk	2010-05-12 12:05:07 +0000
@@ -106,7 +106,7 @@
 grub_script_check_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c \
 	util/grub-script-check.c util/misc.c util/mm.c \
 	script/main.c script/script.c script/function.c script/lexer.c \
-	kern/handler.c kern/err.c kern/parser.c kern/list.c \
+	kern/handler.c kern/err.c kern/parser.c kern/list.c kern/command.c \
 	kern/misc.c kern/env.c grub_script_check_init.c grub_script.tab.c \
 	grub_script.yy.c
 grub_script_check_CFLAGS = $(GNULIB_UTIL_CFLAGS)

=== modified file 'conf/tests.rmk'
--- conf/tests.rmk	2010-05-05 09:17:50 +0000
+++ conf/tests.rmk	2010-05-07 04:38:09 +0000
@@ -74,6 +74,9 @@
 check_SCRIPTS += grub_script_functions
 grub_script_functions_SOURCES = tests/grub_script_functions.in
 
+check_SCRIPTS += grub_script_shift
+grub_script_shift_SOURCES = tests/grub_script_shift.in
+
 # List of tests to execute on "make check"
 # SCRIPTED_TESTS    = example_scripted_test
 # SCRIPTED_TESTS   += example_grub_script_test
@@ -91,6 +94,7 @@
 SCRIPTED_TESTS += grub_script_dollar
 SCRIPTED_TESTS += grub_script_comments
 SCRIPTED_TESTS += grub_script_functions
+SCRIPTED_TESTS += grub_script_shift
 
 # 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-05-12 04:49:12 +0000
+++ include/grub/script_sh.h	2010-05-12 12:05:07 +0000
@@ -23,6 +23,7 @@
 #include <grub/types.h>
 #include <grub/err.h>
 #include <grub/parser.h>
+#include <grub/command.h>
 
 struct grub_script_mem;
 
@@ -66,7 +67,7 @@
 /* An argument vector.  */
 struct grub_script_argv
 {
-  int argc;
+  unsigned argc;
   char **args;
 };
 
@@ -311,6 +312,9 @@
 /* Execute any GRUB pre-parsed command or script.  */
 grub_err_t grub_script_execute (struct grub_script *script);
 
+/* SHIFT command for GRUB script.  */
+grub_err_t grub_script_cmd_shift (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/execute.c'
--- script/execute.c	2010-05-12 07:42:49 +0000
+++ script/execute.c	2010-05-12 12:13:49 +0000
@@ -37,6 +37,37 @@
 };
 static struct grub_script_scope *scope = 0;
 
+grub_err_t
+grub_script_cmd_shift (grub_command_t cmd __attribute__((unused)),
+		       int argc, char *argv[])
+{
+  char *p = 0;
+  unsigned long n = 0;
+
+  if (! scope)
+    return GRUB_ERR_NONE;
+
+  if (argc == 0)
+    n = 1;
+
+  else if (argc > 1)
+    return GRUB_ERR_BAD_ARGUMENT;
+
+  else
+    {
+      n = grub_strtoul (argv[0], &p, 10);
+      if (*p != '\0')
+	return GRUB_ERR_BAD_ARGUMENT;
+    }
+
+  if (n > scope->argv.argc)
+    return GRUB_ERR_BAD_ARGUMENT;
+
+  scope->argv.argc -= n;
+  scope->argv.args += n;
+  return GRUB_ERR_NONE;
+}
+
 static int
 grub_env_special (const char *name)
 {
@@ -77,7 +108,7 @@
     }
   else if (grub_strcmp (name, "*") == 0)
     {
-      int i;
+      unsigned i;
 
       for (i = 0; ! errors && i < scope->argv.argc; i++)
 	if (type == GRUB_SCRIPT_ARG_TYPE_VAR)
@@ -97,7 +128,7 @@
     }
   else if (grub_strcmp (name, "@") == 0)
     {
-      int i;
+      unsigned i;
 
       for (i = 0; ! errors && i < scope->argv.argc; i++)
 	{
@@ -285,7 +316,7 @@
 	  grub_free (assign);
 
 	  grub_snprintf (errnobuf, sizeof (errnobuf), "%d", grub_errno);
-	  grub_env_set ("?", errnobuf);
+	  grub_script_env_set ("?", errnobuf);
 
 	  grub_print_error ();
 
@@ -353,7 +384,7 @@
 grub_err_t
 grub_script_execute_cmdfor (struct grub_script_cmd *cmd)
 {
-  int i;
+  unsigned i;
   int result;
   struct grub_script_argv argv;
   struct grub_script_cmdfor *cmdfor = (struct grub_script_cmdfor *) cmd;

=== modified file 'script/main.c'
--- script/main.c	2009-11-23 15:37:33 +0000
+++ script/main.c	2010-05-07 04:38:09 +0000
@@ -17,6 +17,7 @@
  */
 
 #include <grub/dl.h>
+#include <grub/i18n.h>
 #include <grub/parser.h>
 #include <grub/script_sh.h>
 
@@ -49,6 +50,8 @@
 GRUB_MOD_INIT(sh)
 {
   grub_parser_register ("grub", &grub_sh_parser);
+  grub_register_command ("shift", grub_script_cmd_shift,
+			 N_("[n]"), N_("Shift positional parameters."));
 }
 
 GRUB_MOD_FINI(sh)

=== added file 'tests/grub_script_shift.in'
--- tests/grub_script_shift.in	1970-01-01 00:00:00 +0000
+++ tests/grub_script_shift.in	2010-05-12 12:16:49 +0000
@@ -0,0 +1,85 @@
+#! @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/>.
+
+function f1 {
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f1 $# $1 $2 $3
+  shift
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f1 $# $1 $2 $3
+}
+
+f1
+f1 a
+f1 a b
+f1 a b c
+f1 a b c d
+f1 a b c d e
+
+function f2 {
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f2 $# $1 $2 $3
+  shift 1
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f2 $# $1 $2 $3
+}
+
+f2
+f2 a
+f2 a b
+f2 a b c
+f2 a b c d
+f2 a b c d e
+
+function f3 {
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f3 $# $1 $2 $3
+  shift 3
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f3 $# $1 $2 $3
+}
+
+f3
+f3 a
+f3 a b
+f3 a b c
+f3 a b c d
+f3 a b c d e
+
+function f4 {
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f4 $# $1 $2 $3
+  shift 100
+  echo f1 '$@' $@
+  echo f1 '$*' $*
+  echo f4 $# $1 $2 $3
+}
+
+f4
+f4 a
+f4 a b
+f4 a b c
+f4 a b c d
+f4 a b c d e

=== modified file 'util/grub-script-check.c'
--- util/grub-script-check.c	2010-05-05 08:35:06 +0000
+++ util/grub-script-check.c	2010-05-07 04:38:09 +0000
@@ -57,6 +57,14 @@
   fflush (stdout);
 }
 
+grub_err_t
+grub_script_cmd_shift (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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
vgA=
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to