3 * Copyright (c) 1998-2002
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
13 * LOCATION: see http://www.boost.org for most recent version.
14 * FILE: w32_regex_traits.cpp
15 * VERSION: see <boost/version.hpp>
16 * DESCRIPTION: Implements the w32_regex_traits<charT> traits class
19 #define BOOST_REGEX_SOURCE
26 #include <boost/regex/regex_traits.hpp>
27 #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
28 #include <boost/cregex.hpp>
30 #include <boost/regex/v3/regex_synch.hpp>
31 #include <boost/regex/v3/regex_cstring.hpp>
33 #include <boost/regex/v4/regex_synch.hpp>
34 #include <boost/regex/v4/regex_cstring.hpp>
36 #include <boost/scoped_array.hpp>
40 // VC6 needs to link to user32.lib, as do all compilers that
41 // claim to be VC6/7 compatible:
43 #if defined(_MSC_VER) && !defined(__BORLANDC__)
44 #pragma comment(lib, "user32.lib")
52 boost::uint_fast32_t re_char_class_id[] = {
53 boost::re_detail::w32_traits_base::char_class_alnum,
54 boost::re_detail::w32_traits_base::char_class_alpha,
55 boost::re_detail::w32_traits_base::char_class_cntrl,
56 boost::re_detail::w32_traits_base::char_class_digit,
57 boost::re_detail::w32_traits_base::char_class_graph,
58 boost::re_detail::w32_traits_base::char_class_lower,
59 boost::re_detail::w32_traits_base::char_class_print,
60 boost::re_detail::w32_traits_base::char_class_punct,
61 boost::re_detail::w32_traits_base::char_class_space,
62 boost::re_detail::w32_traits_base::char_class_upper,
63 boost::re_detail::w32_traits_base::char_class_xdigit,
64 boost::re_detail::w32_traits_base::char_class_blank,
65 boost::re_detail::w32_traits_base::char_class_word,
66 boost::re_detail::w32_traits_base::char_class_unicode,
69 const char* re_char_class_names[] = {
86 std::string* pclasses = 0;
87 const unsigned int re_classes_max = 14;
97 collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4)
98 : name(p1, p2), value(p3, p4) {}
101 std::list<collate_name_t>* pcoll_names = 0;
105 #ifndef BOOST_RE_MESSAGE_BASE
106 #define BOOST_RE_MESSAGE_BASE 0
109 HINSTANCE hresmod = 0;
111 char* re_custom_error_messages[] = {
140 unsigned int entry_count = 0;
141 bool is_init = false;
145 map_size = UCHAR_MAX + 1
148 #ifndef BOOST_NO_WREGEX
150 boost::regex_wchar_type re_zero_w;
151 boost::regex_wchar_type re_ten_w;
153 bool isPlatformNT = false;
157 boost::regex_wchar_type c;
161 std::list<syntax_map_t>* syntax;
165 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id);
167 std::size_t BOOST_REGEX_CALL get_message(boost::regex_wchar_type* buf, std::size_t len, unsigned id)
169 std::size_t size = _re_get_message(static_cast<char*>(0), 0, id);
172 boost::scoped_array<char> cb(new char[size]);
173 _re_get_message(cb.get(), size, id);
174 size = boost::w32_regex_traits<boost::regex_wchar_type>::strwiden(buf, len, cb.get());
178 inline std::size_t BOOST_REGEX_CALL get_message(char* buf, std::size_t len, unsigned id)
180 return _re_get_message(buf, len, id);
183 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id)
186 // get the customised message if any:
189 std::size_t size = 0;
191 size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255);
196 // now get the default message if any:
197 return boost::re_detail::re_get_default_message(buf, len, id);
200 const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id)
203 #ifdef BOOST_HAS_THREADS
204 boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock);
206 if(re_custom_error_messages[id] == 0)
209 _re_get_message(buf, 256, id + 200);
212 re_custom_error_messages[id] = boost::re_detail::re_strdup(buf);
213 return re_custom_error_messages[id];
215 return boost::re_detail::re_default_error_messages[id];
217 return re_custom_error_messages[id];
226 char w32_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0};
228 void BOOST_REGEX_CALL w32_traits_base::do_init()
234 // update the messages first:
236 if(*regex_message_catalogue)
238 hresmod = LoadLibraryA(regex_message_catalogue);
241 std::string s("Unable to open dll: ");
242 std::runtime_error err(s + regex_message_catalogue);
243 boost::throw_exception(err);
247 for(i = 0; i < REG_E_UNKNOWN; ++i)
249 if(re_custom_error_messages[i])
251 re_detail::re_strfree(re_custom_error_messages[i]);
252 re_custom_error_messages[i] = 0;
255 #ifndef BOOST_NO_WREGEX
257 // wide character strings:
258 syntax = new std::list<syntax_map_t>();
259 OSVERSIONINFO VersionInformation = {0};
260 VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
261 GetVersionEx(&VersionInformation);
262 if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
266 // now the character classes:
267 pclasses = new std::string[re_classes_max];
268 char buf[map_size+2];
269 for(i = 0; i < re_classes_max; ++i)
271 get_message(buf, 256, i+300);
274 // start by updating the syntax map:
275 std::memset(syntax_map, syntax_char, map_size);
276 for(i = 1; i < syntax_max; ++i)
279 get_message(buf, map_size, i+100);
282 syntax_map[(unsigned char)*ptr] = (unsigned char)i;
286 // now update the character class map,
287 // and lower case map:
288 for(i = 0; i < map_size; ++i)
292 buf[map_size] = (char)0;
293 GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
294 for(i = 0; i < map_size; ++i)
296 class_map[i] &= char_class_win;
298 class_map[(unsigned char)'_'] |= char_class_underscore;
299 LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
301 // update our collating elements:
302 pcoll_names = new std::list<collate_name_t>();
304 get_message(buf, 256, i);
307 char* p1, *p2, *p3, *p4;;
309 while(*p1 && isspace(*p1))++p1;
311 while(*p2 && !isspace(*p2))++p2;
313 while(*p3 && isspace(*p3))++p3;
315 while(*p4 && !isspace(*p4))++p4;
316 pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
318 get_message(buf, 256, i);
321 const char* p = "zero";
322 if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
324 jm_assert(s.size() == 1);
325 re_zero = *s.c_str();
331 if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
333 jm_assert(s.size() == 1);
338 #ifndef BOOST_NO_WREGEX
341 std::basic_string<regex_wchar_type> ws;
342 const regex_wchar_type* wp = (const regex_wchar_type*)L"zero";
343 if(w32_regex_traits<regex_wchar_type>::lookup_collatename(ws, wp, wp+4))
345 jm_assert(ws.size() == 1);
346 re_zero_w = *ws.c_str();
349 re_zero_w = (regex_wchar_type)L'0';
351 wp = (const regex_wchar_type*)L"ten";
352 if(w32_regex_traits<regex_wchar_type>::lookup_collatename(ws, wp, wp+3))
354 jm_assert(ws.size() == 1);
355 re_ten_w = *ws.c_str();
360 regex_wchar_type wbuf[256];
363 for(i = 1; i < syntax_max; ++i)
365 regex_wchar_type* ptr = wbuf;
366 get_message(wbuf, 256, i+100);
371 syntax->push_back(sm);
374 #endif // BOOST_NO_WREGEX
378 void BOOST_REGEX_CALL w32_traits_base::do_free()
385 #ifndef BOOST_NO_WREGEX
391 FreeLibrary(hresmod);
394 for(int i = 0; i < REG_E_UNKNOWN; ++i)
396 if(re_custom_error_messages[i])
398 re_detail::re_strfree(re_custom_error_messages[i]);
399 re_custom_error_messages[i] = 0;
405 std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
407 return re_get_error_str(id);
410 boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
414 for(i = 0; i < re_classes_max; ++i)
418 return re_char_class_id[i];
421 for(i = 0; i < re_classes_max; ++i)
423 if(std::strcmp(re_char_class_names[i], p) == 0)
425 return re_char_class_id[i];
431 bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
434 std::list<collate_name_t>::iterator first, last;
435 first = pcoll_names->begin();
436 last = pcoll_names->end();
439 if((*first).name == p)
441 buf = (*first).value;
447 bool result = re_detail::re_lookup_def_collate_name(buf, p);
448 if((result == 0) && (std::strlen(p) == 1))
456 std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
459 #ifdef BOOST_HAS_THREADS
460 re_detail::cs_guard g(*re_detail::p_re_lock);
462 if(sizeof(regex_message_catalogue) <= l.size())
464 std::string old(regex_message_catalogue);
465 std::strcpy(regex_message_catalogue, l.c_str());
469 unsigned char w32_traits_base::syntax_map[map_size];
470 unsigned short w32_traits_base::class_map[map_size];
471 char w32_traits_base::lower_case_map[map_size];
473 } // namespace re_detail
475 w32_regex_traits<char> w32_regex_traits<char>::i;
477 void BOOST_REGEX_CALL w32_regex_traits<char>::update()
480 #ifdef BOOST_HAS_THREADS
481 re_detail::cs_guard g(*re_detail::p_re_lock);
486 w32_regex_traits<char>::w32_regex_traits()
489 #ifdef BOOST_HAS_THREADS
490 re_detail::re_init_threads();
491 re_detail::cs_guard g(*re_detail::p_re_lock);
496 w32_regex_traits<char>::~w32_regex_traits()
499 #ifdef BOOST_HAS_THREADS
500 re_detail::cs_guard g(*re_detail::p_re_lock);
502 // add reference to static member here to ensure
503 // that the linker includes it in the .exe:
504 if((--entry_count == 0) && (0 != &w32_regex_traits<char>::i) && is_init)
506 #ifdef BOOST_HAS_THREADS
508 re_detail::re_free_threads();
512 void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
515 size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
516 if(n == (size_t)(-1))
521 scoped_array<char> buf(new char[n+1]);
522 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), (int)n);
523 if(n == (size_t)(-1))
531 void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
534 for(unsigned int i = 0; i < out.size(); ++i)
536 if((out[i] == 1) && (i+1 < out.size()))
545 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
547 if(is_class(c, char_class_digit))
549 if(is_class(c, char_class_xdigit))
550 return 10 + translate(c, true) - translate(re_ten, true);
551 return -1; // error!!
554 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
559 // if radix is less than zero, then restrict
560 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
562 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
569 maxval = (unsigned int)-1;
573 unsigned int result = 0;
574 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
575 while((first != last) && is_class(*first, type) && (result <= maxval))
578 result += toi(*first);
584 #ifndef BOOST_NO_WREGEX
586 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::lookup_collatename(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
589 std::basic_string<regex_wchar_type> s(first, last);
590 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
591 scoped_array<char> buf(new char[len]);
592 strnarrow(buf.get(), len, s.c_str());
594 bool result = base_type::do_lookup_collate(t_out, buf.get());
595 if(t_out.size() == 0) result = false;
600 len = strwiden(static_cast<regex_wchar_type*>(0), 0, t_out.c_str());
601 scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
602 strwiden(wb.get(), len, t_out.c_str());
606 out.append(1,(regex_wchar_type)0);
611 unsigned int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::syntax_type(size_type c)
614 std::list<syntax_map_t>::const_iterator first, last;
615 first = syntax->begin();
616 last = syntax->end();
619 if((size_type)(uchar_type)((*first).c) == c)
620 return (*first).type;
626 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::do_lookup_collate(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
629 std::basic_string<regex_wchar_type> s(first, last);
630 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
631 scoped_array<char> buf(new char[len]);
632 strnarrow(buf.get(), len, s.c_str());
634 bool result = base_type::do_lookup_collate(t_out, buf.get());
637 len = strwiden(static_cast<regex_wchar_type*>(0), 0, t_out.c_str());
638 scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
639 strwiden(wb.get(), len, t_out.c_str());
646 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::update()
649 #ifdef BOOST_HAS_THREADS
650 re_detail::cs_guard g(*re_detail::p_re_lock);
655 w32_regex_traits<regex_wchar_type>::w32_regex_traits()
658 #ifdef BOOST_HAS_THREADS
659 re_detail::re_init_threads();
660 re_detail::cs_guard g(*re_detail::p_re_lock);
665 w32_regex_traits<regex_wchar_type>::~w32_regex_traits()
668 #ifdef BOOST_HAS_THREADS
669 re_detail::cs_guard g(*re_detail::p_re_lock);
671 // add reference to static member here to ensure
672 // that the linker includes it in the .exe:
673 if((--entry_count == 0) && (0 != &w32_regex_traits<regex_wchar_type>::init_) && is_init)
675 #ifdef BOOST_HAS_THREADS
677 re_detail::re_free_threads();
681 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::do_iswclass(regex_wchar_type c, boost::uint_fast32_t f)
685 return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
687 if(f & char_class_unicode)
689 else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, (const wchar_t*)&c, 1, &mask))
690 return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win);
691 else if((f & char_class_graph) == char_class_graph)
692 return true; // all wide characters are considered "graphics"
696 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::transform(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
699 scoped_array<char> alt;
702 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, 0, 0);
705 n = strnarrow(static_cast<char*>(0), 0, in.c_str());
706 alt.reset(new char[n+1]);
707 strnarrow(alt.get(), n+1, in.c_str());
708 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0);
710 if((n == (size_t)(-1)) || (n == 0))
715 scoped_array<regex_wchar_type> buf(new regex_wchar_type[n+1]);
716 // under win32 we get mapped to an array of bytes
717 // not characters; since the underlying engine has to
718 // deal with chars we widen the bytes to regex_wchar_type to ensure
719 // the sort order remains unchanged when we compare.
720 scoped_array<char> t(new char[n+1]);
722 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), (int)n);
724 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n);
729 buf[i] = (regex_wchar_type)(unsigned char)t[i];
731 if(n == (size_t)(-1))
739 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::transform_primary(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
742 for(unsigned int i = 0; i < out.size(); ++i)
744 if((out[i] == 1) && ((i + 1) < out.size()))
753 int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::toi(regex_wchar_type c)
755 if(is_class(c, char_class_digit))
756 return c - re_zero_w;
757 if(is_class(c, char_class_xdigit))
758 return 10 + translate(c, true) - translate(re_ten_w, true);
759 return -1; // error!!
762 int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::toi(const regex_wchar_type*& first, const regex_wchar_type* last, int radix)
767 // if radix is less than zero, then restrict
768 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
770 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
777 maxval = (unsigned int)-1;
781 unsigned int result = 0;
782 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
783 while((first != last) && is_class(*first, type) && (result <= maxval))
786 result += toi(*first);
792 boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last)
794 std::basic_string<regex_wchar_type> s(first, last);
795 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
796 scoped_array<char> buf(new char[len]);
797 strnarrow(buf.get(), len, s.c_str());
798 boost::uint_fast32_t result = do_lookup_class(buf.get());
802 regex_wchar_type BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::wtolower(regex_wchar_type c)
806 return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
811 w32_regex_traits<regex_wchar_type> w32_regex_traits<regex_wchar_type>::init_;
813 std::size_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2)
816 std::size_t size = WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, 0, 0, 0);
819 return WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, (int)len, 0, 0);
822 std::size_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::strwiden(regex_wchar_type *s1, std::size_t len, const char *s2)
825 std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, (wchar_t*)s1, 0);
828 return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, (wchar_t*)s1, (int)len);
831 unsigned short w32_regex_traits<regex_wchar_type>::wide_unicode_classes[] = {
832 re_detail::w32_traits_base::char_class_cntrl, // '' 0
833 re_detail::w32_traits_base::char_class_cntrl, // '' 1
834 re_detail::w32_traits_base::char_class_cntrl, // '' 2
835 re_detail::w32_traits_base::char_class_cntrl, // '' 3
836 re_detail::w32_traits_base::char_class_cntrl, // '' 4
837 re_detail::w32_traits_base::char_class_cntrl, // '' 5
838 re_detail::w32_traits_base::char_class_cntrl, // '' 6
839 re_detail::w32_traits_base::char_class_cntrl, // '' 7
840 re_detail::w32_traits_base::char_class_cntrl, // '' 8
841 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // '' 9
842 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 10
843 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 11
844 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 12
845 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 13
846 re_detail::w32_traits_base::char_class_cntrl, // '.' 14
847 re_detail::w32_traits_base::char_class_cntrl, // '.' 15
848 re_detail::w32_traits_base::char_class_cntrl, // '.' 16
849 re_detail::w32_traits_base::char_class_cntrl, // '.' 17
850 re_detail::w32_traits_base::char_class_cntrl, // '.' 18
851 re_detail::w32_traits_base::char_class_cntrl, // '.' 19
852 re_detail::w32_traits_base::char_class_cntrl, // '.' 20
853 re_detail::w32_traits_base::char_class_cntrl, // '.' 21
854 re_detail::w32_traits_base::char_class_cntrl, // '.' 22
855 re_detail::w32_traits_base::char_class_cntrl, // '.' 23
856 re_detail::w32_traits_base::char_class_cntrl, // '.' 24
857 re_detail::w32_traits_base::char_class_cntrl, // '' 25
858 re_detail::w32_traits_base::char_class_cntrl, // '' 26
859 re_detail::w32_traits_base::char_class_cntrl, // '' 27
860 re_detail::w32_traits_base::char_class_cntrl, // '.' 28
861 re_detail::w32_traits_base::char_class_cntrl, // '.' 29
862 re_detail::w32_traits_base::char_class_cntrl, // '.' 30
863 re_detail::w32_traits_base::char_class_cntrl, // '.' 31
864 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 32
865 re_detail::w32_traits_base::char_class_punct, // '!' 33
866 re_detail::w32_traits_base::char_class_punct, // '"' 34
867 re_detail::w32_traits_base::char_class_punct, // '#' 35
868 re_detail::w32_traits_base::char_class_punct, // '$' 36
869 re_detail::w32_traits_base::char_class_punct, // '%' 37
870 re_detail::w32_traits_base::char_class_punct, // '&' 38
871 re_detail::w32_traits_base::char_class_punct, // ''' 39
872 re_detail::w32_traits_base::char_class_punct, // '(' 40
873 re_detail::w32_traits_base::char_class_punct, // ')' 41
874 re_detail::w32_traits_base::char_class_punct, // '*' 42
875 re_detail::w32_traits_base::char_class_punct, // '+' 43
876 re_detail::w32_traits_base::char_class_punct, // ',' 44
877 re_detail::w32_traits_base::char_class_punct, // '-' 45
878 re_detail::w32_traits_base::char_class_punct, // '.' 46
879 re_detail::w32_traits_base::char_class_punct, // '/' 47
880 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '0' 48
881 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '1' 49
882 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '2' 50
883 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '3' 51
884 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '4' 52
885 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '5' 53
886 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '6' 54
887 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '7' 55
888 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '8' 56
889 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '9' 57
890 re_detail::w32_traits_base::char_class_punct, // ':' 58
891 re_detail::w32_traits_base::char_class_punct, // ';' 59
892 re_detail::w32_traits_base::char_class_punct, // '<' 60
893 re_detail::w32_traits_base::char_class_punct, // '=' 61
894 re_detail::w32_traits_base::char_class_punct, // '>' 62
895 re_detail::w32_traits_base::char_class_punct, // '?' 63
896 re_detail::w32_traits_base::char_class_punct, // '@' 64
897 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'A' 65
898 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'B' 66
899 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'C' 67
900 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'D' 68
901 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'E' 69
902 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit, // 'F' 70
903 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'G' 71
904 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'H' 72
905 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'I' 73
906 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'J' 74
907 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'K' 75
908 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'L' 76
909 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'M' 77
910 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'N' 78
911 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'O' 79
912 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'P' 80
913 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Q' 81
914 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'R' 82
915 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'S' 83
916 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'T' 84
917 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'U' 85
918 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'V' 86
919 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'W' 87
920 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'X' 88
921 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Y' 89
922 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Z' 90
923 re_detail::w32_traits_base::char_class_punct, // '[' 91
924 re_detail::w32_traits_base::char_class_punct, // '\' 92
925 re_detail::w32_traits_base::char_class_punct, // ']' 93
926 re_detail::w32_traits_base::char_class_punct, // '^' 94
927 re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore, // '_' 95
928 re_detail::w32_traits_base::char_class_punct, // '`' 96
929 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'a' 97
930 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'b' 98
931 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'c' 99
932 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'd' 100
933 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'e' 101
934 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower | re_detail::w32_traits_base::char_class_xdigit, // 'f' 102
935 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'g' 103
936 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'h' 104
937 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'i' 105
938 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'j' 106
939 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'k' 107
940 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'l' 108
941 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'm' 109
942 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'n' 110
943 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'o' 111
944 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'p' 112
945 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'q' 113
946 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'r' 114
947 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 's' 115
948 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 't' 116
949 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'u' 117
950 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'v' 118
951 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'w' 119
952 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'x' 120
953 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'y' 121
954 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'z' 122
955 re_detail::w32_traits_base::char_class_punct, // '{' 123
956 re_detail::w32_traits_base::char_class_punct, // '|' 124
957 re_detail::w32_traits_base::char_class_punct, // '}' 125
958 re_detail::w32_traits_base::char_class_punct, // '~' 126
960 re_detail::w32_traits_base::char_class_cntrl, // '
\7f' 127
961 re_detail::w32_traits_base::char_class_cntrl, // '
\80' 128
962 re_detail::w32_traits_base::char_class_cntrl, // '
\81' 129
963 re_detail::w32_traits_base::char_class_cntrl, // '
\82' 130
964 re_detail::w32_traits_base::char_class_cntrl, // '
\83' 131
965 re_detail::w32_traits_base::char_class_cntrl, // '
\84' 132
966 re_detail::w32_traits_base::char_class_cntrl, // '
\85' 133
967 re_detail::w32_traits_base::char_class_cntrl, // '
\86' 134
968 re_detail::w32_traits_base::char_class_cntrl, // '
\87' 135
969 re_detail::w32_traits_base::char_class_cntrl, // '
\88' 136
970 re_detail::w32_traits_base::char_class_cntrl, // '
\89' 137
971 re_detail::w32_traits_base::char_class_cntrl, // '
\8a' 138
972 re_detail::w32_traits_base::char_class_cntrl, // '
\8b' 139
973 re_detail::w32_traits_base::char_class_cntrl, // '
\8c' 140
974 re_detail::w32_traits_base::char_class_cntrl, // '
\8d' 141
975 re_detail::w32_traits_base::char_class_cntrl, // '
\8e' 142
976 re_detail::w32_traits_base::char_class_cntrl, // '
\8f' 143
977 re_detail::w32_traits_base::char_class_cntrl, // '
\90' 144
978 re_detail::w32_traits_base::char_class_cntrl, // '
\91' 145
979 re_detail::w32_traits_base::char_class_cntrl, // '
\92' 146
980 re_detail::w32_traits_base::char_class_cntrl, // '
\93' 147
981 re_detail::w32_traits_base::char_class_cntrl, // '
\94' 148
982 re_detail::w32_traits_base::char_class_cntrl, // '
\95' 149
983 re_detail::w32_traits_base::char_class_cntrl, // '
\96' 150
984 re_detail::w32_traits_base::char_class_cntrl, // '
\97' 151
985 re_detail::w32_traits_base::char_class_cntrl, // '
\98' 152
986 re_detail::w32_traits_base::char_class_cntrl, // '
\99' 153
987 re_detail::w32_traits_base::char_class_cntrl, // '
\9a' 154
988 re_detail::w32_traits_base::char_class_cntrl, // '
\9b' 155
989 re_detail::w32_traits_base::char_class_cntrl, // '
\9c' 156
990 re_detail::w32_traits_base::char_class_cntrl, // '
\9d' 157
991 re_detail::w32_traits_base::char_class_cntrl, // '
\9e' 158
992 re_detail::w32_traits_base::char_class_cntrl, // '
\9f' 159
993 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 160
994 re_detail::w32_traits_base::char_class_punct, // '¡' 161
995 re_detail::w32_traits_base::char_class_punct, // '¢' 162
996 re_detail::w32_traits_base::char_class_punct, // '£' 163
997 re_detail::w32_traits_base::char_class_punct, // '¤' 164
998 re_detail::w32_traits_base::char_class_punct, // '¥' 165
999 re_detail::w32_traits_base::char_class_punct, // '¦' 166
1000 re_detail::w32_traits_base::char_class_punct, // '§' 167
1001 re_detail::w32_traits_base::char_class_punct, // '¨' 168
1002 re_detail::w32_traits_base::char_class_punct, // '©' 169
1003 re_detail::w32_traits_base::char_class_punct, // 'ª' 170
1004 re_detail::w32_traits_base::char_class_punct, // '«' 171
1005 re_detail::w32_traits_base::char_class_punct, // '¬' 172
1006 re_detail::w32_traits_base::char_class_punct, // '' 173
1007 re_detail::w32_traits_base::char_class_punct, // '®' 174
1008 re_detail::w32_traits_base::char_class_punct, // '¯' 175
1009 re_detail::w32_traits_base::char_class_punct, // '°' 176
1010 re_detail::w32_traits_base::char_class_punct, // '±' 177
1011 re_detail::w32_traits_base::char_class_punct, // '²' 178
1012 re_detail::w32_traits_base::char_class_punct, // '³' 179
1013 re_detail::w32_traits_base::char_class_punct, // '´' 180
1014 re_detail::w32_traits_base::char_class_punct, // 'µ' 181
1015 re_detail::w32_traits_base::char_class_punct, // '¶' 182
1016 re_detail::w32_traits_base::char_class_punct, // '·' 183
1017 re_detail::w32_traits_base::char_class_punct, // '¸' 184
1018 re_detail::w32_traits_base::char_class_punct, // '¹' 185
1019 re_detail::w32_traits_base::char_class_punct, // 'º' 186
1020 re_detail::w32_traits_base::char_class_punct, // '»' 187
1021 re_detail::w32_traits_base::char_class_punct, // '¼' 188
1022 re_detail::w32_traits_base::char_class_punct, // '½' 189
1023 re_detail::w32_traits_base::char_class_punct, // '¾' 190
1024 re_detail::w32_traits_base::char_class_punct, // '¿' 191
1025 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'À' 192
1026 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Á' 193
1027 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Â' 194
1028 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ã' 195
1029 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ä' 196
1030 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Å' 197
1031 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Æ' 198
1032 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ç' 199
1033 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'È' 200
1034 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'É' 201
1035 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ê' 202
1036 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ë' 203
1037 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ì' 204
1038 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Í' 205
1039 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Î' 206
1040 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ï' 207
1041 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ð' 208
1042 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ñ' 209
1043 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ò' 210
1044 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ó' 211
1045 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ô' 212
1046 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Õ' 213
1047 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ö' 214
1048 re_detail::w32_traits_base::char_class_punct, // '×' 215
1049 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ø' 216
1050 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ù' 217
1051 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ú' 218
1052 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Û' 219
1053 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ü' 220
1054 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ý' 221
1055 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Þ' 222
1056 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ß' 223
1057 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'à' 224
1058 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'á' 225
1059 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'â' 226
1060 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ã' 227
1061 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ä' 228
1062 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'å' 229
1063 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'æ' 230
1064 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ç' 231
1065 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'è' 232
1066 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'é' 233
1067 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ê' 234
1068 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ë' 235
1069 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ì' 236
1070 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'í' 237
1071 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'î' 238
1072 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ï' 239
1073 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ð' 240
1074 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ñ' 241
1075 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ò' 242
1076 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ó' 243
1077 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ô' 244
1078 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'õ' 245
1079 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ö' 246
1080 re_detail::w32_traits_base::char_class_punct, // '÷' 247
1081 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ø' 248
1082 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ù' 249
1083 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ú' 250
1084 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'û' 251
1085 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ü' 252
1086 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ý' 253
1087 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'þ' 254
1088 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ÿ' 255
1093 #endif // BOOST_NO_WREGEX
1096 } // namespace boost
1098 #endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)