Hi,

Attached patch implements while and until loops support to GRUB
script.  Its been pushed into branches/while-until-loops as well.  Let
me know your comments.


-- 
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: bvk.gro...@gmail.com-20100126040951-4jx21vvs3as5bp6u
# target_branch: file:///home/bvk/Work/grub2/for-loop/
# testament_sha1: 765eb235c266725c213c934ee0086cdd9cac5e53
# timestamp: 2010-01-26 09:40:09 +0530
# base_revision_id: bvk.gro...@gmail.com-20100123053341-\
#   ukj4s8lpltdoslue
# 
# Begin patch
=== added file 'ChangeLog.while-until-loops'
--- ChangeLog.while-until-loops 1970-01-01 00:00:00 +0000
+++ ChangeLog.while-until-loops 2010-01-26 04:09:51 +0000
@@ -0,0 +1,15 @@
+2010-01-26  BVK Chaitanya  <bvk.gro...@gmail.com>
+
+       While and until loops support to GRUB script.
+
+       * include/grub/script_sh.h (grub_script_cmdwhile): New struct.
+       (grub_script_create_cmdwhile): New function prototype.
+       (grub_script_execute_cmdwhile): New function prototype.
+       * script/execute.c (grub_script_execute_cmdwhile): New function.
+       * script/parser.y (command): New commands.
+       (whilecmd): New grammar rule.
+       (untilcmd): New grammar rule.
+       * script/script.c (grub_script_create_cmdwhile): New function.
+       * util/grub-script-check.c (grub_script_execute_cmdwhile): New
+       function.
+

=== modified file 'include/grub/script_sh.h'
--- include/grub/script_sh.h    2010-01-23 05:33:41 +0000
+++ include/grub/script_sh.h    2010-01-23 05:49:26 +0000
@@ -121,6 +121,21 @@
   struct grub_script_cmd *list;
 };
 
+/* A while/until command.  */
+struct grub_script_cmdwhile
+{
+  struct grub_script_cmd cmd;
+
+  /* The command list used as condition.  */
+  struct grub_script_cmd *cond;
+
+  /* The command list executed in each loop.  */
+  struct grub_script_cmd *list;
+
+  /* The flag to indicate this as "until" loop.  */
+  int until;
+};
+
 /* A menu entry generate statement.  */
 struct grub_script_cmd_menuentry
 {
@@ -235,6 +250,12 @@
                           struct grub_script_cmd *list);
 
 struct grub_script_cmd *
