Attached patch adds for-loop support and a testcase to GRUB script.
Note that this patch depends on lexer-rewrite branch.

Let me know your comments.



-- 
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: bvk.gro...@gmail.com-20100123053341-ukj4s8lpltdoslue
# target_branch: file:///home/bvk/Work/grub2/lexer-rewrite/
# testament_sha1: d2a268ca298ac4a46b2a7ee8f2cd6a3a59d3b4ed
# timestamp: 2010-01-24 10:08:53 +0530
# base_revision_id: bvk.gro...@gmail.com-20100123045852-\
#   vls49fz4tcviyzdf
# 
# Begin patch
=== added file 'ChangeLog.for-loop'
--- ChangeLog.for-loop  1970-01-01 00:00:00 +0000
+++ ChangeLog.for-loop  2010-01-23 05:33:41 +0000
@@ -0,0 +1,13 @@
+2010-01-12  BVK Chaitanya  <bvk.gro...@gmail.com>
+
+       For loop support to GRUB script.
+
+       * include/grub/script_sh.h (grub_script_cmdfor): New struct.
+       (grub_script_create_cmdfor): New function prototype.
+       (grub_script_execute_cmdfor): New function prototype.
+       * script/execute.c (grub_script_execute_cmdfor): New function.
+       * script/parser.y (command): New for command.
+       (forcmd): New grammar rule.
+       * script/script.c (grub_script_create_cmdfor): New function.
+       * util/grub-script-check.c (grub_script_execute_cmdfor): New
+       function.

=== modified file 'conf/tests.rmk'
--- conf/tests.rmk      2010-01-22 13:37:27 +0000
+++ conf/tests.rmk      2010-01-23 05:33:41 +0000
@@ -50,6 +50,9 @@
 check_SCRIPTS += grub_script_vars1
 grub_script_vars1_SOURCES = tests/grub_script_vars1.in
 
+check_SCRIPTS += grub_script_for1
+grub_script_for1_SOURCES = tests/grub_script_for1.in
+
 # List of tests to execute on "make check"
 # SCRIPTED_TESTS    = example_scripted_test
 # SCRIPTED_TESTS   += example_grub_script_test
@@ -59,6 +62,7 @@
 SCRIPTED_TESTS  = grub_script_echo1
 SCRIPTED_TESTS += grub_script_echo_keywords
 SCRIPTED_TESTS += grub_script_vars1
+SCRIPTED_TESTS += grub_script_for1
 
 # 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-01-23 03:42:46 +0000
+++ include/grub/script_sh.h    2010-01-23 05:33:41 +0000
@@ -106,6 +106,21 @@
   struct grub_script_cmd *exec_on_false;
 };
 
+/* A for statement.  */
+struct grub_script_cmdfor
+{
+  struct grub_script_cmd cmd;
+
+  /* The name used as looping variable.  */
+  struct grub_script_arg *name;
+
+  /* The words loop iterates over.  */
+  struct grub_script_arglist *words;
+
+  /* The command list executed in each loop.  */
+  struct grub_script_cmd *list;
+};
+
 /* A menu entry generate statement.  */
 struct grub_script_cmd_menuentry
 {
@@ -214,6 +229,12 @@
                          struct grub_script_cmd *exec_on_false);
 
 struct grub_script_cmd *
+grub_script_create_cmdfor (struct grub_parser_param *state,
+                          struct grub_script_arg *name,
+                          struct grub_script_arglist *words,
+                          struct grub_script_cmd *list);
+
+struct grub_script_cmd *
 grub_script_create_cmdmenu (struct grub_parser_param *state,
                            struct grub_script_arglist *arglist,
                            char *sourcecode,
@@ -261,6 +282,7 @@
 grub_err_t grub_script_execute_cmdline (struct grub_script_cmd *cmd);
 grub_err_t grub_script_execute_cmdblock (struct grub_script_cmd *cmd);
 grub_err_t grub_script_execute_cmdif (struct grub_script_cmd *cmd);
+grub_err_t grub_script_execute_cmdfor (struct grub_script_cmd *cmd);
 grub_err_t grub_script_execute_menuentry (struct grub_script_cmd *cmd);
 
 /* Execute any GRUB pre-parsed command or script.  */

=== modified file 'script/execute.c'
--- script/execute.c    2010-01-23 04:58:52 +0000
+++ script/execute.c    2010-01-23 05:33:41 +0000
@@ -282,6 +282,32 @@
     return grub_script_execute_cmd (cmdif->exec_on_false);
 }
 
