Hi,
Attached patch adds support for updating environment variables with sub-strings that matched as per the regular expression groups. For this, regexp command now has a new option "-s [NUMBER:]NAME" that can be repeated multiple number of times. The NUMBER field is the index of groups used in the regular expression. These group indexes are counted from 1, and zero can be used for complete match. Also, when NUMBER: is omitted it defaults to first group. Some examples are given below: regexp -s version /boot/vmlinuz-(.*) /boot/vmlinuz-2.6.26; echo $version OUTPUTS: 2.6.26 regexp -s 1:basename -s 2:version /boot/(vmlinuz-(.*)) /boot/vmlinuz-2.6.26; echo $basename $version OUTPUTS: vmlinuz-2.6.26 2.6.26 regexp -s 0:match -s 1:basename -s 2:version (vmlinuz-(.*)) /boot/vmlinuz-2.6.26; echo $match $basename $version OUTPUTS: vmlinuz-2.6.26 vmlinuz-2.6.26 2.6.26 regards, bvk.chaitanya
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: b...@dbook-20100804135307-abjlm3brfkdm907y # target_branch: file:///home/bvk/Work/grub2/menuentry/ # testament_sha1: 862b2698d619506951ac7a78f65715fc3d466e08 # timestamp: 2010-08-04 19:23:14 +0530 # base_revision_id: b...@dbook-20100804135240-wulkpobgmcojr9tr # # 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 <grub/dl.h> #include <grub/misc.h> #include <grub/mm.h> -#include <grub/command.h> +#include <grub/err.h> +#include <grub/env.h> +#include <grub/extcmd.h> #include <grub/i18n.h> #include <regex.h> -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 <http://www.gnu.org/licenses/>. + +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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
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel