111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===-------------------------- regex.cpp ---------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "regex"
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "algorithm"
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "iterator"
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_LIBCPP_BEGIN_NAMESPACE_STD
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstatic
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst char*
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertmake_error_type_string(regex_constants::error_type ecode)
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    switch (ecode)
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_collate:
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid collating element name.";
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_ctype:
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid character class name.";
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_escape:
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid escaped character, or a "
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               "trailing escape.";
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_backref:
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid back reference.";
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_brack:
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained mismatched [ and ].";
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_paren:
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained mismatched ( and ).";
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_brace:
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained mismatched { and }.";
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_badbrace:
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid range in a {} expression.";
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_range:
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The expression contained an invalid character range, "
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               "such as [b-a] in most encodings.";
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_space:
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "There was insufficient memory to convert the expression into "
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               "a finite state machine.";
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_badrepeat:
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "One of *?+{ was not preceded by a valid regular expression.";
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_complexity:
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "The complexity of an attempted match against a regular "
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               "expression exceeded a pre-set level.";
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::error_stack:
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "There was insufficient memory to determine whether the regular "
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               "expression could match the specified character sequence.";
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::__re_err_grammar:
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "An invalid regex grammar has been requested.";
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    case regex_constants::__re_err_empty:
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        return "An empty regex is not allowed in the POSIX grammar.";
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    default:
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        break;
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return "Unknown error type";
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertregex_error::regex_error(regex_constants::error_type ecode)
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : runtime_error(make_error_type_string(ecode)),
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __code_(ecode)
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{}
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertregex_error::~regex_error() throw() {}
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct collationnames
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const char* elem_;
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    char char_;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst collationnames collatenames[] =
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"A", 0x41},
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"B", 0x42},
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"C", 0x43},
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"D", 0x44},
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"E", 0x45},
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"F", 0x46},
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"G", 0x47},
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"H", 0x48},
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"I", 0x49},
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"J", 0x4a},
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"K", 0x4b},
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"L", 0x4c},
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"M", 0x4d},
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"N", 0x4e},
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"NUL", 0x00},
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"O", 0x4f},
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"P", 0x50},
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"Q", 0x51},
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"R", 0x52},
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"S", 0x53},
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"T", 0x54},
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"U", 0x55},
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"V", 0x56},
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"W", 0x57},
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"X", 0x58},
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"Y", 0x59},
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"Z", 0x5a},
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"a", 0x61},
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"alert", 0x07},
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"ampersand", 0x26},
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"apostrophe", 0x27},
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"asterisk", 0x2a},
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"b", 0x62},
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"backslash", 0x5c},
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"backspace", 0x08},
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"c", 0x63},
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"carriage-return", 0x0d},
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"circumflex", 0x5e},
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"circumflex-accent", 0x5e},
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"colon", 0x3a},
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"comma", 0x2c},
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"commercial-at", 0x40},
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"d", 0x64},
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"dollar-sign", 0x24},
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"e", 0x65},
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"eight", 0x38},
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"equals-sign", 0x3d},
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"exclamation-mark", 0x21},
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"f", 0x66},
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"five", 0x35},
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"form-feed", 0x0c},
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"four", 0x34},
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"full-stop", 0x2e},
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"g", 0x67},
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"grave-accent", 0x60},
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"greater-than-sign", 0x3e},
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"h", 0x68},
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"hyphen", 0x2d},
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"hyphen-minus", 0x2d},
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"i", 0x69},
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"j", 0x6a},
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"k", 0x6b},
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"l", 0x6c},
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"left-brace", 0x7b},
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"left-curly-bracket", 0x7b},
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"left-parenthesis", 0x28},
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"left-square-bracket", 0x5b},
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"less-than-sign", 0x3c},
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"low-line", 0x5f},
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"m", 0x6d},
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"n", 0x6e},
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"newline", 0x0a},
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"nine", 0x39},
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"number-sign", 0x23},
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"o", 0x6f},
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"one", 0x31},
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"p", 0x70},
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"percent-sign", 0x25},
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"period", 0x2e},
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"plus-sign", 0x2b},
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"q", 0x71},
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"question-mark", 0x3f},
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"quotation-mark", 0x22},
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"r", 0x72},
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"reverse-solidus", 0x5c},
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"right-brace", 0x7d},
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"right-curly-bracket", 0x7d},
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"right-parenthesis", 0x29},
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"right-square-bracket", 0x5d},
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"s", 0x73},
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"semicolon", 0x3b},
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"seven", 0x37},
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"six", 0x36},
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"slash", 0x2f},
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"solidus", 0x2f},
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"space", 0x20},
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"t", 0x74},
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"tab", 0x09},
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"three", 0x33},
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"tilde", 0x7e},
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"two", 0x32},
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"u", 0x75},
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"underscore", 0x5f},
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"v", 0x76},
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"vertical-line", 0x7c},
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"vertical-tab", 0x0b},
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"w", 0x77},
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"x", 0x78},
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"y", 0x79},
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"z", 0x7a},
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"zero", 0x30}
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct classnames
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const char* elem_;
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    regex_traits<char>::char_class_type mask_;
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconst classnames ClassNames[] =
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"alnum",  ctype_base::alnum},
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"alpha",  ctype_base::alpha},
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"blank",  ctype_base::blank},
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"cntrl",  ctype_base::cntrl},
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"d",      ctype_base::digit},
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"digit",  ctype_base::digit},
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"graph",  ctype_base::graph},
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"lower",  ctype_base::lower},
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"print",  ctype_base::print},
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"punct",  ctype_base::punct},
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"s",      ctype_base::space},
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"space",  ctype_base::space},
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"upper",  ctype_base::upper},
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"w",      regex_traits<char>::__regex_word},
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {"xdigit", ctype_base::xdigit}
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct use_strcmp
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bool operator()(const collationnames& x, const char* y)
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {return strcmp(x.elem_, y) < 0;}
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    bool operator()(const classnames& x, const char* y)
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {return strcmp(x.elem_, y) < 0;}
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstring
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__get_collation_name(const char* s)
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const collationnames* i =
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            _VSTD::lower_bound(begin(collatenames), end(collatenames), s, use_strcmp());
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    string r;
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (i != end(collatenames) && strcmp(s, i->elem_) == 0)
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        r = char(i->char_);
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return r;
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertregex_traits<char>::char_class_type
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__get_classname(const char* s, bool __icase)
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const classnames* i =
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            _VSTD::lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp());
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    regex_traits<char>::char_class_type r = 0;
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (i != end(ClassNames) && strcmp(s, i->elem_) == 0)
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        r = i->mask_;
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        if (r == regex_traits<char>::__regex_word)
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            r |= ctype_base::alnum | ctype_base::upper | ctype_base::lower;
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        else if (__icase)
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            if (r & (ctype_base::lower | ctype_base::upper))
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                r |= ctype_base::alpha;
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return r;
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <>
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__match_any_but_newline<char>::__exec(__state& __s) const
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__s.__current_ != __s.__last_)
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        switch (*__s.__current_)
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case '\r':
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case '\n':
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__do_ = __state::__reject;
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__node_ = nullptr;
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            break;
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        default:
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__do_ = __state::__accept_and_consume;
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            ++__s.__current_;
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__node_ = this->first();
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            break;
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __s.__do_ = __state::__reject;
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __s.__node_ = nullptr;
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <>
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__match_any_but_newline<wchar_t>::__exec(__state& __s) const
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__s.__current_ != __s.__last_)
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        switch (*__s.__current_)
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case '\r':
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case '\n':
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case 0x2028:
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        case 0x2029:
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__do_ = __state::__reject;
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__node_ = nullptr;
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            break;
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        default:
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__do_ = __state::__accept_and_consume;
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            ++__s.__current_;
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            __s.__node_ = this->first();
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            break;
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __s.__do_ = __state::__reject;
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __s.__node_ = nullptr;
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_LIBCPP_END_NAMESPACE_STD
316