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 std::size_t BOOST_REGEX_CALL get_message(wchar_t* buf, std::size_t len, unsigned id)
168 std::size_t size = _re_get_message(static_cast<char*>(0), 0, id);
171 boost::scoped_array<char> cb(new char[size]);
172 _re_get_message(cb.get(), size, id);
173 size = boost::w32_regex_traits<wchar_t>::strwiden(buf, len, cb.get());
177 inline std::size_t BOOST_REGEX_CALL get_message(char* buf, std::size_t len, unsigned id)
179 return _re_get_message(buf, len, id);
182 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id)
185 // get the customised message if any:
188 std::size_t size = 0;
190 size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255);
195 // now get the default message if any:
196 return boost::re_detail::re_get_default_message(buf, len, id);
199 const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id)
202 #ifdef BOOST_HAS_THREADS
203 boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock);
205 if(re_custom_error_messages[id] == 0)
208 _re_get_message(buf, 256, id + 200);
211 re_custom_error_messages[id] = boost::re_detail::re_strdup(buf);
212 return re_custom_error_messages[id];
214 return boost::re_detail::re_default_error_messages[id];
216 return re_custom_error_messages[id];
225 char w32_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0};
227 void BOOST_REGEX_CALL w32_traits_base::do_init()
233 // update the messages first:
235 if(*regex_message_catalogue)
237 hresmod = LoadLibraryA(regex_message_catalogue);
238 #ifndef BOOST_NO_EXCEPTIONS
241 std::string s("Unable to open dll: ");
242 throw std::runtime_error(s + regex_message_catalogue);
245 BOOST_REGEX_NOEH_ASSERT(hresmod != NULL);
249 for(i = 0; i < REG_E_UNKNOWN; ++i)
251 if(re_custom_error_messages[i])
253 re_detail::re_strfree(re_custom_error_messages[i]);
254 re_custom_error_messages[i] = 0;
257 #ifndef BOOST_NO_WREGEX
259 // wide character strings:
260 syntax = new std::list<syntax_map_t>();
261 OSVERSIONINFO VersionInformation = {0};
262 VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
263 GetVersionEx(&VersionInformation);
264 if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
268 // now the character classes:
269 pclasses = new std::string[re_classes_max];
270 char buf[map_size+2];
271 for(i = 0; i < re_classes_max; ++i)
273 get_message(buf, 256, i+300);
276 // start by updating the syntax map:
277 std::memset(syntax_map, syntax_char, map_size);
278 for(i = 1; i < syntax_max; ++i)
281 get_message(buf, map_size, i+100);
284 syntax_map[(unsigned char)*ptr] = (unsigned char)i;
288 // now update the character class map,
289 // and lower case map:
290 for(i = 0; i < map_size; ++i)
294 buf[map_size] = (char)0;
295 GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
296 for(i = 0; i < map_size; ++i)
298 class_map[i] &= char_class_win;
300 class_map['_'] |= char_class_underscore;
301 LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
303 // update our collating elements:
304 pcoll_names = new std::list<collate_name_t>();
306 get_message(buf, 256, i);
309 char* p1, *p2, *p3, *p4;;
311 while(*p1 && isspace(*p1))++p1;
313 while(*p2 && !isspace(*p2))++p2;
315 while(*p3 && isspace(*p3))++p3;
317 while(*p4 && !isspace(*p4))++p4;
318 pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
320 get_message(buf, 256, i);
323 const char* p = "zero";
324 if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
326 jm_assert(s.size() == 1);
327 re_zero = *s.c_str();
333 if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
335 jm_assert(s.size() == 1);
340 #ifndef BOOST_NO_WREGEX
343 std::basic_string<wchar_t> ws;
344 const wchar_t* wp = L"zero";
345 if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+4))
347 jm_assert(ws.size() == 1);
348 re_zero_w = *ws.c_str();
354 if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+3))
356 jm_assert(ws.size() == 1);
357 re_ten_w = *ws.c_str();
365 for(i = 1; i < syntax_max; ++i)
368 get_message(wbuf, 256, i+100);
373 syntax->push_back(sm);
376 #endif // BOOST_NO_WREGEX
380 void BOOST_REGEX_CALL w32_traits_base::do_free()
387 #ifndef BOOST_NO_WREGEX
393 FreeLibrary(hresmod);
396 for(int i = 0; i < REG_E_UNKNOWN; ++i)
398 if(re_custom_error_messages[i])
400 re_detail::re_strfree(re_custom_error_messages[i]);
401 re_custom_error_messages[i] = 0;
407 std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
409 return re_get_error_str(id);
412 boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
416 for(i = 0; i < re_classes_max; ++i)
420 return re_char_class_id[i];
423 for(i = 0; i < re_classes_max; ++i)
425 if(std::strcmp(re_char_class_names[i], p) == 0)
427 return re_char_class_id[i];
433 bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
436 std::list<collate_name_t>::iterator first, last;
437 first = pcoll_names->begin();
438 last = pcoll_names->end();
441 if((*first).name == p)
443 buf = (*first).value;
449 bool result = re_detail::re_lookup_def_collate_name(buf, p);
450 if((result == 0) && (std::strlen(p) == 1))
458 std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
461 #ifdef BOOST_HAS_THREADS
462 re_detail::cs_guard g(*re_detail::p_re_lock);
464 if(sizeof(regex_message_catalogue) <= l.size())
466 std::string old(regex_message_catalogue);
467 std::strcpy(regex_message_catalogue, l.c_str());
471 unsigned char w32_traits_base::syntax_map[map_size];
472 unsigned short w32_traits_base::class_map[map_size];
473 char w32_traits_base::lower_case_map[map_size];
475 } // namespace re_detail
477 w32_regex_traits<char> w32_regex_traits<char>::i;
479 void BOOST_REGEX_CALL w32_regex_traits<char>::update()
482 #ifdef BOOST_HAS_THREADS
483 re_detail::cs_guard g(*re_detail::p_re_lock);
488 w32_regex_traits<char>::w32_regex_traits()
491 #ifdef BOOST_HAS_THREADS
492 re_detail::re_init_threads();
493 re_detail::cs_guard g(*re_detail::p_re_lock);
498 w32_regex_traits<char>::~w32_regex_traits()
501 #ifdef BOOST_HAS_THREADS
502 re_detail::cs_guard g(*re_detail::p_re_lock);
504 // add reference to static member here to ensure
505 // that the linker includes it in the .exe:
506 if((--entry_count == 0) && (0 != &w32_regex_traits<char>::i))
508 #ifdef BOOST_HAS_THREADS
510 re_detail::re_free_threads();
514 void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
517 size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
518 if(n == (size_t)(-1))
523 scoped_array<char> buf(new char[n+1]);
524 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), (int)n);
525 if(n == (size_t)(-1))
533 void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
536 for(unsigned int i = 0; i < out.size(); ++i)
538 if((out[i] == 1) && (i+1 < out.size()))
547 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
549 if(is_class(c, char_class_digit))
551 if(is_class(c, char_class_xdigit))
552 return 10 + translate(c, true) - translate(re_ten, true);
553 return -1; // error!!
556 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
561 // if radix is less than zero, then restrict
562 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
564 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
571 maxval = (unsigned int)-1;
575 unsigned int result = 0;
576 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
577 while((first != last) && is_class(*first, type) && (result <= maxval))
580 result += toi(*first);
586 #ifndef BOOST_NO_WREGEX
588 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)
591 std::basic_string<wchar_t> s(first, last);
592 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
593 scoped_array<char> buf(new char[len]);
594 strnarrow(buf.get(), len, s.c_str());
596 bool result = base_type::do_lookup_collate(t_out, buf.get());
597 if(t_out.size() == 0) result = false;
602 len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
603 scoped_array<wchar_t> wb(new wchar_t[len]);
604 strwiden(wb.get(), len, t_out.c_str());
608 out.append(1,(wchar_t)0);
613 unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::syntax_type(size_type c)
616 std::list<syntax_map_t>::const_iterator first, last;
617 first = syntax->begin();
618 last = syntax->end();
621 if((size_type)(uchar_type)((*first).c) == c)
622 return (*first).type;
628 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)
631 std::basic_string<wchar_t> s(first, last);
632 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
633 scoped_array<char> buf(new char[len]);
634 strnarrow(buf.get(), len, s.c_str());
636 bool result = base_type::do_lookup_collate(t_out, buf.get());
639 len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
640 scoped_array<wchar_t> wb(new wchar_t[len]);
641 strwiden(wb.get(), len, t_out.c_str());
648 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::update()
651 #ifdef BOOST_HAS_THREADS
652 re_detail::cs_guard g(*re_detail::p_re_lock);
657 w32_regex_traits<wchar_t>::w32_regex_traits()
660 #ifdef BOOST_HAS_THREADS
661 re_detail::re_init_threads();
662 re_detail::cs_guard g(*re_detail::p_re_lock);
667 w32_regex_traits<wchar_t>::~w32_regex_traits()
670 #ifdef BOOST_HAS_THREADS
671 re_detail::cs_guard g(*re_detail::p_re_lock);
673 // add reference to static member here to ensure
674 // that the linker includes it in the .exe:
675 if((--entry_count == 0) && (0 != &w32_regex_traits<wchar_t>::init_))
677 #ifdef BOOST_HAS_THREADS
679 re_detail::re_free_threads();
683 bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::do_iswclass(wchar_t c, boost::uint_fast32_t f)
687 return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
689 if(f & char_class_unicode)
691 else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, &c, 1, &mask))
692 return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win);
693 else if((f & char_class_graph) == char_class_graph)
694 return true; // all wide characters are considered "graphics"
698 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
701 scoped_array<char> alt;
704 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
707 n = strnarrow(static_cast<char*>(0), 0, in.c_str());
708 alt.reset(new char[n+1]);
709 strnarrow(alt.get(), n+1, in.c_str());
710 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0);
712 if((n == (size_t)(-1)) || (n == 0))
717 scoped_array<wchar_t> buf(new wchar_t[n+1]);
718 // under win32 we get mapped to an array of bytes
719 // not characters; since the underlying engine has to
720 // deal with chars we widen the bytes to wchar_t to ensure
721 // the sort order remains unchanged when we compare.
722 scoped_array<char> t(new char[n+1]);
724 n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), (int)n);
726 n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n);
731 buf[i] = (wchar_t)(unsigned char)t[i];
733 if(n == (size_t)(-1))
741 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform_primary(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
744 for(unsigned int i = 0; i < out.size(); ++i)
746 if((out[i] == 1) && ((i + 1) < out.size()))
755 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(wchar_t c)
757 if(is_class(c, char_class_digit))
758 return c - re_zero_w;
759 if(is_class(c, char_class_xdigit))
760 return 10 + translate(c, true) - translate(re_ten_w, true);
761 return -1; // error!!
764 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(const wchar_t*& first, const wchar_t* last, int radix)
769 // if radix is less than zero, then restrict
770 // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
772 maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
779 maxval = (unsigned int)-1;
783 unsigned int result = 0;
784 unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
785 while((first != last) && is_class(*first, type) && (result <= maxval))
788 result += toi(*first);
794 boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::lookup_classname(const wchar_t* first, const wchar_t* last)
796 std::basic_string<wchar_t> s(first, last);
797 std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
798 scoped_array<char> buf(new char[len]);
799 strnarrow(buf.get(), len, s.c_str());
800 boost::uint_fast32_t result = do_lookup_class(buf.get());
804 wchar_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::wtolower(wchar_t c)
808 return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
813 w32_regex_traits<wchar_t> w32_regex_traits<wchar_t>::init_;
815 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strnarrow(char *s1, std::size_t len, const wchar_t *s2)
818 std::size_t size = WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, 0, 0, 0);
821 return WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, (int)len, 0, 0);
824 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strwiden(wchar_t *s1, std::size_t len, const char *s2)
827 std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, 0);
830 return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, (int)len);
833 unsigned short w32_regex_traits<wchar_t>::wide_unicode_classes[] = {
834 re_detail::w32_traits_base::char_class_cntrl, // '' 0
835 re_detail::w32_traits_base::char_class_cntrl, // '' 1
836 re_detail::w32_traits_base::char_class_cntrl, // '' 2
837 re_detail::w32_traits_base::char_class_cntrl, // '' 3
838 re_detail::w32_traits_base::char_class_cntrl, // '' 4
839 re_detail::w32_traits_base::char_class_cntrl, // '' 5
840 re_detail::w32_traits_base::char_class_cntrl, // '' 6
841 re_detail::w32_traits_base::char_class_cntrl, // '' 7
842 re_detail::w32_traits_base::char_class_cntrl, // '' 8
843 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
844 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 10
845 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 11
846 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 12
847 re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 13
848 re_detail::w32_traits_base::char_class_cntrl, // '.' 14
849 re_detail::w32_traits_base::char_class_cntrl, // '.' 15
850 re_detail::w32_traits_base::char_class_cntrl, // '.' 16
851 re_detail::w32_traits_base::char_class_cntrl, // '.' 17
852 re_detail::w32_traits_base::char_class_cntrl, // '.' 18
853 re_detail::w32_traits_base::char_class_cntrl, // '.' 19
854 re_detail::w32_traits_base::char_class_cntrl, // '.' 20
855 re_detail::w32_traits_base::char_class_cntrl, // '.' 21
856 re_detail::w32_traits_base::char_class_cntrl, // '.' 22
857 re_detail::w32_traits_base::char_class_cntrl, // '.' 23
858 re_detail::w32_traits_base::char_class_cntrl, // '.' 24
859 re_detail::w32_traits_base::char_class_cntrl, // '' 25
860 re_detail::w32_traits_base::char_class_cntrl, // '' 26
861 re_detail::w32_traits_base::char_class_cntrl, // '' 27
862 re_detail::w32_traits_base::char_class_cntrl, // '.' 28
863 re_detail::w32_traits_base::char_class_cntrl, // '.' 29
864 re_detail::w32_traits_base::char_class_cntrl, // '.' 30
865 re_detail::w32_traits_base::char_class_cntrl, // '.' 31
866 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 32
867 re_detail::w32_traits_base::char_class_punct, // '!' 33
868 re_detail::w32_traits_base::char_class_punct, // '"' 34
869 re_detail::w32_traits_base::char_class_punct, // '#' 35
870 re_detail::w32_traits_base::char_class_punct, // '$' 36
871 re_detail::w32_traits_base::char_class_punct, // '%' 37
872 re_detail::w32_traits_base::char_class_punct, // '&' 38
873 re_detail::w32_traits_base::char_class_punct, // ''' 39
874 re_detail::w32_traits_base::char_class_punct, // '(' 40
875 re_detail::w32_traits_base::char_class_punct, // ')' 41
876 re_detail::w32_traits_base::char_class_punct, // '*' 42
877 re_detail::w32_traits_base::char_class_punct, // '+' 43
878 re_detail::w32_traits_base::char_class_punct, // ',' 44
879 re_detail::w32_traits_base::char_class_punct, // '-' 45
880 re_detail::w32_traits_base::char_class_punct, // '.' 46
881 re_detail::w32_traits_base::char_class_punct, // '/' 47
882 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '0' 48
883 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '1' 49
884 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '2' 50
885 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '3' 51
886 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '4' 52
887 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '5' 53
888 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '6' 54
889 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '7' 55
890 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '8' 56
891 re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '9' 57
892 re_detail::w32_traits_base::char_class_punct, // ':' 58
893 re_detail::w32_traits_base::char_class_punct, // ';' 59
894 re_detail::w32_traits_base::char_class_punct, // '<' 60
895 re_detail::w32_traits_base::char_class_punct, // '=' 61
896 re_detail::w32_traits_base::char_class_punct, // '>' 62
897 re_detail::w32_traits_base::char_class_punct, // '?' 63
898 re_detail::w32_traits_base::char_class_punct, // '@' 64
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, // 'A' 65
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, // 'B' 66
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, // 'C' 67
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, // 'D' 68
903 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
904 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
905 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'G' 71
906 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'H' 72
907 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'I' 73
908 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'J' 74
909 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'K' 75
910 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'L' 76
911 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'M' 77
912 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'N' 78
913 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'O' 79
914 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'P' 80
915 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Q' 81
916 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'R' 82
917 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'S' 83
918 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'T' 84
919 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'U' 85
920 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'V' 86
921 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'W' 87
922 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'X' 88
923 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Y' 89
924 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Z' 90
925 re_detail::w32_traits_base::char_class_punct, // '[' 91
926 re_detail::w32_traits_base::char_class_punct, // '\' 92
927 re_detail::w32_traits_base::char_class_punct, // ']' 93
928 re_detail::w32_traits_base::char_class_punct, // '^' 94
929 re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore, // '_' 95
930 re_detail::w32_traits_base::char_class_punct, // '`' 96
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, // 'a' 97
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, // 'b' 98
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, // 'c' 99
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, // 'd' 100
935 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
936 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
937 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'g' 103
938 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'h' 104
939 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'i' 105
940 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'j' 106
941 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'k' 107
942 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'l' 108
943 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'm' 109
944 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'n' 110
945 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'o' 111
946 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'p' 112
947 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'q' 113
948 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'r' 114
949 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 's' 115
950 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 't' 116
951 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'u' 117
952 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'v' 118
953 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'w' 119
954 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'x' 120
955 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'y' 121
956 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'z' 122
957 re_detail::w32_traits_base::char_class_punct, // '{' 123
958 re_detail::w32_traits_base::char_class_punct, // '|' 124
959 re_detail::w32_traits_base::char_class_punct, // '}' 125
960 re_detail::w32_traits_base::char_class_punct, // '~' 126
962 re_detail::w32_traits_base::char_class_cntrl, // '
\7f' 127
963 re_detail::w32_traits_base::char_class_cntrl, // '
\80' 128
964 re_detail::w32_traits_base::char_class_cntrl, // '
\81' 129
965 re_detail::w32_traits_base::char_class_cntrl, // '
\82' 130
966 re_detail::w32_traits_base::char_class_cntrl, // '
\83' 131
967 re_detail::w32_traits_base::char_class_cntrl, // '
\84' 132
968 re_detail::w32_traits_base::char_class_cntrl, // '
\85' 133
969 re_detail::w32_traits_base::char_class_cntrl, // '
\86' 134
970 re_detail::w32_traits_base::char_class_cntrl, // '
\87' 135
971 re_detail::w32_traits_base::char_class_cntrl, // '
\88' 136
972 re_detail::w32_traits_base::char_class_cntrl, // '
\89' 137
973 re_detail::w32_traits_base::char_class_cntrl, // '
\8a' 138
974 re_detail::w32_traits_base::char_class_cntrl, // '
\8b' 139
975 re_detail::w32_traits_base::char_class_cntrl, // '
\8c' 140
976 re_detail::w32_traits_base::char_class_cntrl, // '
\8d' 141
977 re_detail::w32_traits_base::char_class_cntrl, // '
\8e' 142
978 re_detail::w32_traits_base::char_class_cntrl, // '
\8f' 143
979 re_detail::w32_traits_base::char_class_cntrl, // '
\90' 144
980 re_detail::w32_traits_base::char_class_cntrl, // '
\91' 145
981 re_detail::w32_traits_base::char_class_cntrl, // '
\92' 146
982 re_detail::w32_traits_base::char_class_cntrl, // '
\93' 147
983 re_detail::w32_traits_base::char_class_cntrl, // '
\94' 148
984 re_detail::w32_traits_base::char_class_cntrl, // '
\95' 149
985 re_detail::w32_traits_base::char_class_cntrl, // '
\96' 150
986 re_detail::w32_traits_base::char_class_cntrl, // '
\97' 151
987 re_detail::w32_traits_base::char_class_cntrl, // '
\98' 152
988 re_detail::w32_traits_base::char_class_cntrl, // '
\99' 153
989 re_detail::w32_traits_base::char_class_cntrl, // '
\9a' 154
990 re_detail::w32_traits_base::char_class_cntrl, // '
\9b' 155
991 re_detail::w32_traits_base::char_class_cntrl, // '
\9c' 156
992 re_detail::w32_traits_base::char_class_cntrl, // '
\9d' 157
993 re_detail::w32_traits_base::char_class_cntrl, // '
\9e' 158
994 re_detail::w32_traits_base::char_class_cntrl, // '
\9f' 159
995 re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 160
996 re_detail::w32_traits_base::char_class_punct, // '¡' 161
997 re_detail::w32_traits_base::char_class_punct, // '¢' 162
998 re_detail::w32_traits_base::char_class_punct, // '£' 163
999 re_detail::w32_traits_base::char_class_punct, // '¤' 164
1000 re_detail::w32_traits_base::char_class_punct, // '¥' 165
1001 re_detail::w32_traits_base::char_class_punct, // '¦' 166
1002 re_detail::w32_traits_base::char_class_punct, // '§' 167
1003 re_detail::w32_traits_base::char_class_punct, // '¨' 168
1004 re_detail::w32_traits_base::char_class_punct, // '©' 169
1005 re_detail::w32_traits_base::char_class_punct, // 'ª' 170
1006 re_detail::w32_traits_base::char_class_punct, // '«' 171
1007 re_detail::w32_traits_base::char_class_punct, // '¬' 172
1008 re_detail::w32_traits_base::char_class_punct, // '' 173
1009 re_detail::w32_traits_base::char_class_punct, // '®' 174
1010 re_detail::w32_traits_base::char_class_punct, // '¯' 175
1011 re_detail::w32_traits_base::char_class_punct, // '°' 176
1012 re_detail::w32_traits_base::char_class_punct, // '±' 177
1013 re_detail::w32_traits_base::char_class_punct, // '²' 178
1014 re_detail::w32_traits_base::char_class_punct, // '³' 179
1015 re_detail::w32_traits_base::char_class_punct, // '´' 180
1016 re_detail::w32_traits_base::char_class_punct, // 'µ' 181
1017 re_detail::w32_traits_base::char_class_punct, // '¶' 182
1018 re_detail::w32_traits_base::char_class_punct, // '·' 183
1019 re_detail::w32_traits_base::char_class_punct, // '¸' 184
1020 re_detail::w32_traits_base::char_class_punct, // '¹' 185
1021 re_detail::w32_traits_base::char_class_punct, // 'º' 186
1022 re_detail::w32_traits_base::char_class_punct, // '»' 187
1023 re_detail::w32_traits_base::char_class_punct, // '¼' 188
1024 re_detail::w32_traits_base::char_class_punct, // '½' 189
1025 re_detail::w32_traits_base::char_class_punct, // '¾' 190
1026 re_detail::w32_traits_base::char_class_punct, // '¿' 191
1027 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'À' 192
1028 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Á' 193
1029 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Â' 194
1030 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ã' 195
1031 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ä' 196
1032 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Å' 197
1033 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Æ' 198
1034 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ç' 199
1035 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'È' 200
1036 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'É' 201
1037 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ê' 202
1038 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ë' 203
1039 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ì' 204
1040 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Í' 205
1041 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Î' 206
1042 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ï' 207
1043 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ð' 208
1044 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ñ' 209
1045 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ò' 210
1046 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ó' 211
1047 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ô' 212
1048 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Õ' 213
1049 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ö' 214
1050 re_detail::w32_traits_base::char_class_punct, // '×' 215
1051 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ø' 216
1052 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ù' 217
1053 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ú' 218
1054 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Û' 219
1055 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ü' 220
1056 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Ý' 221
1057 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Þ' 222
1058 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ß' 223
1059 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'à' 224
1060 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'á' 225
1061 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'â' 226
1062 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ã' 227
1063 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ä' 228
1064 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'å' 229
1065 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'æ' 230
1066 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ç' 231
1067 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'è' 232
1068 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'é' 233
1069 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ê' 234
1070 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ë' 235
1071 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ì' 236
1072 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'í' 237
1073 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'î' 238
1074 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ï' 239
1075 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ð' 240
1076 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ñ' 241
1077 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ò' 242
1078 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ó' 243
1079 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ô' 244
1080 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'õ' 245
1081 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ö' 246
1082 re_detail::w32_traits_base::char_class_punct, // '÷' 247
1083 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ø' 248
1084 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ù' 249
1085 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ú' 250
1086 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'û' 251
1087 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ü' 252
1088 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ý' 253
1089 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'þ' 254
1090 re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'ÿ' 255
1095 #endif // BOOST_NO_WREGEX
1098 } // namespace boost
1100 #endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)