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