regexp sets matches to $match*
This commit is contained in:
parent
c9f7ff97cf
commit
262b2d73c7
1 changed files with 27 additions and 3 deletions
|
@ -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 (®ex, args[0], RE_SYNTAX_GNU_AWK);
|
ret = regcomp (®ex, args[0], REG_EXTENDED);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
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)
|
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);
|
regfree (®ex);
|
||||||
|
grub_free (matches);
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
grub_free (matches);
|
||||||
s = regerror (ret, ®ex, 0, 0);
|
s = regerror (ret, ®ex, 0, 0);
|
||||||
comperr = grub_malloc (s);
|
comperr = grub_malloc (s);
|
||||||
if (!comperr)
|
if (!comperr)
|
||||||
|
|
Loading…
Reference in a new issue