1#include <regex.h>
2#include <stdio.h>
3#include <string.h>
4
5#define str "civic"
6
7#define N 10
8static const char *expected[N] =
9 {
10 str, "c", "i", "", "", "", "", "", "", ""
11 };
12
13static int
14do_test (void)
15{
16 regex_t rbuf;
17 static const char pat[] = "\
18^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$";
19
20 int err = regcomp (preg: &rbuf, pattern: pat, REG_EXTENDED);
21 if (err != 0)
22 {
23 char errstr[300];
24 regerror (errcode: err, preg: &rbuf, errbuf: errstr, errbuf_size: sizeof (errstr));
25 puts (s: errstr);
26 return err;
27 }
28
29 regmatch_t m[N];
30 err = regexec (preg: &rbuf, str, N, pmatch: m, eflags: 0);
31 if (err != 0)
32 {
33 puts (s: "regexec failed");
34 return 1;
35 }
36
37 int result = 0;
38 for (int i = 0; i < N; ++i)
39 if (m[i].rm_so == -1)
40 {
41 printf (format: "m[%d] unused\n", i);
42 result = 1;
43 }
44 else
45 {
46 int len = m[i].rm_eo - m[i].rm_so;
47
48 printf (format: "m[%d] = \"%.*s\"\n", i, len, str + m[i].rm_so);
49
50 if (strlen (expected[i]) != len
51 || memcmp (expected[i], str + m[i].rm_so, len) != 0)
52 result = 1;
53 }
54
55 return result;
56}
57
58#define TIMEOUT 30
59#define TEST_FUNCTION do_test ()
60#include "../test-skeleton.c"
61

source code of glibc/posix/bug-regex24.c