3 * Copyright (c) 1998-2002
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Dr John Maddock makes no representations
11 * about the suitability of this software for any purpose.
12 * It is provided "as is" without express or implied warranty.
17 * LOCATION: see http://www.boost.org for most recent version.
18 * FILE: w32_regex_traits.cpp
19 * VERSION: see <boost/version.hpp>
20 * DESCRIPTION: Implements the w32_regex_traits<charT> traits class
23 #define BOOST_REGEX_SOURCE
30 #include <boost/cregex.hpp>
31 #include <boost/regex/regex_traits.hpp>
32 #include <boost/regex/detail/regex_synch.hpp>
33 #include <boost/regex/detail/regex_cstring.hpp>
34 #include <boost/scoped_array.hpp>
36 #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
39 // VC6 needs to link to user32.lib, as do all compilers that
40 // claim to be VC6/7 compatible:
42 #if defined(_MSC_VER) && !defined(__BORLANDC__)
43 #pragma comment(lib, "user32.lib")
51 boost::uint_fast32_t re_char_class_id[] = {
52 boost::re_detail::w32_traits_base::char_class_alnum,
53 boost::re_detail::w32_traits_base::char_class_alpha,
54 boost::re_detail::w32_traits_base::char_class_cntrl,
55 boost::re_detail::w32_traits_base::char_class_digit,
56 boost::re_detail::w32_traits_base::char_class_graph,
57 boost::re_detail::w32_traits_base::char_class_lower,
58 boost::re_detail::w32_traits_base::char_class_print,
59 boost::re_detail::w32_traits_base::char_class_punct,
60 boost::re_detail::w32_traits_base::char_class_space,
61 boost::re_detail::w32_traits_base::char_class_upper,
62 boost::re_detail::w32_traits_base::char_class_xdigit,
63 boost::re_detail::w32_traits_base::char_class_blank,
64 boost::re_detail::w32_traits_base::char_class_word,
65 boost::re_detail::w32_traits_base::char_class_unicode,
68 const char* re_char_class_names[] = {
85 std::string* pclasses = 0;
86 const unsigned int re_classes_max = 14;
96 collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4)
97 : name(p1, p2), value(p3, p4) {}
100 std::list<collate_name_t>* pcoll_names = 0;
104 #ifndef BOOST_RE_MESSAGE_BASE
105 #define BOOST_RE_MESSAGE_BASE 0
108 HINSTANCE hresmod = 0;
110 BOOST_REGEX_DECL char* re_custom_error_messages[] = {
139 unsigned int entry_count = 0;
140 bool is_init = false;
144 map_size = UCHAR_MAX + 1
147 #ifndef BOOST_NO_WREGEX
149 BOOST_REGEX_DECL wchar_t re_zero_w;
150 BOOST_REGEX_DECL wchar_t re_ten_w;
152 bool isPlatformNT = false;
160 std::list<syntax_map_t>* syntax;
164 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id);
166 template <class charT>
167 std::size_t BOOST_REGEX_CALL get_message(charT* 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<wchar_t>::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);
239 #ifndef BOOST_NO_EXCEPTIONS
242 std::string s("Unable to open dll: ");
243 throw std::runtime_error(s + regex_message_catalogue);
246 BOOST_REGEX_NOEH_ASSERT(hresmod != NULL);
250 for(i = 0; i < REG_E_UNKNOWN; ++i)
252 if(re_custom_error_messages[i])
254 re_detail::re_strfree(re_custom_error_messages[i]);
255 re_custom_error_messages[i] = 0;
258 #ifndef BOOST_NO_WREGEX
260 // wide character strings:
261 syntax = new std::list<syntax_map_t>();
262 OSVERSIONINFO VersionInformation = {0};
263 VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
264 GetVersionEx(&VersionInformation);
265 if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
269 // now the character classes:
270 pclasses = new std::string[re_classes_max];
271 char buf[map_size+2];
272 for(i = 0; i < re_classes_max; ++i)
274 get_message(buf, 256, i+300);
277 // start by updating the syntax map:
278 std::memset(syntax_map, syntax_char, map_size);
279 for(i = 1; i < syntax_max; ++i)
282 get_message(buf, map_size, i+100);
285 syntax_map[(unsigned char)*ptr] = (unsigned char)i;
289 // now update the character class map,
290 // and lower case map:
291 for(i = 0; i < map_size; ++i)
295 buf[map_size] = (char)0;
296 GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
297 for(i = 0; i < map_size; ++i)
299 class_map[i] &= char_class_win;
301 class_map['_'] |= char_class_underscore;
302 LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
304 // update our collating elements:
305 pcoll_names = new std::list<collate_name_t>();
307 get_message(buf, 256, i);
310 char* p1, *p2, *p3, *p4;;
312 while(*p1 && isspace(*p1))++p1;
314 while(*p2 && !isspace(*p2))++p2;
316 while(*p3 && isspace(*p3))++p3;
318 while(*p4 && !isspace(*p4))++p4;
319 pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
321 get_message(buf, 256, i);
324 const char* p = "zero";
325 if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
327 jm_assert(s.size() == 1);
328 re_zero = *s.c_str();
334 if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
336 jm_assert(s.size() == 1);
341 #ifndef BOOST_NO_WREGEX
344 std::basic_string<wchar_t> ws;
345 const wchar_t* wp = L"zero";
346 if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+4))
348 jm_assert(ws.size() == 1);
349 re_zero_w = *ws.c_str();
355 if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+3))
357 jm_assert(ws.size() == 1);
358 re_ten_w = *ws.c_str();
366 for(i = 1; i < syntax_max; ++i)
369 get_message(wbuf, 256, i+100);
374 syntax->push_back(sm);
377 #endif // BOOST_NO_WREGEX
381 void BOOST_REGEX_CALL w32_traits_base::do_free()
386 #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;
404 std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
406 return re_get_error_str(id);
409 boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
413 for(i = 0; i < re_classes_max; ++i)
417 return re_char_class_id[i];
420 for(i = 0; i < re_classes_max; ++i)
422 if(std::strcmp(re_char_class_names[i], p) == 0)
424 return re_char_class_id[i];
430 bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
433 std::list<collate_name_t>::iterator first, last;
434 first = pcoll_names->begin();
435 last = pcoll_names->end();
438 if((*first).name == p)
440 buf = (*first).value;
446 bool result = re_detail::re_lookup_def_collate_name(buf, p);
447 if((result == 0) && (std::strlen(p) == 1))
455 std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
458 #ifdef BOOST_HAS_THREADS
459 re_detail::cs_guard g(*re_detail::p_re_lock);
461 if(sizeof(regex_message_catalogue) <= l.size())
463 std::string old(regex_message_catalogue);
464 std::strcpy(regex_message_catalogue, l.c_str());
468 unsigned char w32_traits_base::syntax_map[map_size];
469 unsigned short w32_traits_base::class_map[map_size];
470 char w32_traits_base::lower_case_map[map_size];
472 } // namespace re_detail
474 w32_regex_traits<char> w32_regex_traits<char>::i;
476 void BOOST_REGEX_CALL w32_regex_traits<char>::update()
479 #ifdef BOOST_HAS_THREADS
480 re_detail::cs_guard g(*re_detail::p_re_lock);
485 w32_regex_traits<char>::w32_regex_traits()
488 #ifdef BOOST_HAS_THREADS
489 re_detail::re_init_threads();
490 re_detail::cs_guard g(*re_detail::p_re_lock);
495 w32_regex_traits<char>::~w32_regex_traits()
498 #ifdef BOOST_HAS_THREADS
499 re_detail::cs_guard g(*re_detail::p_re_lock);
501 if(--entry_count == 0)
503 #ifdef BOOST_HAS_THREADS
505 re_detail::re_free_threads();
509 void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
512 size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
513 if(n == (size_t)(-1))
518 scoped_array<char> buf(new char[n+1]);
519 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), (int)n);
520 if(n == (size_t)(-1))
528 void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
531 for(unsigned int i = 0; i < out.size(); ++i)
533 if((out[i] == 1) && (i+1 < out.size()))
542 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
544 if(is_class(c, char_class_digit))
546 if(is_class(c, char_class_xdigit))
547 return 10 + translate(c, true) - translate(re_ten, true);
548 return -1; // error!!
551 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
556 // if radix is less than zero, then restrict
557 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
559 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
566 maxval = (unsigned int)-1;
570 unsigned int result = 0;
571 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
572 while((first != last) && is_class(*first, type) && (result <= maxval))
575 result += toi(*first);
581 #ifndef BOOST_NO_WREGEX
583 bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::lookup_collatename(std::basic_string<wchar_t>& out, const wchar_t* first, const wchar_t* last)
586 std::basic_string<wchar_t> s(first, last);
587 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
588 scoped_array<char> buf(new char[len]);
589 strnarrow(buf.get(), len, s.c_str());
591 bool result = base_type::do_lookup_collate(t_out, buf.get());
592 if(t_out.size() == 0) result = false;
597 len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
598 scoped_array<wchar_t> wb(new wchar_t[len]);
599 strwiden(wb.get(), len, t_out.c_str());
603 out.append(1,(wchar_t)0);
608 unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::syntax_type(size_type c)
611 std::list<syntax_map_t>::const_iterator first, last;
612 first = syntax->begin();
613 last = syntax->end();
616 if((size_type)(uchar_type)((*first).c) == c)
617 return (*first).type;
623 bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::do_lookup_collate(std::basic_string<wchar_t>& out, const wchar_t* first, const wchar_t* last)
626 std::basic_string<wchar_t> s(first, last);
627 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
628 scoped_array<char> buf(new char[len]);
629 strnarrow(buf.get(), len, s.c_str());
631 bool result = base_type::do_lookup_collate(t_out, buf.get());
634 len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
635 scoped_array<wchar_t> wb(new wchar_t[len]);
636 strwiden(wb.get(), len, t_out.c_str());
643 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::update()
646 #ifdef BOOST_HAS_THREADS
647 re_detail::cs_guard g(*re_detail::p_re_lock);
652 w32_regex_traits<wchar_t>::w32_regex_traits()
655 #ifdef BOOST_HAS_THREADS
656 re_detail::re_init_threads();
657 re_detail::cs_guard g(*re_detail::p_re_lock);
662 w32_regex_traits<wchar_t>::~w32_regex_traits()
665 #ifdef BOOST_HAS_THREADS
666 re_detail::cs_guard g(*re_detail::p_re_lock);
668 if(--entry_count == 0)
670 #ifdef BOOST_HAS_THREADS
672 re_detail::re_free_threads();
676 bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::do_iswclass(wchar_t c, boost::uint_fast32_t f)
680 return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
682 if(f & char_class_unicode)
684 else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, &c, 1, &mask))
685 return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win);
686 else if((f & char_class_graph) == char_class_graph)
687 return true; // all wide characters are considered "graphics"
691 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
694 scoped_array<char> alt;
697 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
700 n = strnarrow(static_cast<char*>(0), 0, in.c_str());
701 alt.reset(new char[n+1]);
702 strnarrow(alt.get(), n+1, in.c_str());
703 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0);
705 if((n == (size_t)(-1)) || (n == 0))
710 scoped_array<wchar_t> buf(new wchar_t[n+1]);
711 // under win32 we get mapped to an array of bytes
712 // not characters; since the underlying engine has to
713 // deal with chars we widen the bytes to wchar_t to ensure
714 // the sort order remains unchanged when we compare.
715 scoped_array<char> t(new char[n+1]);
717 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), (int)n);
719 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n);
724 buf[i] = (wchar_t)(unsigned char)t[i];
726 if(n == (size_t)(-1))
734 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform_primary(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
737 for(unsigned int i = 0; i < out.size(); ++i)
739 if((out[i] == 1) && ((i + 1) < out.size()))
748 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(wchar_t c)
750 if(is_class(c, char_class_digit))
751 return c - re_zero_w;
752 if(is_class(c, char_class_xdigit))
753 return 10 + translate(c, true) - translate(re_ten_w, true);
754 return -1; // error!!
757 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(const wchar_t*& first, const wchar_t* last, int radix)
762 // if radix is less than zero, then restrict
763 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
765 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
772 maxval = (unsigned int)-1;
776 unsigned int result = 0;
777 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
778 while((first != last) && is_class(*first, type) && (result <= maxval))
781 result += toi(*first);
787 boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::lookup_classname(const wchar_t* first, const wchar_t* last)
789 std::basic_string<wchar_t> s(first, last);
790 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
791 scoped_array<char> buf(new char[len]);
792 strnarrow(buf.get(), len, s.c_str());
793 boost::uint_fast32_t result = do_lookup_class(buf.get());
797 wchar_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::wtolower(wchar_t c)
801 return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
806 w32_regex_traits<wchar_t> w32_regex_traits<wchar_t>::init_;
808 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strnarrow(char *s1, std::size_t len, const wchar_t *s2)
811 std::size_t size = WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, 0, 0, 0);
814 return WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, (int)len, 0, 0);
817 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strwiden(wchar_t *s1, std::size_t len, const char *s2)
820 std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, 0);
823 return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, (int)len);
826 unsigned short w32_regex_traits<wchar_t>::wide_unicode_classes[] = {
827 re_detail::w32_traits_base::char_class_cntrl, // '' 0
828 re_detail::w32_traits_base::char_class_cntrl, // '' 1
829 re_detail::w32_traits_base::char_class_cntrl, // '' 2
830 re_detail::w32_traits_base::char_class_cntrl, // '' 3
831 re_detail::w32_traits_base::char_class_cntrl, // '' 4
832 re_detail::w32_traits_base::char_class_cntrl, // '' 5
833 re_detail::w32_traits_base::char_class_cntrl, // '' 6
834 re_detail::w32_traits_base::char_class_cntrl, // '' 7
835 re_detail::w32_traits_base::char_class_cntrl, // '' 8
836 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
837 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 10
838 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 11
839 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 12
840 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 13
841 re_detail::w32_traits_base::char_class_cntrl, // '.' 14
842 re_detail::w32_traits_base::char_class_cntrl, // '.' 15
843 re_detail::w32_traits_base::char_class_cntrl, // '.' 16
844 re_detail::w32_traits_base::char_class_cntrl, // '.' 17
845 re_detail::w32_traits_base::char_class_cntrl, // '.' 18
846 re_detail::w32_traits_base::char_class_cntrl, // '.' 19
847 re_detail::w32_traits_base::char_class_cntrl, // '.' 20
848 re_detail::w32_traits_base::char_class_cntrl, // '.' 21
849 re_detail::w32_traits_base::char_class_cntrl, // '.' 22
850 re_detail::w32_traits_base::char_class_cntrl, // '.' 23
851 re_detail::w32_traits_base::char_class_cntrl, // '.' 24
852 re_detail::w32_traits_base::char_class_cntrl, // '' 25
853 re_detail::w32_traits_base::char_class_cntrl, // '' 26
854 re_detail::w32_traits_base::char_class_cntrl, // '' 27
855 re_detail::w32_traits_base::char_class_cntrl, // '.' 28
856 re_detail::w32_traits_base::char_class_cntrl, // '.' 29
857 re_detail::w32_traits_base::char_class_cntrl, // '.' 30
858 re_detail::w32_traits_base::char_class_cntrl, // '.' 31
859 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 32
860 re_detail::w32_traits_base::char_class_punct, // '!' 33
861 re_detail::w32_traits_base::char_class_punct, // '"' 34
862 re_detail::w32_traits_base::char_class_punct, // '#' 35
863 re_detail::w32_traits_base::char_class_punct, // '$' 36
864 re_detail::w32_traits_base::char_class_punct, // '%' 37
865 re_detail::w32_traits_base::char_class_punct, // '&' 38
866 re_detail::w32_traits_base::char_class_punct, // ''' 39
867 re_detail::w32_traits_base::char_class_punct, // '(' 40
868 re_detail::w32_traits_base::char_class_punct, // ')' 41
869 re_detail::w32_traits_base::char_class_punct, // '*' 42
870 re_detail::w32_traits_base::char_class_punct, // '+' 43
871 re_detail::w32_traits_base::char_class_punct, // ',' 44
872 re_detail::w32_traits_base::char_class_punct, // '-' 45
873 re_detail::w32_traits_base::char_class_punct, // '.' 46
874 re_detail::w32_traits_base::char_class_punct, // '/' 47
875 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '0' 48
876 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '1' 49
877 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '2' 50
878 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '3' 51
879 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '4' 52
880 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '5' 53
881 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '6' 54
882 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '7' 55
883 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '8' 56
884 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '9' 57
885 re_detail::w32_traits_base::char_class_punct, // ':' 58
886 re_detail::w32_traits_base::char_class_punct, // ';' 59
887 re_detail::w32_traits_base::char_class_punct, // '<' 60
888 re_detail::w32_traits_base::char_class_punct, // '=' 61
889 re_detail::w32_traits_base::char_class_punct, // '>' 62
890 re_detail::w32_traits_base::char_class_punct, // '?' 63
891 re_detail::w32_traits_base::char_class_punct, // '@' 64
892 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
893 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
894 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
895 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
896 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
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, // 'F' 70
898 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'G' 71
899 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'H' 72
900 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'I' 73
901 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'J' 74
902 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'K' 75
903 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'L' 76
904 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'M' 77
905 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'N' 78
906 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'O' 79
907 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'P' 80
908 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Q' 81
909 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'R' 82
910 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'S' 83
911 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'T' 84
912 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'U' 85
913 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'V' 86
914 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'W' 87
915 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'X' 88
916 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Y' 89
917 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Z' 90
918 re_detail::w32_traits_base::char_class_punct, // '[' 91
919 re_detail::w32_traits_base::char_class_punct, // '\' 92
920 re_detail::w32_traits_base::char_class_punct, // ']' 93
921 re_detail::w32_traits_base::char_class_punct, // '^' 94
922 re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore, // '_' 95
923 re_detail::w32_traits_base::char_class_punct, // '`' 96
924 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
925 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
926 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
927 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
928 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
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, // 'f' 102
930 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'g' 103
931 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'h' 104
932 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'i' 105
933 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'j' 106
934 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'k' 107
935 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'l' 108
936 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'm' 109
937 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'n' 110
938 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'o' 111
939 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'p' 112
940 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'q' 113
941 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'r' 114
942 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 's' 115
943 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 't' 116
944 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'u' 117
945 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'v' 118
946 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'w' 119
947 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'x' 120
948 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'y' 121
949 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'z' 122
950 re_detail::w32_traits_base::char_class_punct, // '{' 123
951 re_detail::w32_traits_base::char_class_punct, // '|' 124
952 re_detail::w32_traits_base::char_class_punct, // '}' 125
953 re_detail::w32_traits_base::char_class_punct, // '~' 126
955 re_detail::w32_traits_base::char_class_cntrl, // '
\7f' 127
956 re_detail::w32_traits_base::char_class_cntrl, // '
\80' 128
957 re_detail::w32_traits_base::char_class_cntrl, // '
\81' 129
958 re_detail::w32_traits_base::char_class_cntrl, // '
\82' 130
959 re_detail::w32_traits_base::char_class_cntrl, // '
\83' 131
960 re_detail::w32_traits_base::char_class_cntrl, // '
\84' 132
961 re_detail::w32_traits_base::char_class_cntrl, // '
\85' 133
962 re_detail::w32_traits_base::char_class_cntrl, // '
\86' 134
963 re_detail::w32_traits_base::char_class_cntrl, // '
\87' 135
964 re_detail::w32_traits_base::char_class_cntrl, // '
\88' 136
965 re_detail::w32_traits_base::char_class_cntrl, // '
\89' 137
966 re_detail::w32_traits_base::char_class_cntrl, // '
\8a' 138
967 re_detail::w32_traits_base::char_class_cntrl, // '
\8b' 139
968 re_detail::w32_traits_base::char_class_cntrl, // '
\8c' 140
969 re_detail::w32_traits_base::char_class_cntrl, // '
\8d' 141
970 re_detail::w32_traits_base::char_class_cntrl, // '
\8e' 142
971 re_detail::w32_traits_base::char_class_cntrl, // '
\8f' 143
972 re_detail::w32_traits_base::char_class_cntrl, // '
\90' 144
973 re_detail::w32_traits_base::char_class_cntrl, // '
\91' 145
974 re_detail::w32_traits_base::char_class_cntrl, // '
\92' 146
975 re_detail::w32_traits_base::char_class_cntrl, // '
\93' 147
976 re_detail::w32_traits_base::char_class_cntrl, // '
\94' 148
977 re_detail::w32_traits_base::char_class_cntrl, // '
\95' 149
978 re_detail::w32_traits_base::char_class_cntrl, // '
\96' 150
979 re_detail::w32_traits_base::char_class_cntrl, // '
\97' 151
980 re_detail::w32_traits_base::char_class_cntrl, // '
\98' 152
981 re_detail::w32_traits_base::char_class_cntrl, // '
\99' 153
982 re_detail::w32_traits_base::char_class_cntrl, // '
\9a' 154
983 re_detail::w32_traits_base::char_class_cntrl, // '
\9b' 155
984 re_detail::w32_traits_base::char_class_cntrl, // '
\9c' 156
985 re_detail::w32_traits_base::char_class_cntrl, // '
\9d' 157
986 re_detail::w32_traits_base::char_class_cntrl, // '
\9e' 158
987 re_detail::w32_traits_base::char_class_cntrl, // '
\9f' 159
988 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 160
989 re_detail::w32_traits_base::char_class_punct, // '¡' 161
990 re_detail::w32_traits_base::char_class_punct, // '¢' 162
991 re_detail::w32_traits_base::char_class_punct, // '£' 163
992 re_detail::w32_traits_base::char_class_punct, // '¤' 164
993 re_detail::w32_traits_base::char_class_punct, // '¥' 165
994 re_detail::w32_traits_base::char_class_punct, // '¦' 166
995 re_detail::w32_traits_base::char_class_punct, // '§' 167
996 re_detail::w32_traits_base::char_class_punct, // '¨' 168
997 re_detail::w32_traits_base::char_class_punct, // '©' 169
998 re_detail::w32_traits_base::char_class_punct, // 'ª' 170
999 re_detail::w32_traits_base::char_class_punct, // '«' 171
1000 re_detail::w32_traits_base::char_class_punct, // '¬' 172
1001 re_detail::w32_traits_base::char_class_punct, // '' 173
1002 re_detail::w32_traits_base::char_class_punct, // '®' 174
1003 re_detail::w32_traits_base::char_class_punct, // '¯' 175
1004 re_detail::w32_traits_base::char_class_punct, // '°' 176
1005 re_detail::w32_traits_base::char_class_punct, // '±' 177
1006 re_detail::w32_traits_base::char_class_punct, // '²' 178
1007 re_detail::w32_traits_base::char_class_punct, // '³' 179
1008 re_detail::w32_traits_base::char_class_punct, // '´' 180
1009 re_detail::w32_traits_base::char_class_punct, // 'µ' 181
1010 re_detail::w32_traits_base::char_class_punct, // '¶' 182
1011 re_detail::w32_traits_base::char_class_punct, // '·' 183
1012 re_detail::w32_traits_base::char_class_punct, // '¸' 184
1013 re_detail::w32_traits_base::char_class_punct, // '¹' 185
1014 re_detail::w32_traits_base::char_class_punct, // 'º' 186
1015 re_detail::w32_traits_base::char_class_punct, // '»' 187
1016 re_detail::w32_traits_base::char_class_punct, // '¼' 188
1017 re_detail::w32_traits_base::char_class_punct, // '½' 189
1018 re_detail::w32_traits_base::char_class_punct, // '¾' 190
1019 re_detail::w32_traits_base::char_class_punct, // '¿' 191
1020 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'À' 192
1021 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Á' 193
1022 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Â' 194
1023 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ã' 195
1024 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ä' 196
1025 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Å' 197
1026 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Æ' 198
1027 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ç' 199
1028 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'È' 200
1029 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'É' 201
1030 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ê' 202
1031 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ë' 203
1032 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ì' 204
1033 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Í' 205
1034 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Î' 206
1035 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ï' 207
1036 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ð' 208
1037 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ñ' 209
1038 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ò' 210
1039 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ó' 211
1040 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ô' 212
1041 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Õ' 213
1042 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ö' 214
1043 re_detail::w32_traits_base::char_class_punct, // '×' 215
1044 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ø' 216
1045 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ù' 217
1046 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ú' 218
1047 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Û' 219
1048 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ü' 220
1049 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ý' 221
1050 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Þ' 222
1051 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ß' 223
1052 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'à' 224
1053 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'á' 225
1054 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'â' 226
1055 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ã' 227
1056 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ä' 228
1057 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'å' 229
1058 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'æ' 230
1059 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ç' 231
1060 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'è' 232
1061 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'é' 233
1062 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ê' 234
1063 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ë' 235
1064 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ì' 236
1065 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'í' 237
1066 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'î' 238
1067 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ï' 239
1068 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ð' 240
1069 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ñ' 241
1070 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ò' 242
1071 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ó' 243
1072 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ô' 244
1073 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'õ' 245
1074 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ö' 246
1075 re_detail::w32_traits_base::char_class_punct, // '÷' 247
1076 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ø' 248
1077 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ù' 249
1078 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ú' 250
1079 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'û' 251
1080 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ü' 252
1081 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ý' 253
1082 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'þ' 254
1083 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ÿ' 255
1088 #endif // BOOST_NO_WREGEX
1091 } // namespace boost
1093 #endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)