1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <regex>
10
11 // class match_results<BidirectionalIterator, Allocator>
12
13 // template <class OutputIter>
14 // OutputIter
15 // format(OutputIter out, const char_type* fmt_first, const char_type* fmt_last,
16 // regex_constants::match_flag_type flags = regex_constants::format_default) const;
17
18 #include <regex>
19 #include <cassert>
20
21 #include "test_macros.h"
22 #include "test_iterators.h"
23
main(int,char **)24 int main(int, char**)
25 {
26 {
27 std::match_results<const char*> m;
28 const char s[] = "abcdefghijk";
29 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
30
31 char out[100] = {0};
32 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
33 auto r = m.format(cpp17_output_iterator<char*>(out),
34 fmt, fmt + std::char_traits<char>::length(fmt));
35 assert(base(r) == out + 58);
36 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");
37 }
38 {
39 std::match_results<const char*> m;
40 const char s[] = "abcdefghijk";
41 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",
42 std::regex_constants::nosubs)));
43
44 char out[100] = {0};
45 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
46 auto r = m.format(cpp17_output_iterator<char*>(out),
47 fmt, fmt + std::char_traits<char>::length(fmt));
48 assert(base(r) == out + 54);
49 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");
50 }
51 {
52 std::match_results<const char*> m;
53 const char s[] = "abcdefghijk";
54 assert(std::regex_search(s, m, std::regex("cdefghi")));
55
56 char out[100] = {0};
57 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
58 auto r = m.format(cpp17_output_iterator<char*>(out),
59 fmt, fmt + std::char_traits<char>::length(fmt));
60 assert(base(r) == out + 54);
61 assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");
62 }
63 {
64 std::match_results<const char*> m;
65 const char s[] = "abcdefghijk";
66 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
67
68 char out[100] = {0};
69 const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
70 auto r = m.format(cpp17_output_iterator<char*>(out),
71 fmt, fmt + std::char_traits<char>::length(fmt),
72 std::regex_constants::format_sed);
73 assert(base(r) == out + 59);
74 assert(std::string(out) == "prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");
75 }
76 {
77 std::match_results<const char*> m;
78 const char s[] = "abcdefghijk";
79 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
80
81 char out[100] = {0};
82 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
83 auto r = m.format(cpp17_output_iterator<char*>(out),
84 fmt, fmt + std::char_traits<char>::length(fmt),
85 std::regex_constants::format_sed);
86 assert(base(r) == out + 34);
87 assert(std::string(out) == "match: cdefghi, m[1]: efg, m[2]: e");
88 }
89 {
90 std::match_results<const char*> m;
91 const char s[] = "abcdefghijk";
92 assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",
93 std::regex_constants::nosubs)));
94
95 char out[100] = {0};
96 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
97 auto r = m.format(cpp17_output_iterator<char*>(out),
98 fmt, fmt + std::char_traits<char>::length(fmt),
99 std::regex_constants::format_sed);
100 assert(base(r) == out + 30);
101 assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");
102 }
103 {
104 std::match_results<const char*> m;
105 const char s[] = "abcdefghijk";
106 assert(std::regex_search(s, m, std::regex("cdefghi")));
107
108 char out[100] = {0};
109 const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
110 auto r = m.format(cpp17_output_iterator<char*>(out),
111 fmt, fmt + std::char_traits<char>::length(fmt),
112 std::regex_constants::format_sed);
113 assert(base(r) == out + 30);
114 assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");
115 }
116
117 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
118 {
119 std::match_results<const wchar_t*> m;
120 const wchar_t s[] = L"abcdefghijk";
121 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
122
123 wchar_t out[100] = {0};
124 const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
125 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
126 fmt, fmt + std::char_traits<wchar_t>::length(fmt));
127 assert(base(r) == out + 58);
128 assert(std::wstring(out) == L"prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");
129 }
130 {
131 std::match_results<const wchar_t*> m;
132 const wchar_t s[] = L"abcdefghijk";
133 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
134
135 wchar_t out[100] = {0};
136 const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
137 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
138 fmt, fmt + std::char_traits<wchar_t>::length(fmt),
139 std::regex_constants::format_sed);
140 assert(base(r) == out + 59);
141 assert(std::wstring(out) == L"prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");
142 }
143 {
144 std::match_results<const wchar_t*> m;
145 const wchar_t s[] = L"abcdefghijk";
146 assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
147
148 wchar_t out[100] = {0};
149 const wchar_t fmt[] = L"match: &, m[1]: \\1, m[2]: \\2";
150 auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
151 fmt, fmt + std::char_traits<wchar_t>::length(fmt),
152 std::regex_constants::format_sed);
153 assert(base(r) == out + 34);
154 assert(std::wstring(out) == L"match: cdefghi, m[1]: efg, m[2]: e");
155 }
156 #endif // TEST_HAS_NO_WIDE_CHARACTERS
157
158 return 0;
159 }
160