diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-11-12 09:45:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-11-12 09:45:05 +0000 |
commit | 7db612081aa9c2d0b7e6205582a80aa2e9342f8f (patch) | |
tree | d904731f71b778954e15e6a7ba7bb9dbdf0bc4c9 /posix/bug-regex24.c | |
parent | ccd8de9aa69df004a3df02333fb01f4eaf990d92 (diff) | |
download | glibc-7db612081aa9c2d0b7e6205582a80aa2e9342f8f.zip glibc-7db612081aa9c2d0b7e6205582a80aa2e9342f8f.tar.gz glibc-7db612081aa9c2d0b7e6205582a80aa2e9342f8f.tar.bz2 |
2004-11-12 Ulrich Drepper <drepper@redhat.com>
* posix/Makefile (tests): Add bug-regex24.
* posix/bug-regex24.c: New file.
2004-11-12 Paolo Bonzini <bonzini@gnu.org>
* posix/regexec.c (check_dst_limits_calc_pos_1): Use the map to
cut recursive paths. Make exit condition more precise.
(match_ctx_add_entry): Initialize the map.
* posix/regex_internal.h (struct re_backref_cache_entry): Add a map of
reachable subexpression nodes from each backreference cache entry.
Diffstat (limited to 'posix/bug-regex24.c')
-rw-r--r-- | posix/bug-regex24.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/posix/bug-regex24.c b/posix/bug-regex24.c new file mode 100644 index 0000000..83ea10b --- /dev/null +++ b/posix/bug-regex24.c @@ -0,0 +1,59 @@ +#include <regex.h> +#include <stdio.h> + +#define str "civic" + +#define N 10 +static const char *expected[N] = + { + str, "c", "i", "", "", "", "", "", "", "" + }; + +static int +do_test (void) +{ + regex_t rbuf; + static const char pat[] = "\ +^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$"; + + int err = regcomp (&rbuf, pat, REG_EXTENDED); + if (err != 0) + { + char errstr[300]; + regerror (err, &rbuf, errstr, sizeof (errstr)); + puts (errstr); + return err; + } + + regmatch_t m[N]; + err = regexec (&rbuf, str, N, m, 0); + if (err != 0) + { + puts ("regexec failed"); + return 1; + } + + int result = 0; + for (int i = 0; i < N; ++i) + if (m[i].rm_so == -1) + { + printf ("m[%d] unused\n", i); + result = 1; + } + else + { + int len = m[i].rm_eo - m[i].rm_so; + + printf ("m[%d] = \"%.*s\"\n", i, len, str + m[i].rm_so); + + if (strlen (expected[i]) != len + || memcmp (expected[i], str + m[i].rm_so, len) != 0) + result = 1; + } + + return result; +} + +#define TIMEOUT 30 +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |