Sam Steingold <[EMAIL PROTECTED]> writes:

> the latest and greatest gnulib regexp has the following regressions vs
> the previous (monolithic) version:

Sorry, I didn't understand the notation that you used in
<http://lists.gnu.org/archive/html/bug-gnulib/2005-08/msg00008.html>.

I tried to reproduce the problems by writing a C program (enclosed
below) and it seems to me that the gnulib regexp is correct in all
these test cases.  Perhaps the old regexp was broken.

Here is the output of the C program:

pattern='(^)*' string='-' result='' result[1]='' OK
pattern='([xyz])(-\2)' string='x-y' error Invalid back reference OK
pattern='((.*)\1)+' string='xxxxxx' error Invalid back reference OK
pattern='(.*)*\1' string='xx' result='xx' result[1]='x' OK
pattern='(a*)*' string='aaaa' result='aaaa' result[1]='aaaa' OK
pattern='(a*)+' string='aaaa' result='aaaa' result[1]='aaaa' OK

and here is the C program itself:

#include <sys/types.h>
#include <regex.h>
#include <stdio.h>

struct test
{
  char const *pattern;
  char const *string;
  regoff_t offset;
  regoff_t length;
};

static int
attempt (struct test t)
{
  regex_t r;
  int e;
  regmatch_t match[100];
  int ok;

  printf ("pattern='%s' string='%s' ", t.pattern, t.string);
  e = regcomp (&r, t.pattern, REG_EXTENDED);
  if (e)
    {
      char buf[1000];
      regerror (e, &r, buf, sizeof buf);
      printf ("error %s ", buf);
      ok = (t.offset == (regoff_t) -1);
    }
  else if (regexec (&r, t.string, r.re_nsub + 1, match, 0) == 0)
    {
      int i;
      printf ("result='%.*s' ",
              (int) (match[0].rm_eo - match[0].rm_so),
              t.string + match[0].rm_so);
      ok = (match[0].rm_so == t.offset
            && match[0].rm_eo - match[0].rm_so == t.length);
      for (i = 1; i <= r.re_nsub; i++)
        {
          printf ("result[%d]='%.*s' ",
                  i,
                  (int) (match[i].rm_eo - match[i].rm_so),
                  t.string + match[i].rm_so);
        }
    }
  else
    {
      printf ("did not match ");
      ok = (match[0].rm_so == (regoff_t) -1);
    }

  if (ok)
    printf ("OK\n");
  else
    printf ("NO GOOD\n");

  return !ok;
}

static struct test const test[] =
  {
    { "(^)*", "-", 0, 0 },
    { "([xyz])(-\\2)", "x-y", -1, -1 },
    { "((.*)\\1)+", "xxxxxx", -1, -1 },
    { "(.*)*\\1", "xx", 0, 2 },
    { "(a*)*", "aaaa", 0, 4 },
    { "(a*)+", "aaaa", 0, 4 }
  };

int
main (void)
{
  int status = 0;
  size_t i;

  for (i = 0; i < sizeof test / sizeof test[0]; i++)
    status |= attempt (test[i]);

  return status;
}


_______________________________________________
bug-gnulib mailing list
bug-gnulib@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-gnulib

Reply via email to