xref: /freebsd/contrib/llvm-project/libcxx/src/regex.cpp (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
1349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
981ad6265SDimitry Andric #include <algorithm>
1081ad6265SDimitry Andric #include <iterator>
1181ad6265SDimitry Andric #include <regex>
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
140b57cec5SDimitry Andric 
15*cb14a3feSDimitry Andric static const char* make_error_type_string(regex_constants::error_type ecode) {
16*cb14a3feSDimitry Andric   switch (ecode) {
170b57cec5SDimitry Andric   case regex_constants::error_collate:
180b57cec5SDimitry Andric     return "The expression contained an invalid collating element name.";
190b57cec5SDimitry Andric   case regex_constants::error_ctype:
200b57cec5SDimitry Andric     return "The expression contained an invalid character class name.";
210b57cec5SDimitry Andric   case regex_constants::error_escape:
220b57cec5SDimitry Andric     return "The expression contained an invalid escaped character, or a "
230b57cec5SDimitry Andric            "trailing escape.";
240b57cec5SDimitry Andric   case regex_constants::error_backref:
250b57cec5SDimitry Andric     return "The expression contained an invalid back reference.";
260b57cec5SDimitry Andric   case regex_constants::error_brack:
270b57cec5SDimitry Andric     return "The expression contained mismatched [ and ].";
280b57cec5SDimitry Andric   case regex_constants::error_paren:
290b57cec5SDimitry Andric     return "The expression contained mismatched ( and ).";
300b57cec5SDimitry Andric   case regex_constants::error_brace:
310b57cec5SDimitry Andric     return "The expression contained mismatched { and }.";
320b57cec5SDimitry Andric   case regex_constants::error_badbrace:
330b57cec5SDimitry Andric     return "The expression contained an invalid range in a {} expression.";
340b57cec5SDimitry Andric   case regex_constants::error_range:
350b57cec5SDimitry Andric     return "The expression contained an invalid character range, "
360b57cec5SDimitry Andric            "such as [b-a] in most encodings.";
370b57cec5SDimitry Andric   case regex_constants::error_space:
380b57cec5SDimitry Andric     return "There was insufficient memory to convert the expression into "
390b57cec5SDimitry Andric            "a finite state machine.";
400b57cec5SDimitry Andric   case regex_constants::error_badrepeat:
410b57cec5SDimitry Andric     return "One of *?+{ was not preceded by a valid regular expression.";
420b57cec5SDimitry Andric   case regex_constants::error_complexity:
430b57cec5SDimitry Andric     return "The complexity of an attempted match against a regular "
440b57cec5SDimitry Andric            "expression exceeded a pre-set level.";
450b57cec5SDimitry Andric   case regex_constants::error_stack:
460b57cec5SDimitry Andric     return "There was insufficient memory to determine whether the regular "
470b57cec5SDimitry Andric            "expression could match the specified character sequence.";
480b57cec5SDimitry Andric   case regex_constants::__re_err_grammar:
490b57cec5SDimitry Andric     return "An invalid regex grammar has been requested.";
500b57cec5SDimitry Andric   case regex_constants::__re_err_empty:
510b57cec5SDimitry Andric     return "An empty regex is not allowed in the POSIX grammar.";
52480093f4SDimitry Andric   case regex_constants::__re_err_parse:
53480093f4SDimitry Andric     return "The parser did not consume the entire regular expression.";
540b57cec5SDimitry Andric   default:
550b57cec5SDimitry Andric     break;
560b57cec5SDimitry Andric   }
570b57cec5SDimitry Andric   return "Unknown error type";
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric regex_error::regex_error(regex_constants::error_type ecode)
61*cb14a3feSDimitry Andric     : runtime_error(make_error_type_string(ecode)), __code_(ecode) {}
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric regex_error::~regex_error() throw() {}
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric namespace {
660b57cec5SDimitry Andric 
67*cb14a3feSDimitry Andric struct collationnames {
680b57cec5SDimitry Andric   const char* elem_;
690b57cec5SDimitry Andric   char char_;
700b57cec5SDimitry Andric };
710b57cec5SDimitry Andric 
7204eeddc0SDimitry Andric #if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
7304eeddc0SDimitry Andric // EBCDIC IBM-1047
7404eeddc0SDimitry Andric // Sorted via the EBCDIC collating sequence
75*cb14a3feSDimitry Andric const collationnames collatenames[] = {
7604eeddc0SDimitry Andric     {"a", 0x81},
7704eeddc0SDimitry Andric     {"alert", 0x2f},
7804eeddc0SDimitry Andric     {"ampersand", 0x50},
7904eeddc0SDimitry Andric     {"apostrophe", 0x7d},
8004eeddc0SDimitry Andric     {"asterisk", 0x5c},
8104eeddc0SDimitry Andric     {"b", 0x82},
8204eeddc0SDimitry Andric     {"backslash", 0xe0},
8304eeddc0SDimitry Andric     {"backspace", 0x16},
8404eeddc0SDimitry Andric     {"c", 0x83},
8504eeddc0SDimitry Andric     {"carriage-return", 0xd},
8604eeddc0SDimitry Andric     {"circumflex", 0x5f},
8704eeddc0SDimitry Andric     {"circumflex-accent", 0x5f},
8804eeddc0SDimitry Andric     {"colon", 0x7a},
8904eeddc0SDimitry Andric     {"comma", 0x6b},
9004eeddc0SDimitry Andric     {"commercial-at", 0x7c},
9104eeddc0SDimitry Andric     {"d", 0x84},
9204eeddc0SDimitry Andric     {"dollar-sign", 0x5b},
9304eeddc0SDimitry Andric     {"e", 0x85},
9404eeddc0SDimitry Andric     {"eight", 0xf8},
9504eeddc0SDimitry Andric     {"equals-sign", 0x7e},
9604eeddc0SDimitry Andric     {"exclamation-mark", 0x5a},
9704eeddc0SDimitry Andric     {"f", 0x86},
9804eeddc0SDimitry Andric     {"five", 0xf5},
9904eeddc0SDimitry Andric     {"form-feed", 0xc},
10004eeddc0SDimitry Andric     {"four", 0xf4},
10104eeddc0SDimitry Andric     {"full-stop", 0x4b},
10204eeddc0SDimitry Andric     {"g", 0x87},
10304eeddc0SDimitry Andric     {"grave-accent", 0x79},
10404eeddc0SDimitry Andric     {"greater-than-sign", 0x6e},
10504eeddc0SDimitry Andric     {"h", 0x88},
10604eeddc0SDimitry Andric     {"hyphen", 0x60},
10704eeddc0SDimitry Andric     {"hyphen-minus", 0x60},
10804eeddc0SDimitry Andric     {"i", 0x89},
10904eeddc0SDimitry Andric     {"j", 0x91},
11004eeddc0SDimitry Andric     {"k", 0x92},
11104eeddc0SDimitry Andric     {"l", 0x93},
11204eeddc0SDimitry Andric     {"left-brace", 0xc0},
11304eeddc0SDimitry Andric     {"left-curly-bracket", 0xc0},
11404eeddc0SDimitry Andric     {"left-parenthesis", 0x4d},
11504eeddc0SDimitry Andric     {"left-square-bracket", 0xad},
11604eeddc0SDimitry Andric     {"less-than-sign", 0x4c},
11704eeddc0SDimitry Andric     {"low-line", 0x6d},
11804eeddc0SDimitry Andric     {"m", 0x94},
11904eeddc0SDimitry Andric     {"n", 0x95},
12004eeddc0SDimitry Andric     {"newline", 0x15},
12104eeddc0SDimitry Andric     {"nine", 0xf9},
12204eeddc0SDimitry Andric     {"number-sign", 0x7b},
12304eeddc0SDimitry Andric     {"o", 0x96},
12404eeddc0SDimitry Andric     {"one", 0xf1},
12504eeddc0SDimitry Andric     {"p", 0x97},
12604eeddc0SDimitry Andric     {"percent-sign", 0x6c},
12704eeddc0SDimitry Andric     {"period", 0x4b},
12804eeddc0SDimitry Andric     {"plus-sign", 0x4e},
12904eeddc0SDimitry Andric     {"q", 0x98},
13004eeddc0SDimitry Andric     {"question-mark", 0x6f},
13104eeddc0SDimitry Andric     {"quotation-mark", 0x7f},
13204eeddc0SDimitry Andric     {"r", 0x99},
13304eeddc0SDimitry Andric     {"reverse-solidus", 0xe0},
13404eeddc0SDimitry Andric     {"right-brace", 0xd0},
13504eeddc0SDimitry Andric     {"right-curly-bracket", 0xd0},
13604eeddc0SDimitry Andric     {"right-parenthesis", 0x5d},
13704eeddc0SDimitry Andric     {"right-square-bracket", 0xbd},
13804eeddc0SDimitry Andric     {"s", 0xa2},
13904eeddc0SDimitry Andric     {"semicolon", 0x5e},
14004eeddc0SDimitry Andric     {"seven", 0xf7},
14104eeddc0SDimitry Andric     {"six", 0xf6},
14204eeddc0SDimitry Andric     {"slash", 0x61},
14304eeddc0SDimitry Andric     {"solidus", 0x61},
14404eeddc0SDimitry Andric     {"space", 0x40},
14504eeddc0SDimitry Andric     {"t", 0xa3},
14604eeddc0SDimitry Andric     {"tab", 0x5},
14704eeddc0SDimitry Andric     {"three", 0xf3},
14804eeddc0SDimitry Andric     {"tilde", 0xa1},
14904eeddc0SDimitry Andric     {"two", 0xf2},
15004eeddc0SDimitry Andric     {"u", 0xa4},
15104eeddc0SDimitry Andric     {"underscore", 0x6d},
15204eeddc0SDimitry Andric     {"v", 0xa5},
15304eeddc0SDimitry Andric     {"vertical-line", 0x4f},
15404eeddc0SDimitry Andric     {"vertical-tab", 0xb},
15504eeddc0SDimitry Andric     {"w", 0xa6},
15604eeddc0SDimitry Andric     {"x", 0xa7},
15704eeddc0SDimitry Andric     {"y", 0xa8},
15804eeddc0SDimitry Andric     {"z", 0xa9},
15904eeddc0SDimitry Andric     {"zero", 0xf0},
16004eeddc0SDimitry Andric     {"A", 0xc1},
16104eeddc0SDimitry Andric     {"B", 0xc2},
16204eeddc0SDimitry Andric     {"C", 0xc3},
16304eeddc0SDimitry Andric     {"D", 0xc4},
16404eeddc0SDimitry Andric     {"E", 0xc5},
16504eeddc0SDimitry Andric     {"F", 0xc6},
16604eeddc0SDimitry Andric     {"G", 0xc7},
16704eeddc0SDimitry Andric     {"H", 0xc8},
16804eeddc0SDimitry Andric     {"I", 0xc9},
16904eeddc0SDimitry Andric     {"J", 0xd1},
17004eeddc0SDimitry Andric     {"K", 0xd2},
17104eeddc0SDimitry Andric     {"L", 0xd3},
17204eeddc0SDimitry Andric     {"M", 0xd4},
17304eeddc0SDimitry Andric     {"N", 0xd5},
17404eeddc0SDimitry Andric     {"NUL", 0},
17504eeddc0SDimitry Andric     {"O", 0xd6},
17604eeddc0SDimitry Andric     {"P", 0xd7},
17704eeddc0SDimitry Andric     {"Q", 0xd8},
17804eeddc0SDimitry Andric     {"R", 0xd9},
17904eeddc0SDimitry Andric     {"S", 0xe2},
18004eeddc0SDimitry Andric     {"T", 0xe3},
18104eeddc0SDimitry Andric     {"U", 0xe4},
18204eeddc0SDimitry Andric     {"V", 0xe5},
18304eeddc0SDimitry Andric     {"W", 0xe6},
18404eeddc0SDimitry Andric     {"X", 0xe7},
18504eeddc0SDimitry Andric     {"Y", 0xe8},
186*cb14a3feSDimitry Andric     {"Z", 0xe9}};
18704eeddc0SDimitry Andric #else
18804eeddc0SDimitry Andric // ASCII
189*cb14a3feSDimitry Andric const collationnames collatenames[] = {
1900b57cec5SDimitry Andric     {"A", 0x41},
1910b57cec5SDimitry Andric     {"B", 0x42},
1920b57cec5SDimitry Andric     {"C", 0x43},
1930b57cec5SDimitry Andric     {"D", 0x44},
1940b57cec5SDimitry Andric     {"E", 0x45},
1950b57cec5SDimitry Andric     {"F", 0x46},
1960b57cec5SDimitry Andric     {"G", 0x47},
1970b57cec5SDimitry Andric     {"H", 0x48},
1980b57cec5SDimitry Andric     {"I", 0x49},
1990b57cec5SDimitry Andric     {"J", 0x4a},
2000b57cec5SDimitry Andric     {"K", 0x4b},
2010b57cec5SDimitry Andric     {"L", 0x4c},
2020b57cec5SDimitry Andric     {"M", 0x4d},
2030b57cec5SDimitry Andric     {"N", 0x4e},
2040b57cec5SDimitry Andric     {"NUL", 0x00},
2050b57cec5SDimitry Andric     {"O", 0x4f},
2060b57cec5SDimitry Andric     {"P", 0x50},
2070b57cec5SDimitry Andric     {"Q", 0x51},
2080b57cec5SDimitry Andric     {"R", 0x52},
2090b57cec5SDimitry Andric     {"S", 0x53},
2100b57cec5SDimitry Andric     {"T", 0x54},
2110b57cec5SDimitry Andric     {"U", 0x55},
2120b57cec5SDimitry Andric     {"V", 0x56},
2130b57cec5SDimitry Andric     {"W", 0x57},
2140b57cec5SDimitry Andric     {"X", 0x58},
2150b57cec5SDimitry Andric     {"Y", 0x59},
2160b57cec5SDimitry Andric     {"Z", 0x5a},
2170b57cec5SDimitry Andric     {"a", 0x61},
2180b57cec5SDimitry Andric     {"alert", 0x07},
2190b57cec5SDimitry Andric     {"ampersand", 0x26},
2200b57cec5SDimitry Andric     {"apostrophe", 0x27},
2210b57cec5SDimitry Andric     {"asterisk", 0x2a},
2220b57cec5SDimitry Andric     {"b", 0x62},
2230b57cec5SDimitry Andric     {"backslash", 0x5c},
2240b57cec5SDimitry Andric     {"backspace", 0x08},
2250b57cec5SDimitry Andric     {"c", 0x63},
2260b57cec5SDimitry Andric     {"carriage-return", 0x0d},
2270b57cec5SDimitry Andric     {"circumflex", 0x5e},
2280b57cec5SDimitry Andric     {"circumflex-accent", 0x5e},
2290b57cec5SDimitry Andric     {"colon", 0x3a},
2300b57cec5SDimitry Andric     {"comma", 0x2c},
2310b57cec5SDimitry Andric     {"commercial-at", 0x40},
2320b57cec5SDimitry Andric     {"d", 0x64},
2330b57cec5SDimitry Andric     {"dollar-sign", 0x24},
2340b57cec5SDimitry Andric     {"e", 0x65},
2350b57cec5SDimitry Andric     {"eight", 0x38},
2360b57cec5SDimitry Andric     {"equals-sign", 0x3d},
2370b57cec5SDimitry Andric     {"exclamation-mark", 0x21},
2380b57cec5SDimitry Andric     {"f", 0x66},
2390b57cec5SDimitry Andric     {"five", 0x35},
2400b57cec5SDimitry Andric     {"form-feed", 0x0c},
2410b57cec5SDimitry Andric     {"four", 0x34},
2420b57cec5SDimitry Andric     {"full-stop", 0x2e},
2430b57cec5SDimitry Andric     {"g", 0x67},
2440b57cec5SDimitry Andric     {"grave-accent", 0x60},
2450b57cec5SDimitry Andric     {"greater-than-sign", 0x3e},
2460b57cec5SDimitry Andric     {"h", 0x68},
2470b57cec5SDimitry Andric     {"hyphen", 0x2d},
2480b57cec5SDimitry Andric     {"hyphen-minus", 0x2d},
2490b57cec5SDimitry Andric     {"i", 0x69},
2500b57cec5SDimitry Andric     {"j", 0x6a},
2510b57cec5SDimitry Andric     {"k", 0x6b},
2520b57cec5SDimitry Andric     {"l", 0x6c},
2530b57cec5SDimitry Andric     {"left-brace", 0x7b},
2540b57cec5SDimitry Andric     {"left-curly-bracket", 0x7b},
2550b57cec5SDimitry Andric     {"left-parenthesis", 0x28},
2560b57cec5SDimitry Andric     {"left-square-bracket", 0x5b},
2570b57cec5SDimitry Andric     {"less-than-sign", 0x3c},
2580b57cec5SDimitry Andric     {"low-line", 0x5f},
2590b57cec5SDimitry Andric     {"m", 0x6d},
2600b57cec5SDimitry Andric     {"n", 0x6e},
2610b57cec5SDimitry Andric     {"newline", 0x0a},
2620b57cec5SDimitry Andric     {"nine", 0x39},
2630b57cec5SDimitry Andric     {"number-sign", 0x23},
2640b57cec5SDimitry Andric     {"o", 0x6f},
2650b57cec5SDimitry Andric     {"one", 0x31},
2660b57cec5SDimitry Andric     {"p", 0x70},
2670b57cec5SDimitry Andric     {"percent-sign", 0x25},
2680b57cec5SDimitry Andric     {"period", 0x2e},
2690b57cec5SDimitry Andric     {"plus-sign", 0x2b},
2700b57cec5SDimitry Andric     {"q", 0x71},
2710b57cec5SDimitry Andric     {"question-mark", 0x3f},
2720b57cec5SDimitry Andric     {"quotation-mark", 0x22},
2730b57cec5SDimitry Andric     {"r", 0x72},
2740b57cec5SDimitry Andric     {"reverse-solidus", 0x5c},
2750b57cec5SDimitry Andric     {"right-brace", 0x7d},
2760b57cec5SDimitry Andric     {"right-curly-bracket", 0x7d},
2770b57cec5SDimitry Andric     {"right-parenthesis", 0x29},
2780b57cec5SDimitry Andric     {"right-square-bracket", 0x5d},
2790b57cec5SDimitry Andric     {"s", 0x73},
2800b57cec5SDimitry Andric     {"semicolon", 0x3b},
2810b57cec5SDimitry Andric     {"seven", 0x37},
2820b57cec5SDimitry Andric     {"six", 0x36},
2830b57cec5SDimitry Andric     {"slash", 0x2f},
2840b57cec5SDimitry Andric     {"solidus", 0x2f},
2850b57cec5SDimitry Andric     {"space", 0x20},
2860b57cec5SDimitry Andric     {"t", 0x74},
2870b57cec5SDimitry Andric     {"tab", 0x09},
2880b57cec5SDimitry Andric     {"three", 0x33},
2890b57cec5SDimitry Andric     {"tilde", 0x7e},
2900b57cec5SDimitry Andric     {"two", 0x32},
2910b57cec5SDimitry Andric     {"u", 0x75},
2920b57cec5SDimitry Andric     {"underscore", 0x5f},
2930b57cec5SDimitry Andric     {"v", 0x76},
2940b57cec5SDimitry Andric     {"vertical-line", 0x7c},
2950b57cec5SDimitry Andric     {"vertical-tab", 0x0b},
2960b57cec5SDimitry Andric     {"w", 0x77},
2970b57cec5SDimitry Andric     {"x", 0x78},
2980b57cec5SDimitry Andric     {"y", 0x79},
2990b57cec5SDimitry Andric     {"z", 0x7a},
300*cb14a3feSDimitry Andric     {"zero", 0x30}};
30104eeddc0SDimitry Andric #endif
3020b57cec5SDimitry Andric 
303*cb14a3feSDimitry Andric struct classnames {
3040b57cec5SDimitry Andric   const char* elem_;
3050b57cec5SDimitry Andric   regex_traits<char>::char_class_type mask_;
3060b57cec5SDimitry Andric };
3070b57cec5SDimitry Andric 
308*cb14a3feSDimitry Andric const classnames ClassNames[] = {
3090b57cec5SDimitry Andric     {"alnum", ctype_base::alnum},
3100b57cec5SDimitry Andric     {"alpha", ctype_base::alpha},
3110b57cec5SDimitry Andric     {"blank", ctype_base::blank},
3120b57cec5SDimitry Andric     {"cntrl", ctype_base::cntrl},
3130b57cec5SDimitry Andric     {"d", ctype_base::digit},
3140b57cec5SDimitry Andric     {"digit", ctype_base::digit},
3150b57cec5SDimitry Andric     {"graph", ctype_base::graph},
3160b57cec5SDimitry Andric     {"lower", ctype_base::lower},
3170b57cec5SDimitry Andric     {"print", ctype_base::print},
3180b57cec5SDimitry Andric     {"punct", ctype_base::punct},
3190b57cec5SDimitry Andric     {"s", ctype_base::space},
3200b57cec5SDimitry Andric     {"space", ctype_base::space},
3210b57cec5SDimitry Andric     {"upper", ctype_base::upper},
3220b57cec5SDimitry Andric     {"w", regex_traits<char>::__regex_word},
323*cb14a3feSDimitry Andric     {"xdigit", ctype_base::xdigit}};
324*cb14a3feSDimitry Andric 
325*cb14a3feSDimitry Andric struct use_strcmp {
326*cb14a3feSDimitry Andric   bool operator()(const collationnames& x, const char* y) { return strcmp(x.elem_, y) < 0; }
327*cb14a3feSDimitry Andric   bool operator()(const classnames& x, const char* y) { return strcmp(x.elem_, y) < 0; }
3280b57cec5SDimitry Andric };
3290b57cec5SDimitry Andric 
330*cb14a3feSDimitry Andric } // namespace
3310b57cec5SDimitry Andric 
332*cb14a3feSDimitry Andric string __get_collation_name(const char* s) {
333*cb14a3feSDimitry Andric   const collationnames* i = std::lower_bound(begin(collatenames), end(collatenames), s, use_strcmp());
3340b57cec5SDimitry Andric   string r;
3350b57cec5SDimitry Andric   if (i != end(collatenames) && strcmp(s, i->elem_) == 0)
3360b57cec5SDimitry Andric     r = char(i->char_);
3370b57cec5SDimitry Andric   return r;
3380b57cec5SDimitry Andric }
3390b57cec5SDimitry Andric 
340*cb14a3feSDimitry Andric regex_traits<char>::char_class_type __get_classname(const char* s, bool __icase) {
341*cb14a3feSDimitry Andric   const classnames* i                   = std::lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp());
3420b57cec5SDimitry Andric   regex_traits<char>::char_class_type r = 0;
343*cb14a3feSDimitry Andric   if (i != end(ClassNames) && strcmp(s, i->elem_) == 0) {
3440b57cec5SDimitry Andric     r = i->mask_;
3450b57cec5SDimitry Andric     if (r == regex_traits<char>::__regex_word)
3460b57cec5SDimitry Andric       r |= ctype_base::alnum | ctype_base::upper | ctype_base::lower;
347*cb14a3feSDimitry Andric     else if (__icase) {
3480b57cec5SDimitry Andric       if (r & (ctype_base::lower | ctype_base::upper))
3490b57cec5SDimitry Andric         r |= ctype_base::alpha;
3500b57cec5SDimitry Andric     }
3510b57cec5SDimitry Andric   }
3520b57cec5SDimitry Andric   return r;
3530b57cec5SDimitry Andric }
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric template <>
356*cb14a3feSDimitry Andric void __match_any_but_newline<char>::__exec(__state& __s) const {
357*cb14a3feSDimitry Andric   if (__s.__current_ != __s.__last_) {
358*cb14a3feSDimitry Andric     switch (*__s.__current_) {
3590b57cec5SDimitry Andric     case '\r':
3600b57cec5SDimitry Andric     case '\n':
3610b57cec5SDimitry Andric       __s.__do_   = __state::__reject;
3620b57cec5SDimitry Andric       __s.__node_ = nullptr;
3630b57cec5SDimitry Andric       break;
3640b57cec5SDimitry Andric     default:
3650b57cec5SDimitry Andric       __s.__do_ = __state::__accept_and_consume;
3660b57cec5SDimitry Andric       ++__s.__current_;
3670b57cec5SDimitry Andric       __s.__node_ = this->first();
3680b57cec5SDimitry Andric       break;
3690b57cec5SDimitry Andric     }
370*cb14a3feSDimitry Andric   } else {
3710b57cec5SDimitry Andric     __s.__do_   = __state::__reject;
3720b57cec5SDimitry Andric     __s.__node_ = nullptr;
3730b57cec5SDimitry Andric   }
3740b57cec5SDimitry Andric }
3750b57cec5SDimitry Andric 
3760b57cec5SDimitry Andric template <>
377*cb14a3feSDimitry Andric void __match_any_but_newline<wchar_t>::__exec(__state& __s) const {
378*cb14a3feSDimitry Andric   if (__s.__current_ != __s.__last_) {
379*cb14a3feSDimitry Andric     switch (*__s.__current_) {
3800b57cec5SDimitry Andric     case '\r':
3810b57cec5SDimitry Andric     case '\n':
3820b57cec5SDimitry Andric     case 0x2028:
3830b57cec5SDimitry Andric     case 0x2029:
3840b57cec5SDimitry Andric       __s.__do_   = __state::__reject;
3850b57cec5SDimitry Andric       __s.__node_ = nullptr;
3860b57cec5SDimitry Andric       break;
3870b57cec5SDimitry Andric     default:
3880b57cec5SDimitry Andric       __s.__do_ = __state::__accept_and_consume;
3890b57cec5SDimitry Andric       ++__s.__current_;
3900b57cec5SDimitry Andric       __s.__node_ = this->first();
3910b57cec5SDimitry Andric       break;
3920b57cec5SDimitry Andric     }
393*cb14a3feSDimitry Andric   } else {
3940b57cec5SDimitry Andric     __s.__do_   = __state::__reject;
3950b57cec5SDimitry Andric     __s.__node_ = nullptr;
3960b57cec5SDimitry Andric   }
3970b57cec5SDimitry Andric }
3980b57cec5SDimitry Andric 
3990b57cec5SDimitry Andric _LIBCPP_END_NAMESPACE_STD
400