From: BVK Chaitanya Date: Sat, 4 Sep 2010 06:19:02 +0000 (+0530) Subject: merge with mainline X-Git-Tag: 1.99~593^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6d7c073bc87c5c86b8f38d23d43fb041fdb77105;p=thirdparty%2Fgrub.git merge with mainline --- 6d7c073bc87c5c86b8f38d23d43fb041fdb77105 diff --cc Makefile.util.def index ca092a581,6dfd9301d..31985811c --- a/Makefile.util.def +++ b/Makefile.util.def @@@ -496,12 -501,12 +501,18 @@@ script = common = tests/grub_script_shift.in; }; + script = { + testcase; + name = grub_script_blockarg; + common = tests/grub_script_blockarg.in; + }; + +script = { + testcase; + name = grub_script_expansion; + common = tests/grub_script_expansion.in; +}; + program = { testcase; name = example_unit_test; diff --cc grub-core/script/execute.c index 056110fd5,743b315eb..e6be1fa31 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c @@@ -225,30 -223,8 +226,30 @@@ grub_script_arglist_to_argv (struct gru int i; char **values = 0; struct grub_script_arg *arg = 0; - struct grub_script_argv result = { 0, 0 }; + struct grub_script_argv result = { 0, 0, 0 }; + auto int append (char *s, int escape_type); + int append (char *s, int escape_type) + { + int r; + char *p = 0; + + if (! grub_wildcard_translator || escape_type == 0) + return grub_script_argv_append (&result, s); + + if (escape_type > 0) + p = grub_wildcard_translator->escape (s); + else if (escape_type < 0) + p = grub_wildcard_translator->unescape (s); + + if (! p) + return 1; + + r = grub_script_argv_append (&result, p); + grub_free (p); + return r; + } + for (; arglist && arglist->arg; arglist = arglist->next) { if (grub_script_argv_next (&result)) diff --cc include/grub/script_sh.h index e33739b41,7952fff9b..98c4b85fc --- a/include/grub/script_sh.h +++ b/include/grub/script_sh.h @@@ -69,18 -78,9 +78,19 @@@ struct grub_script_arg { unsigned argc; char **args; + struct grub_script *script; }; +/* Pluggable wildcard translator. */ +struct grub_script_wildcard_translator +{ + char *(*escape) (const char *str); + char *(*unescape) (const char *str); + grub_err_t (*expand) (const char *str, char ***expansions); +}; +extern struct grub_script_wildcard_translator *grub_wildcard_translator; - extern struct grub_script_wildcard_translator *grub_filename_translator; ++extern struct grub_script_wildcard_translator grub_filename_translator; + /* A complete argument. It consists of a list of one or more `struct grub_script_arg's. */ struct grub_script_arglist