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 90b57cec5SDimitry Andric #include "regex" 100b57cec5SDimitry Andric #include "algorithm" 110b57cec5SDimitry Andric #include "iterator" 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 79*04eeddc0SDimitry Andric #if defined(__MVS__) && !defined(__NATIVE_ASCII_F) 80*04eeddc0SDimitry Andric // EBCDIC IBM-1047 81*04eeddc0SDimitry Andric // Sorted via the EBCDIC collating sequence 82*04eeddc0SDimitry Andric const collationnames collatenames[] = 83*04eeddc0SDimitry Andric { 84*04eeddc0SDimitry Andric {"a", 0x81}, 85*04eeddc0SDimitry Andric {"alert", 0x2f}, 86*04eeddc0SDimitry Andric {"ampersand", 0x50}, 87*04eeddc0SDimitry Andric {"apostrophe", 0x7d}, 88*04eeddc0SDimitry Andric {"asterisk", 0x5c}, 89*04eeddc0SDimitry Andric {"b", 0x82}, 90*04eeddc0SDimitry Andric {"backslash", 0xe0}, 91*04eeddc0SDimitry Andric {"backspace", 0x16}, 92*04eeddc0SDimitry Andric {"c", 0x83}, 93*04eeddc0SDimitry Andric {"carriage-return", 0xd}, 94*04eeddc0SDimitry Andric {"circumflex", 0x5f}, 95*04eeddc0SDimitry Andric {"circumflex-accent", 0x5f}, 96*04eeddc0SDimitry Andric {"colon", 0x7a}, 97*04eeddc0SDimitry Andric {"comma", 0x6b}, 98*04eeddc0SDimitry Andric {"commercial-at", 0x7c}, 99*04eeddc0SDimitry Andric {"d", 0x84}, 100*04eeddc0SDimitry Andric {"dollar-sign", 0x5b}, 101*04eeddc0SDimitry Andric {"e", 0x85}, 102*04eeddc0SDimitry Andric {"eight", 0xf8}, 103*04eeddc0SDimitry Andric {"equals-sign", 0x7e}, 104*04eeddc0SDimitry Andric {"exclamation-mark", 0x5a}, 105*04eeddc0SDimitry Andric {"f", 0x86}, 106*04eeddc0SDimitry Andric {"five", 0xf5}, 107*04eeddc0SDimitry Andric {"form-feed", 0xc}, 108*04eeddc0SDimitry Andric {"four", 0xf4}, 109*04eeddc0SDimitry Andric {"full-stop", 0x4b}, 110*04eeddc0SDimitry Andric {"g", 0x87}, 111*04eeddc0SDimitry Andric {"grave-accent", 0x79}, 112*04eeddc0SDimitry Andric {"greater-than-sign", 0x6e}, 113*04eeddc0SDimitry Andric {"h", 0x88}, 114*04eeddc0SDimitry Andric {"hyphen", 0x60}, 115*04eeddc0SDimitry Andric {"hyphen-minus", 0x60}, 116*04eeddc0SDimitry Andric {"i", 0x89}, 117*04eeddc0SDimitry Andric {"j", 0x91}, 118*04eeddc0SDimitry Andric {"k", 0x92}, 119*04eeddc0SDimitry Andric {"l", 0x93}, 120*04eeddc0SDimitry Andric {"left-brace", 0xc0}, 121*04eeddc0SDimitry Andric {"left-curly-bracket", 0xc0}, 122*04eeddc0SDimitry Andric {"left-parenthesis", 0x4d}, 123*04eeddc0SDimitry Andric {"left-square-bracket", 0xad}, 124*04eeddc0SDimitry Andric {"less-than-sign", 0x4c}, 125*04eeddc0SDimitry Andric {"low-line", 0x6d}, 126*04eeddc0SDimitry Andric {"m", 0x94}, 127*04eeddc0SDimitry Andric {"n", 0x95}, 128*04eeddc0SDimitry Andric {"newline", 0x15}, 129*04eeddc0SDimitry Andric {"nine", 0xf9}, 130*04eeddc0SDimitry Andric {"number-sign", 0x7b}, 131*04eeddc0SDimitry Andric {"o", 0x96}, 132*04eeddc0SDimitry Andric {"one", 0xf1}, 133*04eeddc0SDimitry Andric {"p", 0x97}, 134*04eeddc0SDimitry Andric {"percent-sign", 0x6c}, 135*04eeddc0SDimitry Andric {"period", 0x4b}, 136*04eeddc0SDimitry Andric {"plus-sign", 0x4e}, 137*04eeddc0SDimitry Andric {"q", 0x98}, 138*04eeddc0SDimitry Andric {"question-mark", 0x6f}, 139*04eeddc0SDimitry Andric {"quotation-mark", 0x7f}, 140*04eeddc0SDimitry Andric {"r", 0x99}, 141*04eeddc0SDimitry Andric {"reverse-solidus", 0xe0}, 142*04eeddc0SDimitry Andric {"right-brace", 0xd0}, 143*04eeddc0SDimitry Andric {"right-curly-bracket", 0xd0}, 144*04eeddc0SDimitry Andric {"right-parenthesis", 0x5d}, 145*04eeddc0SDimitry Andric {"right-square-bracket", 0xbd}, 146*04eeddc0SDimitry Andric {"s", 0xa2}, 147*04eeddc0SDimitry Andric {"semicolon", 0x5e}, 148*04eeddc0SDimitry Andric {"seven", 0xf7}, 149*04eeddc0SDimitry Andric {"six", 0xf6}, 150*04eeddc0SDimitry Andric {"slash", 0x61}, 151*04eeddc0SDimitry Andric {"solidus", 0x61}, 152*04eeddc0SDimitry Andric {"space", 0x40}, 153*04eeddc0SDimitry Andric {"t", 0xa3}, 154*04eeddc0SDimitry Andric {"tab", 0x5}, 155*04eeddc0SDimitry Andric {"three", 0xf3}, 156*04eeddc0SDimitry Andric {"tilde", 0xa1}, 157*04eeddc0SDimitry Andric {"two", 0xf2}, 158*04eeddc0SDimitry Andric {"u", 0xa4}, 159*04eeddc0SDimitry Andric {"underscore", 0x6d}, 160*04eeddc0SDimitry Andric {"v", 0xa5}, 161*04eeddc0SDimitry Andric {"vertical-line", 0x4f}, 162*04eeddc0SDimitry Andric {"vertical-tab", 0xb}, 163*04eeddc0SDimitry Andric {"w", 0xa6}, 164*04eeddc0SDimitry Andric {"x", 0xa7}, 165*04eeddc0SDimitry Andric {"y", 0xa8}, 166*04eeddc0SDimitry Andric {"z", 0xa9}, 167*04eeddc0SDimitry Andric {"zero", 0xf0}, 168*04eeddc0SDimitry Andric {"A", 0xc1}, 169*04eeddc0SDimitry Andric {"B", 0xc2}, 170*04eeddc0SDimitry Andric {"C", 0xc3}, 171*04eeddc0SDimitry Andric {"D", 0xc4}, 172*04eeddc0SDimitry Andric {"E", 0xc5}, 173*04eeddc0SDimitry Andric {"F", 0xc6}, 174*04eeddc0SDimitry Andric {"G", 0xc7}, 175*04eeddc0SDimitry Andric {"H", 0xc8}, 176*04eeddc0SDimitry Andric {"I", 0xc9}, 177*04eeddc0SDimitry Andric {"J", 0xd1}, 178*04eeddc0SDimitry Andric {"K", 0xd2}, 179*04eeddc0SDimitry Andric {"L", 0xd3}, 180*04eeddc0SDimitry Andric {"M", 0xd4}, 181*04eeddc0SDimitry Andric {"N", 0xd5}, 182*04eeddc0SDimitry Andric {"NUL", 0}, 183*04eeddc0SDimitry Andric {"O", 0xd6}, 184*04eeddc0SDimitry Andric {"P", 0xd7}, 185*04eeddc0SDimitry Andric {"Q", 0xd8}, 186*04eeddc0SDimitry Andric {"R", 0xd9}, 187*04eeddc0SDimitry Andric {"S", 0xe2}, 188*04eeddc0SDimitry Andric {"T", 0xe3}, 189*04eeddc0SDimitry Andric {"U", 0xe4}, 190*04eeddc0SDimitry Andric {"V", 0xe5}, 191*04eeddc0SDimitry Andric {"W", 0xe6}, 192*04eeddc0SDimitry Andric {"X", 0xe7}, 193*04eeddc0SDimitry Andric {"Y", 0xe8}, 194*04eeddc0SDimitry Andric {"Z", 0xe9} 195*04eeddc0SDimitry Andric }; 196*04eeddc0SDimitry Andric #else 197*04eeddc0SDimitry 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 }; 312*04eeddc0SDimitry 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