1/* Regular expression tests.
2 Copyright (C) 2002-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <sys/types.h>
20#include <mcheck.h>
21#include <regex.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26static struct
27{
28 int syntax;
29 const char *pattern;
30 const char *string;
31 int start;
32} tests[] = {
33 {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "1", -1}, /* It should not match. */
34 {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "-", 0}, /* It should match. */
35 {RE_SYNTAX_POSIX_BASIC, "s1\n.*\ns3", "s1\ns2\ns3", 0},
36 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "ac", 0},
37 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abc", -1},
38 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abbc", -1},
39 /* Nested duplication. */
40 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "ac", -1},
41 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abc", 0},
42 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abbc", -1},
43 {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "ac", -1},
44 {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbc", -1},
45 {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbc", 0},
46 {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbbc", -1},
47 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "ac", 0},
48 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abc", -1},
49 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abbc", -1},
50 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "ac", 0},
51 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abc", -1},
52 {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abbc", -1},
53 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "ac", 0},
54 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abc", -1},
55 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abbc", -1},
56 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "ac", 0},
57 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abc", -1},
58 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abbc", -1},
59 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "ac", 0},
60 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abc", -1},
61 {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abbc", -1},
62};
63
64int
65main (void)
66{
67 struct re_pattern_buffer regbuf;
68 const char *err;
69 size_t i;
70 int ret = 0;
71
72 mtrace ();
73
74 for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
75 {
76 int start;
77 re_set_syntax (syntax: tests[i].syntax);
78 memset (&regbuf, '\0', sizeof (regbuf));
79 err = re_compile_pattern (pattern: tests[i].pattern, length: strlen (tests[i].pattern),
80 buffer: &regbuf);
81 if (err != NULL)
82 {
83 printf (format: "re_compile_pattern failed: %s\n", err);
84 ret = 1;
85 continue;
86 }
87
88 start = re_search (buffer: &regbuf, String: tests[i].string, length: strlen (tests[i].string),
89 start: 0, range: strlen (tests[i].string), NULL);
90 if (start != tests[i].start)
91 {
92 printf (format: "re_search failed %d\n", start);
93 ret = 1;
94 regfree (preg: &regbuf);
95 continue;
96 }
97 regfree (preg: &regbuf);
98 }
99
100 return ret;
101}
102

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