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