+/* Execute a for statement.  */
+grub_err_t
+grub_script_execute_cmdfor (struct grub_script_cmd *cmd)
+{
+  int i;
+  int result;
+  char **args;
+  int argcount;
+  struct grub_script_cmdfor *cmdfor = (struct grub_script_cmdfor *) cmd;
+
+  args = grub_script_execute_arglist_to_argv (cmdfor->words, &argcount);
+  if (!args)
+    return grub_errno;
+
+  result = 0;
+  for (i = 0; i < argcount; i++)
+    {
+      grub_env_set (cmdfor->name->str, args[i]);
+      result = grub_script_execute_cmd (cmdfor->list);
+      grub_free (args[i]);
+    }
+
+  grub_free (args);
+  return result;
+}
+
 /* Execute the menu entry generate statement.  */
 grub_err_t
 grub_script_execute_menuentry (struct grub_script_cmd *cmd)

=== modified file 'script/parser.y'
--- script/parser.y     2010-01-23 04:46:05 +0000
+++ script/parser.y     2010-01-23 05:33:41 +0000
@@ -76,7 +76,7 @@
 %token <arg> GRUB_PARSER_TOKEN_WORD      "word"
 
 %type <arglist> word argument arguments0 arguments1
-%type <cmd> script_init script grubcmd ifcmd command
+%type <cmd> script_init script grubcmd ifcmd forcmd command
 %type <cmd> commands1 menuentry statement
 
 %pure-parser
@@ -175,6 +175,7 @@
 /* A single command.  */
 command: grubcmd { $$ = $1; }
        | ifcmd   { $$ = $1; }
+       | forcmd  { $$ = $1; }
 ;
 
 /* A list of commands. */
@@ -238,3 +239,14 @@
          grub_script_lexer_deref (state->lexerstate);
        }
 ;
+
+forcmd: "for" "name"
+        {
+         grub_script_lexer_ref (state->lexerstate);
+        }
+        "in" arguments0 delimiters1 "do" commands1 delimiters1 "done"
+       {
+         $$ = grub_script_create_cmdfor (state, $2, $5, $8);
+         grub_script_lexer_deref (state->lexerstate);
+       }
+;

=== modified file 'script/script.c'
--- script/script.c     2010-01-22 13:37:27 +0000
+++ script/script.c     2010-01-23 05:33:41 +0000
@@ -221,6 +221,30 @@
   return (struct grub_script_cmd *) cmd;
 }
 
+/* Create a command that functions as a for statement.  */
+struct grub_script_cmd *
+grub_script_create_cmdfor (struct grub_parser_param *state,
+                          struct grub_script_arg *name,
+                          struct grub_script_arglist *words,
+                          struct grub_script_cmd *list)
+{
+  struct grub_script_cmdfor *cmd;
+
+  grub_dprintf ("scripting", "cmdfor\n");
+
+  cmd = grub_script_malloc (state, sizeof (*cmd));
+  if (! cmd)
+    return 0;
+
+  cmd->cmd.exec = grub_script_execute_cmdfor;
+  cmd->cmd.next = 0;
+  cmd->name = name;
+  cmd->words = words;
+  cmd->list = list;
+
+  return (struct grub_script_cmd *) cmd;
+}
+
 /* Create a command that adds a menu entry to the menu.  Title is an
    argument that is parsed to generate a string that can be used as
    the title.  The sourcecode for this entry is passed in SOURCECODE.

=== added file 'tests/grub_script_for1.in'
--- tests/grub_script_for1.in   1970-01-01 00:00:00 +0000
+++ tests/grub_script_for1.in   2010-01-23 05:33:41 +0000
@@ -0,0 +1,27 @@
+#! @builddir@/grub-shell-tester
+
+for x in one two 'three 3' "four 4" five six-6; do echo $x; done
+
+for x in one two 'three 3' "four 4" five six-6
+do
+       echo $x
+done
+
+foo="1 2"
+for x in ab${foo}cd; do echo $x; done
+for x in "ab${foo}cd"; do echo $x; done
+
+a="one two three"
+y=foo
+echo $y
+for y in $a; do
+    echo $y
+done
+echo $y
+
+
+b="one two three"
+for z in $b; do
+    echo $z
+done
+echo $z

=== modified file 'util/grub-script-check.c'
--- util/grub-script-check.c    2010-01-22 13:37:27 +0000
+++ util/grub-script-check.c    2010-01-23 05:33:41 +0000
@@ -82,6 +82,12 @@
 }
 
 grub_err_t
+grub_script_execute_cmdfor (struct grub_script_cmd *cmd __attribute__ 
((unused)))
+{
+  return 0;
+}
+
+grub_err_t
 grub_script_execute_menuentry (struct grub_script_cmd *cmd __attribute__ 
((unused)))
 {
   return 0;

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

Reply via email to