# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: file:///home/bvk/Work/grub2/for-loop/
# testament_sha1: 765eb235c266725c213c934ee0086cdd9cac5e53
# timestamp: 2010-01-26 09:40:09 +0530
# base_revision_id: address@hidden
# 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
+
+ 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 GRUB_PARSER_TOKEN_WORD "word"
%type word argument arguments0 arguments1
-%type script_init script grubcmd ifcmd forcmd command
-%type commands1 menuentry statement
+%type script_init script
+%type grubcmd ifcmd forcmd whilecmd untilcmd
+%type 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
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