# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: ../cmdlist/ # testament_sha1: fcbd7e7ab663a4edf0114e8dc1fbc33fb006c78e # timestamp: 2010-05-18 22:46:20 +0530 # base_revision_id: address@hidden # en6z2k5s1ux46lg3 # # Begin patch === modified file 'conf/common.rmk' --- conf/common.rmk 2010-05-12 04:49:12 +0000 +++ conf/common.rmk 2010-05-12 12:05:07 +0000 @@ -106,7 +106,7 @@ grub_script_check_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c \ util/grub-script-check.c util/misc.c util/mm.c \ script/main.c script/script.c script/function.c script/lexer.c \ - kern/handler.c kern/err.c kern/parser.c kern/list.c \ + kern/handler.c kern/err.c kern/parser.c kern/list.c kern/command.c \ kern/misc.c kern/env.c grub_script_check_init.c grub_script.tab.c \ grub_script.yy.c grub_script_check_CFLAGS = $(GNULIB_UTIL_CFLAGS) === modified file 'conf/tests.rmk' --- conf/tests.rmk 2010-05-05 09:17:50 +0000 +++ conf/tests.rmk 2010-05-07 04:38:09 +0000 @@ -74,6 +74,9 @@ check_SCRIPTS += grub_script_functions grub_script_functions_SOURCES = tests/grub_script_functions.in +check_SCRIPTS += grub_script_shift +grub_script_shift_SOURCES = tests/grub_script_shift.in + # List of tests to execute on "make check" # SCRIPTED_TESTS = example_scripted_test # SCRIPTED_TESTS += example_grub_script_test @@ -91,6 +94,7 @@ SCRIPTED_TESTS += grub_script_dollar SCRIPTED_TESTS += grub_script_comments SCRIPTED_TESTS += grub_script_functions +SCRIPTED_TESTS += grub_script_shift # 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-05-12 04:49:12 +0000 +++ include/grub/script_sh.h 2010-05-12 12:05:07 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include struct grub_script_mem; @@ -66,7 +67,7 @@ /* An argument vector. */ struct grub_script_argv { - int argc; + unsigned argc; char **args; }; @@ -311,6 +312,9 @@ /* Execute any GRUB pre-parsed command or script. */ grub_err_t grub_script_execute (struct grub_script *script); +/* SHIFT command for GRUB script. */ +grub_err_t grub_script_cmd_shift (grub_command_t cmd, int argc, char *argv[]); + /* This variable points to the parsed command. This is used to communicate with the bison code. */ extern struct grub_script_cmd *grub_script_parsed; === modified file 'script/execute.c' --- script/execute.c 2010-05-12 07:42:49 +0000 +++ script/execute.c 2010-05-12 12:13:49 +0000 @@ -37,6 +37,37 @@ }; static struct grub_script_scope *scope = 0; +grub_err_t +grub_script_cmd_shift (grub_command_t cmd __attribute__((unused)), + int argc, char *argv[]) +{ + char *p = 0; + unsigned long n = 0; + + if (! scope) + return GRUB_ERR_NONE; + + if (argc == 0) + n = 1; + + else if (argc > 1) + return GRUB_ERR_BAD_ARGUMENT; + + else + { + n = grub_strtoul (argv[0], &p, 10); + if (*p != '\0') + return GRUB_ERR_BAD_ARGUMENT; + } + + if (n > scope->argv.argc) + return GRUB_ERR_BAD_ARGUMENT; + + scope->argv.argc -= n; + scope->argv.args += n; + return GRUB_ERR_NONE; +} + static int grub_env_special (const char *name) { @@ -77,7 +108,7 @@ } else if (grub_strcmp (name, "*") == 0) { - int i; + unsigned i; for (i = 0; ! errors && i < scope->argv.argc; i++) if (type == GRUB_SCRIPT_ARG_TYPE_VAR) @@ -97,7 +128,7 @@ } else if (grub_strcmp (name, "@") == 0) { - int i; + unsigned i; for (i = 0; ! errors && i < scope->argv.argc; i++) { @@ -285,7 +316,7 @@ grub_free (assign); grub_snprintf (errnobuf, sizeof (errnobuf), "%d", grub_errno); - grub_env_set ("?", errnobuf); + grub_script_env_set ("?", errnobuf); grub_print_error (); @@ -353,7 +384,7 @@ grub_err_t grub_script_execute_cmdfor (struct grub_script_cmd *cmd) { - int i; + unsigned i; int result; struct grub_script_argv argv; struct grub_script_cmdfor *cmdfor = (struct grub_script_cmdfor *) cmd; === modified file 'script/main.c' --- script/main.c 2009-11-23 15:37:33 +0000 +++ script/main.c 2010-05-07 04:38:09 +0000 @@ -17,6 +17,7 @@ */ #include +#include #include #include @@ -49,6 +50,8 @@ GRUB_MOD_INIT(sh) { grub_parser_register ("grub", &grub_sh_parser); + grub_register_command ("shift", grub_script_cmd_shift, + N_("[n]"), N_("Shift positional parameters.")); } GRUB_MOD_FINI(sh) === added file 'tests/grub_script_shift.in' --- tests/grub_script_shift.in 1970-01-01 00:00:00 +0000 +++ tests/grub_script_shift.in 2010-05-12 12:16:49 +0000 @@ -0,0 +1,85 @@ +#! @builddir@/grub-shell-tester + +# Run GRUB script in a Qemu instance +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +function f1 { + echo f1 '$@' $@ + echo f1 '$*' $* + echo f1 $# $1 $2 $3 + shift + echo f1 '$@' $@ + echo f1 '$*' $* + echo f1 $# $1 $2 $3 +} + +f1 +f1 a +f1 a b +f1 a b c +f1 a b c d +f1 a b c d e + +function f2 { + echo f1 '$@' $@ + echo f1 '$*' $* + echo f2 $# $1 $2 $3 + shift 1 + echo f1 '$@' $@ + echo f1 '$*' $* + echo f2 $# $1 $2 $3 +} + +f2 +f2 a +f2 a b +f2 a b c +f2 a b c d +f2 a b c d e + +function f3 { + echo f1 '$@' $@ + echo f1 '$*' $* + echo f3 $# $1 $2 $3 + shift 3 + echo f1 '$@' $@ + echo f1 '$*' $* + echo f3 $# $1 $2 $3 +} + +f3 +f3 a +f3 a b +f3 a b c +f3 a b c d +f3 a b c d e + +function f4 { + echo f1 '$@' $@ + echo f1 '$*' $* + echo f4 $# $1 $2 $3 + shift 100 + echo f1 '$@' $@ + echo f1 '$*' $* + echo f4 $# $1 $2 $3 +} + +f4 +f4 a +f4 a b +f4 a b c +f4 a b c d +f4 a b c d e === modified file 'util/grub-script-check.c' --- util/grub-script-check.c 2010-05-05 08:35:06 +0000 +++ util/grub-script-check.c 2010-05-07 04:38:09 +0000 @@ -57,6 +57,14 @@ fflush (stdout); } +grub_err_t +grub_script_cmd_shift (grub_command_t cmd __attribute__((unused)), + int argc __attribute__((unused)), + char *argv[] __attribute__((unused))) +{ + return 0; +} + char * grub_script_execute_argument_to_string (struct grub_script_arg *arg __attribute__ ((unused))) { # Begin bundle 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 vgA=