# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: ../mainline/ # testament_sha1: dba25f72f7d4593480714a7f8f0b248e44b535d0 # timestamp: 2010-08-15 16:15:56 +0530 # base_revision_id: address@hidden # # Begin patch === modified file 'conf/tests.rmk' --- conf/tests.rmk 2010-06-13 04:18:47 +0000 +++ conf/tests.rmk 2010-08-15 06:32:33 +0000 @@ -83,6 +83,9 @@ check_SCRIPTS += grub_script_shift grub_script_shift_SOURCES = tests/grub_script_shift.in +check_SCRIPTS += grub_script_setparams +grub_script_setparams_SOURCES = tests/grub_script_setparams.in + # List of tests to execute on "make check" # SCRIPTED_TESTS = example_scripted_test # SCRIPTED_TESTS += example_grub_script_test @@ -103,6 +106,7 @@ SCRIPTED_TESTS += grub_script_break SCRIPTED_TESTS += grub_script_continue SCRIPTED_TESTS += grub_script_shift +SCRIPTED_TESTS += grub_script_setparams # 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-08-12 06:32:48 +0000 +++ include/grub/script_sh.h 2010-08-15 06:32:33 +0000 @@ -227,6 +227,7 @@ void grub_script_fini (void); void grub_script_argv_free (struct grub_script_argv *argv); +int grub_script_argv_make (struct grub_script_argv *argv, int argc, char **args); int grub_script_argv_next (struct grub_script_argv *argv); int grub_script_argv_append (struct grub_script_argv *argv, const char *s); int grub_script_argv_split_append (struct grub_script_argv *argv, char *s); @@ -321,6 +322,9 @@ /* SHIFT command for GRUB script. */ grub_err_t grub_script_shift (grub_command_t cmd, int argc, char *argv[]); +/* SETPARAMS command for GRUB script functions. */ +grub_err_t grub_script_setparams (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/argv.c' --- script/argv.c 2010-07-22 22:35:15 +0000 +++ script/argv.c 2010-08-15 06:32:33 +0000 @@ -57,6 +57,23 @@ argv->args = 0; } +/* Make argv from argc, args pair. */ +int +grub_script_argv_make (struct grub_script_argv *argv, int argc, char **args) +{ + int i; + struct grub_script_argv r = { 0, 0}; + + for (i = 0; i < argc; i++) + if (grub_script_argv_next (&r) || grub_script_argv_append (&r, args[i])) + { + grub_script_argv_free (&r); + return 1; + } + *argv = r; + return 0; +} + /* Prepare for next argc. */ int grub_script_argv_next (struct grub_script_argv *argv) === modified file 'script/execute.c' --- script/execute.c 2010-08-12 06:32:48 +0000 +++ script/execute.c 2010-08-15 06:32:33 +0000 @@ -34,13 +34,35 @@ static unsigned long active_loops; static unsigned long active_breaks; +#define GRUB_SCRIPT_SCOPE_MALLOCED 1 +#define GRUB_SCRIPT_SCOPE_ARGS_MALLOCED 2 + /* Scope for grub script functions. */ struct grub_script_scope { + unsigned flags; + unsigned shifts; struct grub_script_argv argv; }; static struct grub_script_scope *scope = 0; +static void +replace_scope (struct grub_script_scope *new_scope) +{ + if (scope) + { + scope->argv.argc += scope->shifts; + scope->argv.args -= scope->shifts; + + if (scope->flags & GRUB_SCRIPT_SCOPE_ARGS_MALLOCED) + grub_script_argv_free (&scope->argv); + + if (scope->flags & GRUB_SCRIPT_SCOPE_MALLOCED) + grub_free (scope); + } + scope = new_scope; +} + grub_err_t grub_script_break (grub_command_t cmd, int argc, char *argv[]) { @@ -85,11 +107,41 @@ if (n > scope->argv.argc) return GRUB_ERR_BAD_ARGUMENT; + scope->shifts += n; scope->argv.argc -= n; scope->argv.args += n; return GRUB_ERR_NONE; } +grub_err_t +grub_script_setparams (grub_command_t cmd __attribute__((unused)), + int argc, char **args) +{ + struct grub_script_scope *new_scope; + struct grub_script_argv argv = { 0, 0 }; + + if (! scope) + return GRUB_ERR_INVALID_COMMAND; + + new_scope = grub_malloc (sizeof (*new_scope)); + if (! new_scope) + return grub_errno; + + if (grub_script_argv_make (&argv, argc, args)) + { + grub_free (new_scope); + return grub_errno; + } + + new_scope->shifts = 0; + new_scope->argv = argv; + new_scope->flags = GRUB_SCRIPT_SCOPE_MALLOCED | + GRUB_SCRIPT_SCOPE_ARGS_MALLOCED; + + replace_scope (new_scope); + return GRUB_ERR_NONE; +} + static int grub_env_special (const char *name) { @@ -104,6 +156,7 @@ static char ** grub_script_env_get (const char *name, grub_script_arg_type_t type) { + unsigned i; struct grub_script_argv result = { 0, 0 }; if (grub_script_argv_next (&result)) @@ -138,8 +191,6 @@ } else if (grub_strcmp (name, "*") == 0) { - unsigned i; - for (i = 0; i < scope->argv.argc; i++) if (type == GRUB_SCRIPT_ARG_TYPE_VAR) { @@ -160,8 +211,6 @@ } else if (grub_strcmp (name, "@") == 0) { - unsigned i; - for (i = 0; i < scope->argv.argc; i++) { if (i != 0 && grub_script_argv_next (&result)) @@ -302,6 +351,8 @@ struct grub_script_scope new_scope; active_loops = 0; + new_scope.flags = 0; + new_scope.shifts = 0; new_scope.argv.argc = argc; new_scope.argv.args = args; @@ -311,7 +362,7 @@ ret = grub_script_execute (func->func); active_loops = loops; - scope = old_scope; + replace_scope (old_scope); /* free any scopes by setparams */ return ret; } === modified file 'script/main.c' --- script/main.c 2010-06-13 04:18:47 +0000 +++ script/main.c 2010-08-15 06:32:33 +0000 @@ -44,6 +44,7 @@ static grub_command_t cmd_break; static grub_command_t cmd_continue; static grub_command_t cmd_shift; +static grub_command_t cmd_setparams; void grub_script_init (void) @@ -54,6 +55,9 @@ N_("[n]"), N_("Continue loops")); cmd_shift = grub_register_command ("shift", grub_script_shift, N_("[n]"), N_("Shift positional parameters.")); + cmd_setparams = grub_register_command ("setparams", grub_script_setparams, + N_("[VALUE]..."), + N_("Set positional parameters.")); } void @@ -70,4 +74,8 @@ if (cmd_shift) grub_unregister_command (cmd_shift); cmd_shift = 0; + + if (cmd_setparams) + grub_unregister_command (cmd_setparams); + cmd_setparams = 0; } === added file 'tests/grub_script_setparams.in' --- tests/grub_script_setparams.in 1970-01-01 00:00:00 +0000 +++ tests/grub_script_setparams.in 2010-08-15 06:32:33 +0000 @@ -0,0 +1,59 @@ +#! @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 . + +if test x$grubshell = xyes; then cmd=setparams; else cmd=set; fi + +function f1 { + echo $# + echo "$#" + + echo $@ + echo "$@" + + echo $* + echo "$*" + + echo $1 $2 + for v in "$@"; do echo $v; done + shift + echo $1 $2 + for v in "$@"; do echo $v; done + + $cmd 1 2 3 4 + + echo $# + echo "$#" + + echo $@ + echo "$@" + + echo $* + echo "$*" + + echo $1 $2 + for v in "$@"; do echo $v; done + shift + echo $1 $2 + for v in "$@"; do echo $v; done +} +# f1 +# f1 a +f1 a b +f1 a b c +f1 a b c d +f1 a b c d e === modified file 'util/grub-script-check.c' --- util/grub-script-check.c 2010-08-12 06:32:48 +0000 +++ util/grub-script-check.c 2010-08-15 06:32:33 +0000 @@ -73,6 +73,14 @@ return 0; } +grub_err_t +grub_script_setparams (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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 RThQkC01wRM=