# 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 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=