Hi
Attached patch adds new command, setparams to set positional parameter
values in a function scope. It is equivalent to bash's set command
with arguments.
bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: b...@dbook-20100815063233-x4dura6g3hntvcpd
# target_branch: ../mainline/
# testament_sha1: dba25f72f7d4593480714a7f8f0b248e44b535d0
# timestamp: 2010-08-15 16:15:56 +0530
# base_revision_id: b...@dbook-20100812152242-6cxnb4ed5gbzni0q
#
# 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 <http://www.gnu.org/licenses/>.
+
+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=
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel