# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: file:///home/bvk/Work/grub2/menuentry/ # testament_sha1: 862b2698d619506951ac7a78f65715fc3d466e08 # timestamp: 2010-08-04 19:23:14 +0530 # base_revision_id: address@hidden # # Begin patch === modified file 'commands/regexp.c' --- commands/regexp.c 2010-05-01 18:28:07 +0000 +++ commands/regexp.c 2010-08-04 05:38:26 +0000 @@ -20,37 +20,103 @@ #include #include #include -#include +#include +#include +#include #include #include -static grub_err_t -grub_cmd_regexp (grub_command_t cmd __attribute__ ((unused)), - int argc, char **args) +static const struct grub_arg_option options[] = + { + { "set", 's', GRUB_ARG_OPTION_REPEATABLE, + N_("Variable names to update with matches."), + N_("[NUMBER:]VARNAME"), ARG_TYPE_STRING }, + { 0, 0, 0, 0, 0, 0 } + }; + +static grub_err_t +set_matches (char **varnames, char *str, grub_size_t nmatches, + regmatch_t *matches) +{ + int i; + char ch; + char *p; + char *q; + grub_err_t err; + unsigned long j; + + auto void setvar (char *v, regmatch_t *m); + void setvar (char *v, regmatch_t *m) + { + ch = str[m->rm_eo]; + str[m->rm_eo] = '\0'; + err = grub_env_set (v, str + m->rm_so); + str[m->rm_eo] = ch; + } + + for (i = 0; varnames && varnames[i]; i++) + { + if (! (p = grub_strchr (varnames[i], ':'))) + { + /* varname w/o index defaults to 1 */ + if (nmatches < 2 || matches[1].rm_so == -1) + grub_env_unset (varnames[i]); + else + setvar (varnames[i], &matches[1]); + } + else + { + j = grub_strtoul (varnames[i], &q, 10); + if (q != p) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "invalid variable name format %s", varnames[i]); + + if (nmatches <= j || matches[j].rm_so == -1) + grub_env_unset (p + 1); + else + setvar (p + 1, &matches[j]); + } + + if (err != GRUB_ERR_NONE) + return err; + } + return GRUB_ERR_NONE; +} + +static grub_err_t +grub_cmd_regexp (grub_extcmd_context_t ctxt, int argc, char **args) { int argn = 0; - int matches = 0; regex_t regex; int ret; grub_size_t s; char *comperr; grub_err_t err; + regmatch_t *matches = 0; if (argc != 2) return grub_error (GRUB_ERR_BAD_ARGUMENT, "2 arguments expected"); - ret = regcomp (®ex, args[0], RE_SYNTAX_GNU_AWK); + ret = regcomp (®ex, args[0], REG_EXTENDED); if (ret) goto fail; - ret = regexec (®ex, args[1], 0, 0, 0); + matches = grub_zalloc (sizeof (*matches) * (regex.re_nsub + 1)); + if (! matches) + goto fail; + + ret = regexec (®ex, args[1], regex.re_nsub + 1, matches, 0); if (!ret) { + err = set_matches (ctxt->state[0].args, args[1], + regex.re_nsub + 1, matches); regfree (®ex); - return GRUB_ERR_NONE; + grub_free (matches); + return err; } fail: + grub_free (matches); s = regerror (ret, ®ex, 0, 0); comperr = grub_malloc (s); if (!comperr) @@ -65,16 +131,16 @@ return err; } -static grub_command_t cmd; +static grub_extcmd_t cmd; GRUB_MOD_INIT(regexp) { - cmd = grub_register_command ("regexp", grub_cmd_regexp, - N_("REGEXP STRING"), - N_("Test if REGEXP matches STRING.")); + cmd = grub_register_extcmd ("regexp", grub_cmd_regexp, + GRUB_COMMAND_FLAG_BOTH, N_("REGEXP STRING"), + N_("Test if REGEXP matches STRING."), options); } GRUB_MOD_FINI(regexp) { - grub_unregister_command (cmd); + grub_unregister_extcmd (cmd); } === modified file 'conf/tests.rmk' --- conf/tests.rmk 2010-05-05 09:17:50 +0000 +++ conf/tests.rmk 2010-08-04 13:51:18 +0000 @@ -74,6 +74,9 @@ check_SCRIPTS += grub_script_functions grub_script_functions_SOURCES = tests/grub_script_functions.in +check_SCRIPTS += regexp_vars +regexp_vars_SOURCES = tests/regexp_vars.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 += regexp_vars # dependencies between tests and testing-tools $(SCRIPTED_TESTS): grub-shell grub-shell-tester === added file 'tests/regexp_vars.in' --- tests/regexp_vars.in 1970-01-01 00:00:00 +0000 +++ tests/regexp_vars.in 2010-08-04 13:51:18 +0000 @@ -0,0 +1,41 @@ +#! /bin/bash -e + +# 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 . + +cmd='regexp -s version "vm-(.*)" vm-1.2.3; echo $version' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != 1.2.3; then echo "error: $cmd" >&2; exit 1; fi + +cmd='regexp -s 1:version "vm-(.*)" vm-1.2.3; echo $version' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != 1.2.3; then echo "error: $cmd" >&2; exit 1; fi + +cmd='regexp -s 0:match "vm-(.*)" vm-1.2.3; echo $match' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != vm-1.2.3; then echo "error: $cmd" >&2; exit 1; fi + +cmd='regexp -s 2:match "vm-(.*)" vm-1.2.3; echo $match' +v=`echo "$cmd" | @builddir@/grub-shell` +if test -n "$v"; then echo "error: $cmd" >&2; exit 1; fi + +cmd='regexp -s match "\\\((.*)\\\)" (hd0,msdos1); echo $match' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != "hd0,msdos1"; then echo "error: $cmd" >&2; exit 1; fi + +cmd='regexp -s match "hd([0-9]+)" hd0; echo $match' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != "0"; then echo "error: $cmd" >&2; exit 1; fi # Begin bundle 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