+grub_script_create_cmdwhile (struct grub_parser_param *state,
+                            struct grub_script_cmd *cond,
+                            struct grub_script_cmd *list,
+                            int is_an_until_loop);
+
+struct grub_script_cmd *
 grub_script_create_cmdmenu (struct grub_parser_param *state,
                            struct grub_script_arglist *arglist,
                            char *sourcecode,
@@ -283,6 +304,7 @@
 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_cmdwhile (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 05:33:41 +0000
+++ script/execute.c    2010-01-23 05:49:26 +0000
@@ -308,6 +308,26 @@
   return result;
 }
 
+/* Execute a "while" or "until" command.  */
+grub_err_t
+grub_script_execute_cmdwhile (struct grub_script_cmd *cmd)
+{
+  int cond;
+  int result;
+  struct grub_script_cmdwhile *cmdwhile = (struct grub_script_cmdwhile *) cmd;
+
+  result = 0;
+  do {
+    cond = grub_script_execute_cmd (cmdwhile->cond);
+    if ((cmdwhile->until && !cond) || (!cmdwhile->until && cond))
+      break;
+
+    result = grub_script_execute_cmd (cmdwhile->list);
+  } while (1); /* XXX Put a check for ^C here */
+
+  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 05:33:41 +0000
+++ script/parser.y     2010-01-23 05:49:26 +0000
@@ -76,8 +76,9 @@
 %token <arg> GRUB_PARSER_TOKEN_WORD      "word"
 
 %type <arglist> word argument arguments0 arguments1
-%type <cmd> script_init script grubcmd ifcmd forcmd command
-%type <cmd> commands1 menuentry statement
+%type <cmd> script_init script
+%type <cmd> grubcmd ifcmd forcmd whilecmd untilcmd
+%type <cmd> command commands1 menuentry statement
 
 %pure-parser
 %lex-param   { struct grub_parser_param *state };
@@ -173,9 +174,11 @@
 ;
 
 /* A single command.  */
-command: grubcmd { $$ = $1; }
-       | ifcmd   { $$ = $1; }
-       | forcmd  { $$ = $1; }
+command: grubcmd  { $$ = $1; }
+       | ifcmd    { $$ = $1; }
+       | forcmd   { $$ = $1; }
+       | whilecmd { $$ = $1; }
+       | untilcmd { $$ = $1; }
 ;
 
 /* A list of commands. */
@@ -250,3 +253,25 @@
          grub_script_lexer_deref (state->lexerstate);
        }
 ;
+
+whilecmd: "while"
+          {
+           grub_script_lexer_ref (state->lexerstate);
+          }
+          commands1 delimiters1 "do" commands1 delimiters1 "done"
+         {
+           $$ = grub_script_create_cmdwhile (state, $3, $6, 0);
+           grub_script_lexer_deref (state->lexerstate);
+         }
+;
+
+untilcmd: "until"
+          {
+           grub_script_lexer_ref (state->lexerstate);
+          }
+          commands1 delimiters1 "do" commands1 delimiters1 "done"
+         {
+           $$ = grub_script_create_cmdwhile (state, $3, $6, 1);
+           grub_script_lexer_deref (state->lexerstate);
+         }
+;

=== modified file 'script/script.c'
--- script/script.c     2010-01-23 05:33:41 +0000
+++ script/script.c     2010-01-23 05:49:26 +0000
@@ -245,6 +245,28 @@
   return (struct grub_script_cmd *) cmd;
 }
 
+/* Create a "while" or "until" command.  */
+struct grub_script_cmd *
+grub_script_create_cmdwhile (struct grub_parser_param *state,
+                            struct grub_script_cmd *cond,
+                            struct grub_script_cmd *list,
+                            int is_an_until_loop)
+{
+  struct grub_script_cmdwhile *cmd;
+
+  cmd = grub_script_malloc (state, sizeof (*cmd));
+  if (! cmd)
+    return 0;
+
+  cmd->cmd.exec = grub_script_execute_cmdwhile;
+  cmd->cmd.next = 0;
+  cmd->cond = cond;
+  cmd->list = list;
+  cmd->until = is_an_until_loop;
+
+  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.

=== modified file 'util/grub-script-check.c'
--- util/grub-script-check.c    2010-01-23 05:33:41 +0000
+++ util/grub-script-check.c    2010-01-23 05:49:26 +0000
@@ -88,6 +88,12 @@
 }
 
 grub_err_t
