File indexing completed on 2025-10-31 08:56:01
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012  
0013 
0014 
0015 
0016 
0017 
0018 
0019 #ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
0020 #define BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
0021 
0022 #include <boost/regex/config.hpp>
0023 
0024 #include <boost/regex/v5/syntax_type.hpp>
0025 #include <boost/regex/v5/error_type.hpp>
0026 #include <boost/regex/v5/regex_workaround.hpp>
0027 #include <type_traits>
0028 #include <cstdint>
0029 #include <cctype>
0030 #include <locale>
0031 #include <cwctype>
0032 #include <limits>
0033 
0034 namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
0035 
0036 
0037 
0038 
0039 
0040 template <class charT>
0041 inline bool is_extended(charT c)
0042 {
0043    typedef typename std::make_unsigned<charT>::type unsigned_type; 
0044    return (sizeof(charT) > 1) && (static_cast<unsigned_type>(c) >= 256u); 
0045 }
0046 inline bool is_extended(char)
0047 { return false; }
0048 
0049 inline const char*  get_default_syntax(regex_constants::syntax_type n)
0050 {
0051    
0052    
0053    const char* messages[] = {
0054          "",
0055          "(",
0056          ")",
0057          "$",
0058          "^",
0059          ".",
0060          "*",
0061          "+",
0062          "?",
0063          "[",
0064          "]",
0065          "|",
0066          "\\",
0067          "#",
0068          "-",
0069          "{",
0070          "}",
0071          "0123456789",
0072          "b",
0073          "B",
0074          "<",
0075          ">",
0076          "",
0077          "",
0078          "A`",
0079          "z'",
0080          "\n",
0081          ",",
0082          "a",
0083          "f",
0084          "n",
0085          "r",
0086          "t",
0087          "v",
0088          "x",
0089          "c",
0090          ":",
0091          "=",
0092          "e",
0093          "",
0094          "",
0095          "",
0096          "",
0097          "",
0098          "",
0099          "",
0100          "",
0101          "E",
0102          "Q",
0103          "X",
0104          "C",
0105          "Z",
0106          "G",
0107          "!",
0108          "p",
0109          "P",
0110          "N",
0111          "gk",
0112          "K",
0113          "R",
0114    };
0115 
0116    return ((n >= (sizeof(messages) / sizeof(messages[1]))) ? "" : messages[n]);
0117 }
0118 
0119 inline const char*  get_default_error_string(regex_constants::error_type n)
0120 {
0121    static const char* const s_default_error_messages[] = {
0122       "Success",                                                            
0123       "No match",                                                           
0124       "Invalid regular expression.",                                        
0125       "Invalid collation character.",                                       
0126       "Invalid character class name, collating name, or character range.",  
0127       "Invalid or unterminated escape sequence.",                           
0128       "Invalid back reference: specified capturing group does not exist.",  
0129       "Unmatched [ or [^ in character class declaration.",                  
0130       "Unmatched marking parenthesis ( or \\(.",                            
0131       "Unmatched quantified repeat operator { or \\{.",                     
0132       "Invalid content of repeat range.",                                   
0133       "Invalid range end in character class",                               
0134       "Out of memory.",                                                     
0135       "Invalid preceding regular expression prior to repetition operator.", 
0136       "Premature end of regular expression",                                
0137       "Regular expression is too large.",                                   
0138       "Unmatched ) or \\)",                                                 
0139       "Empty regular expression.",                                          
0140       "The complexity of matching the regular expression exceeded predefined bounds.  "
0141       "Try refactoring the regular expression to make each choice made by the state machine unambiguous.  "
0142       "This exception is thrown to prevent \"eternal\" matches that take an "
0143       "indefinite period time to locate.",                                  
0144       "Ran out of stack space trying to match the regular expression.",     
0145       "Invalid or unterminated Perl (?...) sequence.",                      
0146       "Unknown error.",                                                     
0147    };
0148 
0149    return (n > ::boost::regex_constants::error_unknown) ? s_default_error_messages[::boost::regex_constants::error_unknown] : s_default_error_messages[n];
0150 }
0151 
0152 inline regex_constants::syntax_type  get_default_syntax_type(char c)
0153 {
0154    
0155    
0156    
0157    
0158    static regex_constants::syntax_type char_syntax[] = {
0159       regex_constants::syntax_char,        
0160       regex_constants::syntax_char,        
0161       regex_constants::syntax_char,        
0162       regex_constants::syntax_char,        
0163       regex_constants::syntax_char,        
0164       regex_constants::syntax_char,        
0165       regex_constants::syntax_char,        
0166       regex_constants::syntax_char,        
0167       regex_constants::syntax_char,        
0168       regex_constants::syntax_char,        
0169       regex_constants::syntax_newline,     
0170       regex_constants::syntax_char,        
0171       regex_constants::syntax_char,        
0172       regex_constants::syntax_char,        
0173       regex_constants::syntax_char,        
0174       regex_constants::syntax_char,        
0175       regex_constants::syntax_char,        
0176       regex_constants::syntax_char,        
0177       regex_constants::syntax_char,        
0178       regex_constants::syntax_char,        
0179       regex_constants::syntax_char,        
0180       regex_constants::syntax_char,        
0181       regex_constants::syntax_char,        
0182       regex_constants::syntax_char,        
0183       regex_constants::syntax_char,        
0184       regex_constants::syntax_char,        
0185       regex_constants::syntax_char,        
0186       regex_constants::syntax_char,        
0187       regex_constants::syntax_char,        
0188       regex_constants::syntax_char,        
0189       regex_constants::syntax_char,        
0190       regex_constants::syntax_char,        
0191       regex_constants::syntax_char,            
0192       regex_constants::syntax_not,        
0193       regex_constants::syntax_char,        
0194       regex_constants::syntax_hash,        
0195       regex_constants::syntax_dollar,        
0196       regex_constants::syntax_char,        
0197       regex_constants::syntax_char,        
0198       regex_constants::escape_type_end_buffer,  
0199       regex_constants::syntax_open_mark,        
0200       regex_constants::syntax_close_mark,        
0201       regex_constants::syntax_star,        
0202       regex_constants::syntax_plus,        
0203       regex_constants::syntax_comma,        
0204       regex_constants::syntax_dash,        
0205       regex_constants::syntax_dot,        
0206       regex_constants::syntax_char,        
0207       regex_constants::syntax_digit,        
0208       regex_constants::syntax_digit,        
0209       regex_constants::syntax_digit,        
0210       regex_constants::syntax_digit,        
0211       regex_constants::syntax_digit,        
0212       regex_constants::syntax_digit,        
0213       regex_constants::syntax_digit,        
0214       regex_constants::syntax_digit,        
0215       regex_constants::syntax_digit,        
0216       regex_constants::syntax_digit,        
0217       regex_constants::syntax_colon,        
0218       regex_constants::syntax_char,        
0219       regex_constants::escape_type_left_word, 
0220       regex_constants::syntax_equal,        
0221       regex_constants::escape_type_right_word, 
0222       regex_constants::syntax_question,        
0223       regex_constants::syntax_char,        
0224       regex_constants::syntax_char,        
0225       regex_constants::syntax_char,        
0226       regex_constants::syntax_char,        
0227       regex_constants::syntax_char,        
0228       regex_constants::syntax_char,        
0229       regex_constants::syntax_char,        
0230       regex_constants::syntax_char,        
0231       regex_constants::syntax_char,        
0232       regex_constants::syntax_char,        
0233       regex_constants::syntax_char,        
0234       regex_constants::syntax_char,        
0235       regex_constants::syntax_char,        
0236       regex_constants::syntax_char,        
0237       regex_constants::syntax_char,        
0238       regex_constants::syntax_char,        
0239       regex_constants::syntax_char,        
0240       regex_constants::syntax_char,        
0241       regex_constants::syntax_char,        
0242       regex_constants::syntax_char,        
0243       regex_constants::syntax_char,        
0244       regex_constants::syntax_char,        
0245       regex_constants::syntax_char,        
0246       regex_constants::syntax_char,        
0247       regex_constants::syntax_char,        
0248       regex_constants::syntax_char,        
0249       regex_constants::syntax_char,        
0250       regex_constants::syntax_open_set,        
0251       regex_constants::syntax_escape,        
0252       regex_constants::syntax_close_set,        
0253       regex_constants::syntax_caret,        
0254       regex_constants::syntax_char,        
0255       regex_constants::syntax_char,        
0256       regex_constants::syntax_char,        
0257       regex_constants::syntax_char,        
0258       regex_constants::syntax_char,        
0259       regex_constants::syntax_char,        
0260       regex_constants::syntax_char,        
0261       regex_constants::syntax_char,        
0262       regex_constants::syntax_char,        
0263       regex_constants::syntax_char,        
0264       regex_constants::syntax_char,        
0265       regex_constants::syntax_char,        
0266       regex_constants::syntax_char,        
0267       regex_constants::syntax_char,        
0268       regex_constants::syntax_char,        
0269       regex_constants::syntax_char,        
0270       regex_constants::syntax_char,        
0271       regex_constants::syntax_char,        
0272       regex_constants::syntax_char,        
0273       regex_constants::syntax_char,        
0274       regex_constants::syntax_char,        
0275       regex_constants::syntax_char,        
0276       regex_constants::syntax_char,        
0277       regex_constants::syntax_char,        
0278       regex_constants::syntax_char,        
0279       regex_constants::syntax_char,        
0280       regex_constants::syntax_char,        
0281       regex_constants::syntax_char,        
0282       regex_constants::syntax_open_brace,        
0283       regex_constants::syntax_or,        
0284       regex_constants::syntax_close_brace,        
0285       regex_constants::syntax_char,        
0286       regex_constants::syntax_char,        
0287       regex_constants::syntax_char,        
0288       regex_constants::syntax_char,        
0289       regex_constants::syntax_char,        
0290       regex_constants::syntax_char,        
0291       regex_constants::syntax_char,        
0292       regex_constants::syntax_char,        
0293       regex_constants::syntax_char,        
0294       regex_constants::syntax_char,        
0295       regex_constants::syntax_char,        
0296       regex_constants::syntax_char,        
0297       regex_constants::syntax_char,        
0298       regex_constants::syntax_char,        
0299       regex_constants::syntax_char,        
0300       regex_constants::syntax_char,        
0301       regex_constants::syntax_char,        
0302       regex_constants::syntax_char,        
0303       regex_constants::syntax_char,        
0304       regex_constants::syntax_char,        
0305       regex_constants::syntax_char,        
0306       regex_constants::syntax_char,        
0307       regex_constants::syntax_char,        
0308       regex_constants::syntax_char,        
0309       regex_constants::syntax_char,        
0310       regex_constants::syntax_char,        
0311       regex_constants::syntax_char,        
0312       regex_constants::syntax_char,        
0313       regex_constants::syntax_char,        
0314       regex_constants::syntax_char,        
0315       regex_constants::syntax_char,        
0316       regex_constants::syntax_char,        
0317       regex_constants::syntax_char,        
0318       regex_constants::syntax_char,        
0319       regex_constants::syntax_char,        
0320       regex_constants::syntax_char,        
0321       regex_constants::syntax_char,        
0322       regex_constants::syntax_char,        
0323       regex_constants::syntax_char,        
0324       regex_constants::syntax_char,        
0325       regex_constants::syntax_char,        
0326       regex_constants::syntax_char,        
0327       regex_constants::syntax_char,        
0328       regex_constants::syntax_char,        
0329       regex_constants::syntax_char,        
0330       regex_constants::syntax_char,        
0331       regex_constants::syntax_char,        
0332       regex_constants::syntax_char,        
0333       regex_constants::syntax_char,        
0334       regex_constants::syntax_char,        
0335       regex_constants::syntax_char,        
0336       regex_constants::syntax_char,        
0337       regex_constants::syntax_char,        
0338       regex_constants::syntax_char,        
0339       regex_constants::syntax_char,        
0340       regex_constants::syntax_char,        
0341       regex_constants::syntax_char,        
0342    };
0343 
0344    return char_syntax[(unsigned char)c];
0345 }
0346 
0347 inline regex_constants::escape_syntax_type  get_default_escape_syntax_type(char c)
0348 {
0349    
0350    
0351    
0352    
0353    static regex_constants::escape_syntax_type char_syntax[] = {
0354       regex_constants::escape_type_identity,        
0355       regex_constants::escape_type_identity,        
0356       regex_constants::escape_type_identity,        
0357       regex_constants::escape_type_identity,        
0358       regex_constants::escape_type_identity,        
0359       regex_constants::escape_type_identity,        
0360       regex_constants::escape_type_identity,        
0361       regex_constants::escape_type_identity,        
0362       regex_constants::escape_type_identity,        
0363       regex_constants::escape_type_identity,        
0364       regex_constants::escape_type_identity,     
0365       regex_constants::escape_type_identity,        
0366       regex_constants::escape_type_identity,        
0367       regex_constants::escape_type_identity,        
0368       regex_constants::escape_type_identity,        
0369       regex_constants::escape_type_identity,        
0370       regex_constants::escape_type_identity,        
0371       regex_constants::escape_type_identity,        
0372       regex_constants::escape_type_identity,        
0373       regex_constants::escape_type_identity,        
0374       regex_constants::escape_type_identity,        
0375       regex_constants::escape_type_identity,        
0376       regex_constants::escape_type_identity,        
0377       regex_constants::escape_type_identity,        
0378       regex_constants::escape_type_identity,        
0379       regex_constants::escape_type_identity,        
0380       regex_constants::escape_type_identity,        
0381       regex_constants::escape_type_identity,        
0382       regex_constants::escape_type_identity,        
0383       regex_constants::escape_type_identity,        
0384       regex_constants::escape_type_identity,        
0385       regex_constants::escape_type_identity,        
0386       regex_constants::escape_type_identity,            
0387       regex_constants::escape_type_identity,        
0388       regex_constants::escape_type_identity,        
0389       regex_constants::escape_type_identity,        
0390       regex_constants::escape_type_identity,        
0391       regex_constants::escape_type_identity,        
0392       regex_constants::escape_type_identity,        
0393       regex_constants::escape_type_end_buffer,        
0394       regex_constants::syntax_open_mark,        
0395       regex_constants::syntax_close_mark,        
0396       regex_constants::escape_type_identity,        
0397       regex_constants::syntax_plus,                 
0398       regex_constants::escape_type_identity,        
0399       regex_constants::escape_type_identity,        
0400       regex_constants::escape_type_identity,        
0401       regex_constants::escape_type_identity,        
0402       regex_constants::escape_type_decimal,        
0403       regex_constants::escape_type_backref,        
0404       regex_constants::escape_type_backref,        
0405       regex_constants::escape_type_backref,        
0406       regex_constants::escape_type_backref,        
0407       regex_constants::escape_type_backref,        
0408       regex_constants::escape_type_backref,        
0409       regex_constants::escape_type_backref,        
0410       regex_constants::escape_type_backref,        
0411       regex_constants::escape_type_backref,        
0412       regex_constants::escape_type_identity,        
0413       regex_constants::escape_type_identity,        
0414       regex_constants::escape_type_left_word,        
0415       regex_constants::escape_type_identity,        
0416       regex_constants::escape_type_right_word,        
0417       regex_constants::syntax_question,              
0418       regex_constants::escape_type_identity,         
0419       regex_constants::escape_type_start_buffer,     
0420       regex_constants::escape_type_not_word_assert,  
0421       regex_constants::escape_type_C,                
0422       regex_constants::escape_type_not_class,        
0423       regex_constants::escape_type_E,                
0424       regex_constants::escape_type_not_class,        
0425       regex_constants::escape_type_G,                
0426       regex_constants::escape_type_not_class,        
0427       regex_constants::escape_type_not_class,        
0428       regex_constants::escape_type_not_class,        
0429       regex_constants::escape_type_reset_start_mark, 
0430       regex_constants::escape_type_not_class,        
0431       regex_constants::escape_type_not_class,        
0432       regex_constants::escape_type_named_char,       
0433       regex_constants::escape_type_not_class,        
0434       regex_constants::escape_type_not_property,     
0435       regex_constants::escape_type_Q,                
0436       regex_constants::escape_type_line_ending,      
0437       regex_constants::escape_type_not_class,        
0438       regex_constants::escape_type_not_class,        
0439       regex_constants::escape_type_not_class,        
0440       regex_constants::escape_type_not_class,        
0441       regex_constants::escape_type_not_class,        
0442       regex_constants::escape_type_X,                
0443       regex_constants::escape_type_not_class,        
0444       regex_constants::escape_type_Z,                
0445       regex_constants::escape_type_identity,        
0446       regex_constants::escape_type_identity,        
0447       regex_constants::escape_type_identity,        
0448       regex_constants::escape_type_identity,        
0449       regex_constants::escape_type_identity,        
0450       regex_constants::escape_type_start_buffer,        
0451       regex_constants::escape_type_control_a,        
0452       regex_constants::escape_type_word_assert,        
0453       regex_constants::escape_type_ascii_control,        
0454       regex_constants::escape_type_class,        
0455       regex_constants::escape_type_e,        
0456       regex_constants::escape_type_control_f,       
0457       regex_constants::escape_type_extended_backref,  
0458       regex_constants::escape_type_class,        
0459       regex_constants::escape_type_class,        
0460       regex_constants::escape_type_class,        
0461       regex_constants::escape_type_extended_backref, 
0462       regex_constants::escape_type_class,        
0463       regex_constants::escape_type_class,        
0464       regex_constants::escape_type_control_n,       
0465       regex_constants::escape_type_class,           
0466       regex_constants::escape_type_property,        
0467       regex_constants::escape_type_class,           
0468       regex_constants::escape_type_control_r,       
0469       regex_constants::escape_type_class,           
0470       regex_constants::escape_type_control_t,       
0471       regex_constants::escape_type_class,         
0472       regex_constants::escape_type_control_v,       
0473       regex_constants::escape_type_class,           
0474       regex_constants::escape_type_hex,             
0475       regex_constants::escape_type_class,           
0476       regex_constants::escape_type_end_buffer,      
0477       regex_constants::syntax_open_brace,           
0478       regex_constants::syntax_or,                   
0479       regex_constants::syntax_close_brace,          
0480       regex_constants::escape_type_identity,        
0481       regex_constants::escape_type_identity,        
0482       regex_constants::escape_type_identity,        
0483       regex_constants::escape_type_identity,        
0484       regex_constants::escape_type_identity,        
0485       regex_constants::escape_type_identity,        
0486       regex_constants::escape_type_identity,        
0487       regex_constants::escape_type_identity,        
0488       regex_constants::escape_type_identity,        
0489       regex_constants::escape_type_identity,        
0490       regex_constants::escape_type_identity,        
0491       regex_constants::escape_type_identity,        
0492       regex_constants::escape_type_identity,        
0493       regex_constants::escape_type_identity,        
0494       regex_constants::escape_type_identity,        
0495       regex_constants::escape_type_identity,        
0496       regex_constants::escape_type_identity,        
0497       regex_constants::escape_type_identity,        
0498       regex_constants::escape_type_identity,        
0499       regex_constants::escape_type_identity,        
0500       regex_constants::escape_type_identity,        
0501       regex_constants::escape_type_identity,        
0502       regex_constants::escape_type_identity,        
0503       regex_constants::escape_type_identity,        
0504       regex_constants::escape_type_identity,        
0505       regex_constants::escape_type_identity,        
0506       regex_constants::escape_type_identity,        
0507       regex_constants::escape_type_identity,        
0508       regex_constants::escape_type_identity,        
0509       regex_constants::escape_type_identity,        
0510       regex_constants::escape_type_identity,        
0511       regex_constants::escape_type_identity,        
0512       regex_constants::escape_type_identity,        
0513       regex_constants::escape_type_identity,        
0514       regex_constants::escape_type_identity,        
0515       regex_constants::escape_type_identity,        
0516       regex_constants::escape_type_identity,        
0517       regex_constants::escape_type_identity,        
0518       regex_constants::escape_type_identity,        
0519       regex_constants::escape_type_identity,        
0520       regex_constants::escape_type_identity,        
0521       regex_constants::escape_type_identity,        
0522       regex_constants::escape_type_identity,        
0523       regex_constants::escape_type_identity,        
0524       regex_constants::escape_type_identity,        
0525       regex_constants::escape_type_identity,        
0526       regex_constants::escape_type_identity,        
0527       regex_constants::escape_type_identity,        
0528       regex_constants::escape_type_identity,        
0529       regex_constants::escape_type_identity,        
0530       regex_constants::escape_type_identity,        
0531       regex_constants::escape_type_identity,        
0532       regex_constants::escape_type_identity,        
0533       regex_constants::escape_type_identity,        
0534       regex_constants::escape_type_identity,        
0535       regex_constants::escape_type_identity,        
0536       regex_constants::escape_type_identity,        
0537    };
0538 
0539    return char_syntax[(unsigned char)c];
0540 }
0541 
0542 
0543 inline bool  is_combining_implementation(std::uint_least16_t c)
0544 {
0545    const std::uint_least16_t combining_ranges[] = { 0x0300, 0x0361,
0546                            0x0483, 0x0486,
0547                            0x0903, 0x0903,
0548                            0x093E, 0x0940,
0549                            0x0949, 0x094C,
0550                            0x0982, 0x0983,
0551                            0x09BE, 0x09C0,
0552                            0x09C7, 0x09CC,
0553                            0x09D7, 0x09D7,
0554                            0x0A3E, 0x0A40,
0555                            0x0A83, 0x0A83,
0556                            0x0ABE, 0x0AC0,
0557                            0x0AC9, 0x0ACC,
0558                            0x0B02, 0x0B03,
0559                            0x0B3E, 0x0B3E,
0560                            0x0B40, 0x0B40,
0561                            0x0B47, 0x0B4C,
0562                            0x0B57, 0x0B57,
0563                            0x0B83, 0x0B83,
0564                            0x0BBE, 0x0BBF,
0565                            0x0BC1, 0x0BCC,
0566                            0x0BD7, 0x0BD7,
0567                            0x0C01, 0x0C03,
0568                            0x0C41, 0x0C44,
0569                            0x0C82, 0x0C83,
0570                            0x0CBE, 0x0CBE,
0571                            0x0CC0, 0x0CC4,
0572                            0x0CC7, 0x0CCB,
0573                            0x0CD5, 0x0CD6,
0574                            0x0D02, 0x0D03,
0575                            0x0D3E, 0x0D40,
0576                            0x0D46, 0x0D4C,
0577                            0x0D57, 0x0D57,
0578                            0x0F7F, 0x0F7F,
0579                            0x20D0, 0x20E1,
0580                            0x3099, 0x309A,
0581                            0xFE20, 0xFE23,
0582                            0xffff, 0xffff, };
0583 
0584    const std::uint_least16_t* p = combining_ranges + 1;
0585    while (*p < c) p += 2;
0586    --p;
0587    if ((c >= *p) && (c <= *(p + 1)))
0588       return true;
0589    return false;
0590 }
0591 
0592 template <class charT>
0593 inline bool is_combining(charT c)
0594 {
0595    return (c <= static_cast<charT>(0)) ? false : ((c >= static_cast<charT>((std::numeric_limits<uint_least16_t>::max)())) ? false : is_combining_implementation(static_cast<unsigned short>(c)));
0596 }
0597 template <>
0598 inline bool is_combining<char>(char)
0599 {
0600    return false;
0601 }
0602 template <>
0603 inline bool is_combining<signed char>(signed char)
0604 {
0605    return false;
0606 }
0607 template <>
0608 inline bool is_combining<unsigned char>(unsigned char)
0609 {
0610    return false;
0611 }
0612 #ifdef _MSC_VER
0613 template<>
0614 inline bool is_combining<wchar_t>(wchar_t c)
0615 {
0616    return is_combining_implementation(static_cast<unsigned short>(c));
0617 }
0618 #elif !defined(__DECCXX) && !defined(__osf__) && !defined(__OSF__) && defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
0619 #if defined(WCHAR_MAX) && (WCHAR_MAX <= USHRT_MAX)
0620 template<>
0621 inline bool is_combining<wchar_t>(wchar_t c)
0622 {
0623    return is_combining_implementation(static_cast<unsigned short>(c));
0624 }
0625 #else
0626 template<>
0627 inline bool is_combining<wchar_t>(wchar_t c)
0628 {
0629    return (c >= (std::numeric_limits<uint_least16_t>::max)()) ? false : is_combining_implementation(static_cast<unsigned short>(c));
0630 }
0631 #endif
0632 #endif
0633 
0634 
0635 
0636 
0637 template <class charT>
0638 inline bool is_separator(charT c)
0639 {
0640    return BOOST_REGEX_MAKE_BOOL(
0641       (c == static_cast<charT>('\n'))
0642       || (c == static_cast<charT>('\r'))
0643       || (c == static_cast<charT>('\f'))
0644       || (static_cast<std::uint16_t>(c) == 0x2028u)
0645       || (static_cast<std::uint16_t>(c) == 0x2029u)
0646       || (static_cast<std::uint16_t>(c) == 0x85u));
0647 }
0648 template <>
0649 inline bool is_separator<char>(char c)
0650 {
0651    return BOOST_REGEX_MAKE_BOOL((c == '\n') || (c == '\r') || (c == '\f'));
0652 }
0653 
0654 
0655 
0656 
0657 inline std::string  lookup_default_collate_name(const std::string& name)
0658 {
0659    
0660    
0661    
0662    static const char* def_coll_names[] = {
0663    "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "alert", "backspace", "tab", "newline",
0664    "vertical-tab", "form-feed", "carriage-return", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK",
0665    "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "IS4", "IS3", "IS2", "IS1", "space", "exclamation-mark",
0666    "quotation-mark", "number-sign", "dollar-sign", "percent-sign", "ampersand", "apostrophe",
0667    "left-parenthesis", "right-parenthesis", "asterisk", "plus-sign", "comma", "hyphen",
0668    "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
0669    "colon", "semicolon", "less-than-sign", "equals-sign", "greater-than-sign",
0670    "question-mark", "commercial-at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
0671    "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "left-square-bracket", "backslash",
0672    "right-square-bracket", "circumflex", "underscore", "grave-accent", "a", "b", "c", "d", "e", "f",
0673    "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "left-curly-bracket",
0674    "vertical-line", "right-curly-bracket", "tilde", "DEL", "",
0675    };
0676 
0677    
0678    
0679    
0680    
0681    
0682 
0683    static const char* def_multi_coll[] = {
0684       "ae",
0685       "Ae",
0686       "AE",
0687       "ch",
0688       "Ch",
0689       "CH",
0690       "ll",
0691       "Ll",
0692       "LL",
0693       "ss",
0694       "Ss",
0695       "SS",
0696       "nj",
0697       "Nj",
0698       "NJ",
0699       "dz",
0700       "Dz",
0701       "DZ",
0702       "lj",
0703       "Lj",
0704       "LJ",
0705       "",
0706    };
0707 
0708    unsigned int i = 0;
0709    while (*def_coll_names[i])
0710    {
0711       if (def_coll_names[i] == name)
0712       {
0713          return std::string(1, char(i));
0714       }
0715       ++i;
0716    }
0717    i = 0;
0718    while (*def_multi_coll[i])
0719    {
0720       if (def_multi_coll[i] == name)
0721       {
0722          return def_multi_coll[i];
0723       }
0724       ++i;
0725    }
0726    return std::string();
0727 }
0728 
0729 
0730 
0731 
0732 
0733 template <class charT>
0734 struct character_pointer_range
0735 {
0736    const charT* p1;
0737    const charT* p2;
0738 
0739    bool operator < (const character_pointer_range& r)const
0740    {
0741       return std::lexicographical_compare(p1, p2, r.p1, r.p2);
0742    }
0743    bool operator == (const character_pointer_range& r)const
0744    {
0745       
0746       
0747       
0748       
0749 #ifdef __cpp_lib_robust_nonmodifying_seq_ops
0750       return std::equal(p1, p2, r.p1, r.p2);
0751 #elif defined(BOOST_REGEX_MSVC)
0752       if (((p2 - p1) != (r.p2 - r.p1)))
0753          return false;
0754       const charT* with = r.p1;
0755       const charT* pos = p1;
0756       while (pos != p2)
0757          if (*pos++ != *with++) return false;
0758       return true;
0759 
0760 #else
0761       return ((p2 - p1) == (r.p2 - r.p1)) && std::equal(p1, p2, r.p1);
0762 #endif
0763    }
0764 };
0765 template <class charT>
0766 int get_default_class_id(const charT* p1, const charT* p2)
0767 {
0768    static const charT data[73] = {
0769       'a', 'l', 'n', 'u', 'm',
0770       'a', 'l', 'p', 'h', 'a',
0771       'b', 'l', 'a', 'n', 'k',
0772       'c', 'n', 't', 'r', 'l',
0773       'd', 'i', 'g', 'i', 't',
0774       'g', 'r', 'a', 'p', 'h',
0775       'l', 'o', 'w', 'e', 'r',
0776       'p', 'r', 'i', 'n', 't',
0777       'p', 'u', 'n', 'c', 't',
0778       's', 'p', 'a', 'c', 'e',
0779       'u', 'n', 'i', 'c', 'o', 'd', 'e',
0780       'u', 'p', 'p', 'e', 'r',
0781       'v',
0782       'w', 'o', 'r', 'd',
0783       'x', 'd', 'i', 'g', 'i', 't',
0784    };
0785 
0786    static const character_pointer_range<charT> ranges[21] =
0787    {
0788       {data+0, data+5,}, 
0789       {data+5, data+10,}, 
0790       {data+10, data+15,}, 
0791       {data+15, data+20,}, 
0792       {data+20, data+21,}, 
0793       {data+20, data+25,}, 
0794       {data+25, data+30,}, 
0795       {data+29, data+30,}, 
0796       {data+30, data+31,}, 
0797       {data+30, data+35,}, 
0798       {data+35, data+40,}, 
0799       {data+40, data+45,}, 
0800       {data+45, data+46,}, 
0801       {data+45, data+50,}, 
0802       {data+57, data+58,}, 
0803       {data+50, data+57,}, 
0804       {data+57, data+62,}, 
0805       {data+62, data+63,}, 
0806       {data+63, data+64,}, 
0807       {data+63, data+67,}, 
0808       {data+67, data+73,}, 
0809    };
0810    const character_pointer_range<charT>* ranges_begin = ranges;
0811    const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
0812 
0813    character_pointer_range<charT> t = { p1, p2, };
0814    const character_pointer_range<charT>* p = std::lower_bound(ranges_begin, ranges_end, t);
0815    if((p != ranges_end) && (t == *p))
0816       return static_cast<int>(p - ranges);
0817    return -1;
0818 }
0819 
0820 
0821 
0822 
0823 template <class charT>
0824 std::ptrdiff_t global_length(const charT* p)
0825 {
0826    std::ptrdiff_t n = 0;
0827    while(*p)
0828    {
0829       ++p;
0830       ++n;
0831    }
0832    return n;
0833 }
0834 template<>
0835 inline std::ptrdiff_t global_length<char>(const char* p)
0836 {
0837    return (std::strlen)(p);
0838 }
0839 #ifndef BOOST_NO_WREGEX
0840 template<>
0841 inline std::ptrdiff_t global_length<wchar_t>(const wchar_t* p)
0842 {
0843    return (std::ptrdiff_t)(std::wcslen)(p);
0844 }
0845 #endif
0846 template <class charT>
0847 inline charT  global_lower(charT c)
0848 {
0849    return c;
0850 }
0851 template <class charT>
0852 inline charT  global_upper(charT c)
0853 {
0854    return c;
0855 }
0856 
0857 inline char  do_global_lower(char c)
0858 {
0859    return static_cast<char>((std::tolower)((unsigned char)c));
0860 }
0861 
0862 inline char  do_global_upper(char c)
0863 {
0864    return static_cast<char>((std::toupper)((unsigned char)c));
0865 }
0866 #ifndef BOOST_NO_WREGEX
0867 inline wchar_t  do_global_lower(wchar_t c)
0868 {
0869    return (std::towlower)(c);
0870 }
0871 
0872 inline wchar_t  do_global_upper(wchar_t c)
0873 {
0874    return (std::towupper)(c);
0875 }
0876 #endif
0877 
0878 
0879 
0880 
0881 
0882 
0883 
0884 
0885 
0886 
0887 template<> inline char  global_lower<char>(char c) { return do_global_lower(c); }
0888 template<> inline char  global_upper<char>(char c) { return do_global_upper(c); }
0889 #ifndef BOOST_NO_WREGEX
0890 template<> inline wchar_t  global_lower<wchar_t>(wchar_t c) { return do_global_lower(c); }
0891 template<> inline wchar_t  global_upper<wchar_t>(wchar_t c) { return do_global_upper(c); }
0892 #endif
0893 
0894 template <class charT>
0895 int global_value(charT c)
0896 {
0897    static const charT zero = '0';
0898    static const charT nine = '9';
0899    static const charT a = 'a';
0900    static const charT f = 'f';
0901    static const charT A = 'A';
0902    static const charT F = 'F';
0903 
0904    if(c > f) return -1;
0905    if(c >= a) return 10 + (c - a);
0906    if(c > F) return -1;
0907    if(c >= A) return 10 + (c - A);
0908    if(c > nine) return -1;
0909    if(c >= zero) return c - zero;
0910    return -1;
0911 }
0912 template <class charT, class traits>
0913 std::intmax_t global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
0914 {
0915    (void)t; 
0916    std::intmax_t limit = (std::numeric_limits<std::intmax_t>::max)() / radix;
0917    std::intmax_t next_value = t.value(*p1, radix);
0918    if((p1 == p2) || (next_value < 0) || (next_value >= radix))
0919       return -1;
0920    std::intmax_t result = 0;
0921    while(p1 != p2)
0922    {
0923       next_value = t.value(*p1, radix);
0924       if((next_value < 0) || (next_value >= radix))
0925          break;
0926       result *= radix;
0927       result += next_value;
0928       ++p1;
0929       if (result > limit)
0930          return -1;
0931    }
0932    return result;
0933 }
0934 
0935 template <class charT>
0936 inline typename std::enable_if<(sizeof(charT) > 1), const charT*>::type get_escape_R_string()
0937 {
0938 #ifdef BOOST_REGEX_MSVC
0939 #  pragma warning(push)
0940 #  pragma warning(disable:4309 4245)
0941 #endif
0942    static const charT e1[] = { '(', '?', '-', 'x', ':', '(', '?', '>', '\x0D', '\x0A', '?',
0943       '|', '[', '\x0A', '\x0B', '\x0C', static_cast<charT>(0x85), static_cast<charT>(0x2028),
0944       static_cast<charT>(0x2029), ']', ')', ')', '\0' };
0945    static const charT e2[] = { '(', '?', '-', 'x', ':', '(', '?', '>', '\x0D', '\x0A', '?',
0946       '|', '[', '\x0A', '\x0B', '\x0C', static_cast<charT>(0x85), ']', ')', ')', '\0' };
0947 
0948    charT c = static_cast<charT>(0x2029u);
0949    bool b = (static_cast<unsigned>(c) == 0x2029u);
0950 
0951    return (b ? e1 : e2);
0952 #ifdef BOOST_REGEX_MSVC
0953 #  pragma warning(pop)
0954 #endif
0955 }
0956 
0957 template <class charT>
0958 inline typename std::enable_if<(sizeof(charT) == 1), const charT*>::type get_escape_R_string()
0959 {
0960 #ifdef BOOST_REGEX_MSVC
0961 #  pragma warning(push)
0962 #  pragma warning(disable:4309 4245)
0963 #endif
0964    static const charT e2[] = { 
0965       static_cast<charT>('('), 
0966       static_cast<charT>('?'), 
0967       static_cast<charT>('-'), 
0968       static_cast<charT>('x'), 
0969       static_cast<charT>(':'), 
0970       static_cast<charT>('('), 
0971       static_cast<charT>('?'), 
0972       static_cast<charT>('>'), 
0973       static_cast<charT>('\x0D'), 
0974       static_cast<charT>('\x0A'), 
0975       static_cast<charT>('?'),
0976       static_cast<charT>('|'), 
0977       static_cast<charT>('['), 
0978       static_cast<charT>('\x0A'), 
0979       static_cast<charT>('\x0B'), 
0980       static_cast<charT>('\x0C'), 
0981       static_cast<charT>('\x85'), 
0982       static_cast<charT>(']'), 
0983       static_cast<charT>(')'), 
0984       static_cast<charT>(')'), 
0985       static_cast<charT>('\0') 
0986    };
0987    return e2;
0988 #ifdef BOOST_REGEX_MSVC
0989 #  pragma warning(pop)
0990 #endif
0991 }
0992 
0993 } 
0994 } 
0995 
0996 #endif