From 262b2d73c73f0f9b4b2e9d0a9a32c1ea36ab118b Mon Sep 17 00:00:00 2001 From: BVK Chaitanya Date: Tue, 3 Aug 2010 16:33:36 +0530 Subject: [PATCH] regexp sets matches to $match* --- commands/regexp.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/commands/regexp.c b/commands/regexp.c index e8e8243b5..2e84c3b0d 100644 --- a/commands/regexp.c +++ b/commands/regexp.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include #include @@ -29,28 +31,50 @@ grub_cmd_regexp (grub_command_t cmd __attribute__ ((unused)), 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) { + int i; + char ch; + char buf[5 + sizeof (size_t) * 3]; + + for (i = 0; i <= regex.re_nsub && matches[i].rm_so != -1; i++) + { + ch = args[1][matches[i].rm_eo]; + args[1][matches[i].rm_eo] = '\0'; + + grub_snprintf (buf, sizeof (buf), "%s%u", "match", i); + if (grub_env_set (buf, args[1] + matches[i].rm_so)) + break; + + args[1][matches[i].rm_eo] = ch; + } + regfree (®ex); + grub_free (matches); return GRUB_ERR_NONE; } fail: + grub_free (matches); s = regerror (ret, ®ex, 0, 0); comperr = grub_malloc (s); if (!comperr)