# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: file:///home/bvk/Work/grub2/lexer-rewrite/ # testament_sha1: d2a268ca298ac4a46b2a7ee8f2cd6a3a59d3b4ed # timestamp: 2010-01-24 10:08:53 +0530 # base_revision_id: address@hidden # 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 + + 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 GRUB_PARSER_TOKEN_WORD "word" %type word argument arguments0 arguments1 -%type script_init script grubcmd ifcmd command +%type script_init script grubcmd ifcmd forcmd command %type 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=