Hi,

Attached patch provides "continue [n]" command support for GRUB
script.  It needs to be applied over my earlier break command patch.


-- 
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: bvk.gro...@gmail.com-20100505104931-cy2j9xtwicrbbvmi
# target_branch: ../break-cmd/
# testament_sha1: 360118bc11567754dfb6d434f4f714b856ac320e
# timestamp: 2010-05-05 16:19:44 +0530
# base_revision_id: bvk.gro...@gmail.com-20100505100426-\
#   vp7j1j0otn99h0xn
# 
# Begin patch
=== modified file 'conf/tests.rmk'
--- conf/tests.rmk      2010-05-05 10:04:26 +0000
+++ conf/tests.rmk      2010-05-05 10:49:31 +0000
@@ -77,6 +77,9 @@
 check_SCRIPTS += grub_script_break
 grub_script_break_SOURCES = tests/grub_script_break.in
 
+check_SCRIPTS += grub_script_continue
+grub_script_continue_SOURCES = tests/grub_script_continue.in
+
 # List of tests to execute on "make check"
 # SCRIPTED_TESTS    = example_scripted_test
 # SCRIPTED_TESTS   += example_grub_script_test
@@ -95,6 +98,7 @@
 SCRIPTED_TESTS += grub_script_comments
 SCRIPTED_TESTS += grub_script_functions
 SCRIPTED_TESTS += grub_script_break
+SCRIPTED_TESTS += grub_script_continue
 
 # dependencies between tests and testing-tools
 $(SCRIPTED_TESTS): grub-shell grub-shell-tester

=== modified file 'script/execute.c'
--- script/execute.c    2010-05-05 10:04:26 +0000
+++ script/execute.c    2010-05-05 10:49:31 +0000
@@ -30,13 +30,13 @@
    is sizeof (int) * 3, and one extra for a possible -ve sign.  */
 #define ERRNO_DIGITS_MAX  (sizeof (int) * 3 + 1)
 
+static unsigned long is_continue;
 static unsigned long active_loops;
 static unsigned long active_breaks;
 static struct grub_script_scope *scope = 0;
 
 grub_err_t
-grub_script_break (grub_command_t cmd __attribute__((unused)),
-                  int argc, char *argv[])
+grub_script_break (grub_command_t cmd, int argc, char *argv[])
 {
   char *p = 0;
   unsigned long count;
@@ -50,6 +50,8 @@
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "bad break");
 
   active_breaks = count;
+  is_continue = grub_strcmp (cmd->name, "break") ? 1 : 0;
+
   return GRUB_ERR_NONE;
 }
 
@@ -408,6 +410,9 @@
   result = 0;
   for (i = 0; i < argcount; i++)
     {
+      if (is_continue && active_breaks == 1)
+       active_breaks = 0;
+
       if (! active_breaks)
        {
          grub_script_env_set (cmdfor->name->str, args[i]);
@@ -441,14 +446,17 @@
 
     result = grub_script_execute_cmd (cmdwhile->list);
 
+    if (active_breaks == 1 && is_continue)
+      active_breaks = 0;
+
     if (active_breaks)
-      {
-       active_breaks--;
-       break;
-      }
+      break;
 
   } while (1); /* XXX Put a check for ^C here */
 
+  if (active_breaks)
+    active_breaks--;
+
   active_loops--;
   return result;
 }

=== modified file 'script/main.c'
--- script/main.c       2010-05-05 10:04:26 +0000
+++ script/main.c       2010-05-05 10:49:31 +0000
@@ -52,6 +52,8 @@
   grub_parser_register ("grub", &grub_sh_parser);
   grub_register_command ("break", grub_script_break,
                         N_("[n]"), N_("Exit from loops"));
+  grub_register_command ("continue", grub_script_break,
+                        N_("[n]"), N_("Continue loops"));
 }
 
 GRUB_MOD_FINI(sh)

=== added file 'tests/grub_script_continue.in'
--- tests/grub_script_continue.in       1970-01-01 00:00:00 +0000
+++ tests/grub_script_continue.in       2010-05-05 10:49:31 +0000
@@ -0,0 +1,86 @@
+#! @builddir@/grub-shell-tester
+#
+# 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/>.
+
+# continue without any arguments
+for i in 1 2 3 4 5 6 7 8 9 10
+do
+  if test "$i" = 5
+  then
+    continue
+  fi
+  echo $i
+done
+
+# continue with one
+for i in 1 2 3 4 5 6 7 8 9 10
+do
+  if test "$i" = 5
+  then
+    continue 1
+  fi
+  echo $i
+done
+
+# continue with loop count
+for i in 1 2 3 4 5
+do
+  for j in a b c d e f
+  do
+    if test "$i" = 3
+    then
+      if test "$j" = d
+      then
+        continue 2
+      fi
+      echo "$i $j"
+    fi
+  done
+done
+
+# continue into middle loop
+for i in 1 2 3 4 5
+do
+  for j in a b c d e f
+  do
+    if test "$i" = 3
+    then
+      if test "$j" = d
+      then
+        continue 1
+      fi
+      echo "$i $j"
+    fi
+  done
+done
+
+# while and until loops
+a=
+while test "$a" != "aaaaaaa"
+do
+  a="a$a"
+  for i in 1 2 3 4
+  do
+    b=
+    until test "$b" = "bbbbb"
+    do
+      b="b$b"
+      if test "$i" = 3; then echo "continue 2"; continue 2; fi
+      echo "$a $i $b"
+    done
+  done
+done
+

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

Reply via email to