+grub_script_execute_cmdwhile (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
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWbxZFYYAB/7fgHkwd3f//3qN
18G////+YAy+s+32+7y++33roxKhRQL7vtfPV973OvtqGcYKKUKosJJE0aTKPVPUMekxNPTVDbRp
EB6mgAB6h6CaCSIRk0BMTSE0Q2U0aNAaAB6gAAAyJpMpijag9I9T1NGmmh6gAAABoANAJNSUap+o
ageptE8kZNMQ9RiaMgAZBkDQYIlEEKP1J6j0g2o08iaaZNNNGjQNAA0DIyCKJAmTIBMmmjSY0k1P
0aUaeUZA9TQABtReC3jeMGDFco/40kOmUNULYE5abUs6CAVyuxZszZZyWON0WkDczNtsM9ttp8zq
Hb0JpmKn7xVzfLuKC4IkUMKTbwIM45A8NdN683qaKO7g+WEGteccpIRRkKxDvjbz0MNX8zWqt7tX
a2V8I24uTa7icSDI/CNgdoInaVwEO6RlSewZfplIIgQlcP5uENO46nYDIjnRaH7M/c32bgwn+2/p
d6A6UKOdmK8pchKlCTnLTL4iaENiCLFFBZEary8j/IHnXYZBb5UPPwuOdVdAl8yJ8iSqCrNSiPVA
4PcCGQRYLRWcs8JCWxS4ItC1usj2AKNu8QbXhbPSTsWv62qp2Mh+k54mYw+ZxLdZv79YU2SUC3N/
UfPWHsrEU0gvBmOmnhhdcHTriqFJDY6+fc1gB1sLUuud1BBEj4YLP2Npo24LgWV3HIdtnv9PhKVT
m9zNj1IcvgNSuLVfouvaBSNkkaWDonBl0GJtSjs2615emB2brsW9m21L8V1UewEQIEjwLE9ZEOJ3
yiGsnpRQBp6+vlquDaLFkzKCOtqUWuaMPiloOlKhDkilkiBMRGKywdT2WDe063zrKFhYSfcoFZA6
6s5EjCkoGTikQxmPJ/My6UXv1DBYlVeBUO9KjnrtVmg3UzYrbOdLfTQd3HJMkUukRMgn4OkOS83r
E064jOkzPlj0yqmiuRtjzY9yD4KOrCFstZlQrvtS7DKVhIXy9GbEt/CoVOKKV2RdHcTnKz7KFgE8
iQtxADT8fnZfOYt0XBKMmovpNZn0/itZRGsCIBldYX008EDA29pVrLyYb2LtJ4o/qabzJZzz4gyT
szoiRj305iiBsczhSEkNtjznHNC+O08Qt+SvQsoKKkoDAB2JgME3Gbx7NOLq8lzdCneZ5pXAmo15
3rNYmtC8te3LauY5LvUuiAj9UtO5q373RsH4JUPUbzZ1cN01F/eScjrMR4Qa54wTWj5Qimp53mn6
jacTMYGPUXoh1o29dfKhtW4nO5aIC4CRsOsy3Ek91UK0ufr4QFyEwYUIVstM5bTyQK3HHVfNxOuv
THExRqyLAAuowWRN5CEFfJYATxJAVKGBEs1VDGFyFfvWOinY041IYDWmUkuyzEgvELeyEjMxuJEs
7I351tgk5ewDgo5WcmyAs8ROdlSpaTJlbtaUmxyISwxKkkxkY3mBWhSBVzklzwMEB5PIoC2QXmZX
M3hvdM2xBkRudwyvB+oGFpsrtu3Uix3LplsGk6MtcQDMnZMbHBtQDi+dkUnc320JCBtx1nY+xS7P
EKPzltyQrZK84FiXFl8CDbtYZ743jWaXyOoiQQETc3xiBIkbQB1BVGMkyiqxLdHaQQaBW7iSyt6n
WJU7b9ZabMvcexHmPWgY379VIz40lc7S/1cCliF2pSLnDIoRtbQsHWpKJ1yKFrEiE+MtjdXApBOh
Au6HLAxLDgyMCxVQG6XlQoYDUstgzkNNaWNBzFY8jt3sta28ydJ4GEuimwYpddL9ecL56T0pfusO
a0gTxKFpE056kDTY8h4wLUupAbIWFON+1zVrCJMrF0KyaFbmgKGxvK00LaQFJ3nSS0LN1JMsaXm3
A7BcNLYuPQgbBRqpC5xmGpAnUw1OTFj1MoVMg1suq5mxCJBjIUKQMoHJnTixJUu4IBEOU98is5yq
rqWtkXCb4DAKul4Uy88MFbKWqmlQVTd2DfhJV1wsYhodAidLmx4LJJFkSuw/jnqGEtxPcPwBlIDY
l5sP01p5ksA5cIYRnmdkFnCoEoShRJIOY3WgmdsKQjCERgdxlpaQv4KihIASKZbMAybTcNEFr5XC
eZ71zXYRiJAqJiY1HdNG8a6BnfAn1wmWuutcSFoQkeAKPU+QxCY412MhU8SFLgrDdQ2ItZvGgYfG
1GRijfwQOXzhjiUmS8oOQ5DHiMCQiBJldxj5CJgO/SVGQxHB2/3vNpxrA9TzkJJGEkIJIn/YfJ+n
xRN4LBhZnG3OUTjykRuo6u4ecqEJTNM6WnTXsHGMHzidpblVd8zV1ULvi8JM2KARLtSnBRfBM3Sr
2tSQWEAtaVT7FbK2Q0uNSsHjeSm47CKXtsdmfwjpcPlfVTBlwH0UXsBNqaVfaISQSRMEshId0ElJ
mGGEhg8zRa2byqe7w6dj0KisswEzlCoLtIqRTusGMSQyYaqSZYGBOdS7J+7kEfMtSSx6ZeiEW9A8
gNhUOtw1qngJ4wXsXEHgQR47aBggVAUGTCrQJOy5zPHt5dS6tE7g4/W6jsKlJtfVw7ByvtVrjP0C
3FMNEwVZlnAAsGUeBx47+AHM9xu+laXhKvhxvxrquM53968sLtWaWCh2awV60CJ400rbVacOse3L
uURahwZ9MkHggxkGnHWF02svAqIN1Cni1hWHsfFzDeBwIV/FD09fCIwQ9loHbirewYHn1BRTv48y
TuPClaPh5+zo2cT1eh49DE6FDMRpOHnUe3BzGJMXV7jQYmoqLkJMi8tQ9R9w9gHGANDkQyHy6HZq
htmLCJ/YSFxskIZNlcUwSBwJRRRQ1HygzBhzQnHCIX67GZw+RVED8hSnjnvmSxMW0flHogj3dxA1
RDwtXbZvngmd3HxKxtcM8L0NUsQNdFIhoV2xiBBhBgSFBwDaMQayMy4U5iGnvus3OQ1GBAcyi4Yn
hVyA26g9Q2Q5lr1Ad68H4D2jgIkPWjRcPQ3o/aB1ifYQiPaDoF0Mg0DlAiWELXClcNofIMG4J3Ef
NnHi4TDfVaaLyhEEhoA8EbQ8gLnXpAwNaKfNFM/AA5L+UuAQtHTp5vUJc4C2EMNCpDNMEFRMCcEC
ELW8YFuVLCqQkY1RlGkoMTcrUNVphCQhYAwhMCzKFQdfedzt0uWan1g1lYq3okKWn6GsG7QmKxLA
6TExRhDmjwaIXgWWlCBElNyfaMgZt5vZGAfX1iKi9DjS9ucoGDlauQtaiJHMotlS5HiRyRseDHBD
WQhU0RqORrChXPx4DQ1lqJo98MQaHwZQs323KLguoKqtiZCJWjaucYFCMqoNwJjKtINuaXvV6oRN
1A0j3lsHzAtES5v8XP2PgT20iJdaARCUpEdZsdpg6x33BDeREJI8zJWRz5G2FiCI3AZ2wCG8Oh6L
dgjJxID3lUEFKS2hBX6Y6Y3/p9hw3Wz3KFtHVqmsL0lskChcXtEArGBLwbXEEFqXAZL1YFzGgQJC
Qx0zOIMAbXuFZrdtrnEzQMQBoHJL7jJGtC4zzQEmOA3OTKHIvO4zeS1Ase2aEDIoOeAmzWwBdjyA
rOrk6ghPe89xzDaZgp2MHLtipb3qET3HELdP/uScIEyr8W1bUNCtoibkCsfa+g1occ0Kd+DInwo1
Ug2bazgdw5vpAoVcgjoRoPWDMmnZAveE1D3E1Am9Hl6ApYSQLRldIu5IpwoSF4sisMA=
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to