regexp sets matches to $match*

This commit is contained in:
BVK Chaitanya 2010-08-03 16:33:36 +05:30
parent c9f7ff97cf
commit 262b2d73c7

View file

@ -20,6 +20,8 @@
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/err.h>
#include <grub/env.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#include <regex.h> #include <regex.h>
@ -29,28 +31,50 @@ grub_cmd_regexp (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args) int argc, char **args)
{ {
int argn = 0; int argn = 0;
int matches = 0;
regex_t regex; regex_t regex;
int ret; int ret;
grub_size_t s; grub_size_t s;
char *comperr; char *comperr;
grub_err_t err; grub_err_t err;
regmatch_t *matches = 0;
if (argc != 2) if (argc != 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "2 arguments expected"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "2 arguments expected");
ret = regcomp (&regex, args[0], RE_SYNTAX_GNU_AWK); ret = regcomp (&regex, args[0], REG_EXTENDED);
if (ret) if (ret)
goto fail; goto fail;
ret = regexec (&regex, args[1], 0, 0, 0); matches = grub_zalloc (sizeof (*matches) * (regex.re_nsub + 1));
if (! matches)
goto fail;
ret = regexec (&regex, args[1], regex.re_nsub + 1, matches, 0);
if (!ret) 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 (&regex); regfree (&regex);
grub_free (matches);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
fail: fail:
grub_free (matches);
s = regerror (ret, &regex, 0, 0); s = regerror (ret, &regex, 0, 0);
comperr = grub_malloc (s); comperr = grub_malloc (s);
if (!comperr) if (!comperr)