This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] Testcase for another regex bug
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Ulrich Drepper <drepper at redhat dot com>, Isamu Hasegawa <isamu at yamato dot ibm dot com>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Wed, 11 Sep 2002 18:10:09 +0200
- Subject: [PATCH] Testcase for another regex bug
- References: <200209110022.UAA28671@bromo.msbb.uc.edu> <3D7E8DDC.2050505@redhat.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Tue, Sep 10, 2002 at 05:27:08PM -0700, Ulrich Drepper wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Jack Howarth wrote:
> > Ulrich,
> > While the new patch fixes bug-regex11.c, it doesn't seem to fix
> > the make check failure in sed 3.02 when built with..
>
> Then come up with a new test case.
Here it is. tests[2] fails to match.
2002-09-11 Jakub Jelinek <jakub@redhat.com>
* posix/bug-regex11.c (tests): New array.
(main): Rewritten to run more different tests.
--- libc/posix/bug-regex11.c.jj 2002-09-04 18:21:24.000000000 +0200
+++ libc/posix/bug-regex11.c 2002-09-11 18:05:56.000000000 +0200
@@ -1,4 +1,4 @@
-/* Test for newline handling in regex.
+/* Regular expression tests.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@@ -24,37 +24,65 @@
#include <stdio.h>
#include <stdlib.h>
+struct
+{
+ const char *pattern;
+ const char *string;
+ int nmatch;
+ regmatch_t rm[4];
+} tests[] = {
+ /* Test for newline handling in regex. */
+ { "[^~]*~", "\nx~y", 2, { { 0, 3 }, { -1, -1 } } },
+ /* Other tests. */
+ { ".*|\\([KIO]\\)\\([^|]*\\).*|?[KIO]", "10~.~|P|K0|I10|O16|?KSb", 3,
+ { { 0, 21 }, { 15, 16 }, { 16, 18 } } },
+ { ".*|\\([KIO]\\)\\([^|]*\\).*|?\\1", "10~.~|P|K0|I10|O16|?KSb", 3,
+ { { 0, 21 }, { 8, 9 }, { 9, 10 } } }
+};
+
int
main (void)
{
regex_t re;
- regmatch_t rm[2];
- int n;
+ regmatch_t rm[4];
+ int n, i, ret = 0;
mtrace ();
- n = regcomp (&re, "[^~]*~", 0);
- if (n != 0)
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
{
- char buf[500];
- regerror (n, &re, buf, sizeof (buf));
- printf ("regcomp failed: %s\n", buf);
- exit (1);
- }
+ n = regcomp (&re, tests[i].pattern, 0);
+ if (n != 0)
+ {
+ char buf[500];
+ regerror (n, &re, buf, sizeof (buf));
+ printf ("regcomp %d failed: %s\n", i, buf);
+ ret = 1;
+ continue;
+ }
+
+ if (regexec (&re, tests[i].string, tests[i].nmatch, rm, 0))
+ {
+ printf ("regexec %d failed\n", i);
+ ret = 1;
+ regfree (&re);
+ continue;
+ }
+
+ for (n = 0; n < tests[i].nmatch; ++n)
+ if (rm[n].rm_so != tests[i].rm[n].rm_so
+ || rm[n].rm_eo != tests[i].rm[n].rm_eo)
+ {
+ if (tests[i].rm[n].rm_so == -1 && tests[i].rm[n].rm_eo == -1)
+ break;
+ printf ("regexec match failure rm[%d] %d..%d\n",
+ n, rm[n].rm_so, rm[n].rm_eo);
+ ret = 1;
+ break;
+ }
- if (regexec (&re, "\nx~y", 2, rm, 0))
- {
- puts ("regexec failed");
- exit (2);
+ regfree (&re);
}
- if (rm[0].rm_so != 0 || rm[0].rm_eo != 3)
- {
- printf ("regexec match failure: %d %d\n",
- rm[0].rm_so, rm[0].rm_eo);
- exit (3);
- }
-
- regfree (&re);
return 0;
}
Jakub