]> git.lyx.org Git - lyx.git/blob - boost/libs/regex/src/w32_regex_traits.cpp
update
[lyx.git] / boost / libs / regex / src / w32_regex_traits.cpp
1 /*
2  *
3  * Copyright (c) 1998-2002
4  * Dr John Maddock
5  *
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.
13  *
14  */
15  
16  /*
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
21   */
22
23 #define BOOST_REGEX_SOURCE
24
25 #include <clocale>
26 #include <cstdio>
27 #include <list>
28 #include <cctype>
29 #include <cstdio>
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>
35
36 #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
37
38 //
39 // VC6 needs to link to user32.lib, as do all compilers that
40 // claim to be VC6/7 compatible:
41 //
42 #if defined(_MSC_VER) && !defined(__BORLANDC__)
43 #pragma comment(lib, "user32.lib")
44 #endif
45
46 namespace{
47
48 //
49 // character classes:
50
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,
66 };
67
68 const char* re_char_class_names[] = {
69 "alnum",
70 "alpha",
71 "cntrl",
72 "digit",
73 "graph",
74 "lower",
75 "print",
76 "punct",
77 "space",
78 "upper",
79 "xdigit",
80 "blank",
81 "word",
82 "unicode",
83 };
84
85 std::string* pclasses = 0;
86 const unsigned int re_classes_max = 14;
87
88 //
89 // collate names:
90
91 struct collate_name_t
92 {
93    std::string name;
94    std::string value;
95    collate_name_t(){}
96    collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4)
97       : name(p1, p2), value(p3, p4) {}
98 };
99
100 std::list<collate_name_t>* pcoll_names = 0;
101
102 //
103 // message handling:
104 #ifndef BOOST_RE_MESSAGE_BASE
105 #define BOOST_RE_MESSAGE_BASE 0
106 #endif
107
108 HINSTANCE hresmod = 0;
109
110 BOOST_REGEX_DECL char* re_custom_error_messages[] = {
111    0,
112    0,
113    0,
114    0,
115    0,
116    0,
117    0,
118    0,
119    0,
120    0,
121    0,
122    0,
123    0,
124    0,
125    0,
126    0,
127    0,
128    0,
129    0,
130    0,
131    0,
132    0,
133    0,
134 };
135
136 char re_zero;
137 char re_ten;
138
139 unsigned int entry_count = 0;
140 bool is_init = false;
141
142 enum syntax_map_size
143 {
144    map_size = UCHAR_MAX + 1
145 };
146
147 #ifndef BOOST_NO_WREGEX
148
149 BOOST_REGEX_DECL wchar_t re_zero_w;
150 BOOST_REGEX_DECL wchar_t re_ten_w;
151
152 bool isPlatformNT = false;
153
154 struct syntax_map_t
155 {
156    wchar_t c;
157    unsigned int type;
158 };
159
160 std::list<syntax_map_t>* syntax;
161
162 #endif
163
164 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id);
165
166 std::size_t BOOST_REGEX_CALL get_message(wchar_t* buf, std::size_t len, unsigned id)
167 {
168    std::size_t size = _re_get_message(static_cast<char*>(0), 0, id);
169    if(len < size)
170       return size;
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());
174    return size;
175 }
176
177 inline std::size_t BOOST_REGEX_CALL get_message(char* buf, std::size_t len, unsigned id)
178 {
179    return _re_get_message(buf, len, id);
180 }
181
182 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id)
183 {
184    BOOST_RE_GUARD_STACK
185    // get the customised message if any:
186    if(len < 255)
187       return 255;
188    std::size_t size = 0;
189    if(hresmod)
190       size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255);
191    if(size)
192       return size;
193
194    //
195    // now get the default message if any:
196    return boost::re_detail::re_get_default_message(buf, len, id);
197 }
198
199 const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id)
200 {
201    BOOST_RE_GUARD_STACK
202 #ifdef BOOST_HAS_THREADS
203    boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock);
204 #endif
205    if(re_custom_error_messages[id] == 0)
206    {
207       char buf[256];
208       _re_get_message(buf, 256, id + 200);
209       if(*buf)
210       {
211          re_custom_error_messages[id] = boost::re_detail::re_strdup(buf);
212          return re_custom_error_messages[id];
213       }
214       return boost::re_detail::re_default_error_messages[id];
215    }
216    return re_custom_error_messages[id];
217 }
218
219 } // namespace
220
221 namespace boost{
222
223 namespace re_detail{
224
225 char w32_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0};
226
227 void BOOST_REGEX_CALL w32_traits_base::do_init()
228 {
229    BOOST_RE_GUARD_STACK
230    if(is_init == 0)
231    {
232       //
233       // update the messages first:
234       is_init = true;
235       if(*regex_message_catalogue)
236       {
237          hresmod = LoadLibraryA(regex_message_catalogue);
238 #ifndef BOOST_NO_EXCEPTIONS
239          if(hresmod == NULL)
240          {
241             std::string s("Unable to open dll: ");
242             throw std::runtime_error(s + regex_message_catalogue);
243          }
244 #else
245          BOOST_REGEX_NOEH_ASSERT(hresmod != NULL);
246 #endif
247       }
248       unsigned int i;
249       for(i = 0; i < REG_E_UNKNOWN; ++i)
250       {
251          if(re_custom_error_messages[i])
252          {
253             re_detail::re_strfree(re_custom_error_messages[i]);
254             re_custom_error_messages[i] = 0;
255          }
256       }
257 #ifndef BOOST_NO_WREGEX
258       //
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)
265          isPlatformNT = true;
266 #endif
267       //
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)
272       {
273          get_message(buf, 256, i+300);
274          pclasses[i] = buf;
275       }
276       // start by updating the syntax map:
277       std::memset(syntax_map, syntax_char, map_size);
278       for(i = 1; i < syntax_max; ++i)
279       {
280          char* ptr = buf;
281          get_message(buf, map_size, i+100);
282          for(; *ptr; ++ptr)
283          {
284             syntax_map[(unsigned char)*ptr] = (unsigned char)i;
285          }
286       }
287
288       // now update the character class map,
289       // and lower case map:
290       for(i = 0; i < map_size; ++i)
291       {
292          buf[i] = (char)i;
293       }
294       buf[map_size] = (char)0;
295       GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
296       for(i = 0; i < map_size; ++i)
297       {
298          class_map[i] &= char_class_win;
299       }
300       class_map['_'] |= char_class_underscore;
301       LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
302       //
303       // update our collating elements:
304       pcoll_names = new std::list<collate_name_t>();
305       i = 400;
306       get_message(buf, 256, i);
307       while(*buf)
308       {
309          char* p1, *p2, *p3, *p4;;
310          p1 = buf;
311          while(*p1 && isspace(*p1))++p1;
312          p2 = p1;
313          while(*p2 && !isspace(*p2))++p2;
314          p3 = p2;
315          while(*p3 && isspace(*p3))++p3;
316          p4 = p3;
317          while(*p4 && !isspace(*p4))++p4;
318          pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
319          ++i;
320          get_message(buf, 256, i);
321       }
322       std::string s;
323       const char* p = "zero";
324       if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
325       {
326          jm_assert(s.size() == 1);
327          re_zero = *s.c_str();
328       }
329       else
330          re_zero = '0';
331
332       p = "ten";
333       if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
334       {
335          jm_assert(s.size() == 1);
336          re_ten = *s.c_str();
337       }
338       else
339          re_ten = 'a';
340 #ifndef BOOST_NO_WREGEX
341       //
342       // wide string data:
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))
346       {
347          jm_assert(ws.size() == 1);
348          re_zero_w = *ws.c_str();
349       }
350       else
351          re_zero_w = L'0';
352
353       wp = L"ten";
354       if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+3))
355       {
356          jm_assert(ws.size() == 1);
357          re_ten_w = *ws.c_str();
358       }
359       else
360          re_ten_w = L'a';
361
362       wchar_t wbuf[256];
363       syntax_map_t sm;
364       syntax->clear();
365       for(i = 1; i < syntax_max; ++i)
366       {
367          wchar_t* ptr = wbuf;
368          get_message(wbuf, 256, i+100);
369          for(; *ptr; ++ptr)
370          {
371             sm.c = *ptr;
372             sm.type = i;
373             syntax->push_back(sm);
374          }
375       }
376 #endif // BOOST_NO_WREGEX
377    }
378 }
379
380 void BOOST_REGEX_CALL w32_traits_base::do_free()
381 {
382    BOOST_RE_GUARD_STACK
383    delete[] pclasses;
384    pclasses = 0;
385    delete pcoll_names;
386    pcoll_names = 0;
387 #ifndef BOOST_NO_WREGEX
388    delete syntax;
389    syntax = 0;
390 #endif
391    if(hresmod)
392    {
393       FreeLibrary(hresmod);
394       hresmod = 0;
395    }
396    for(int i = 0; i < REG_E_UNKNOWN; ++i)
397    {
398       if(re_custom_error_messages[i])
399       {
400          re_detail::re_strfree(re_custom_error_messages[i]);
401          re_custom_error_messages[i] = 0;
402       }
403    }
404    is_init = false;
405 }
406
407 std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
408 {
409    return re_get_error_str(id);
410 }
411
412 boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
413 {
414    BOOST_RE_GUARD_STACK
415    unsigned int i;
416    for(i = 0; i < re_classes_max; ++i)
417    {
418       if(pclasses[i] == p)
419       {
420          return re_char_class_id[i];
421       }
422    }
423    for(i = 0; i < re_classes_max; ++i)
424    {
425       if(std::strcmp(re_char_class_names[i], p) == 0)
426       {
427          return re_char_class_id[i];
428       }
429    }
430    return 0;
431 }
432
433 bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
434 {
435    BOOST_RE_GUARD_STACK
436    std::list<collate_name_t>::iterator first, last;
437    first = pcoll_names->begin();
438    last = pcoll_names->end();
439    while(first != last)
440    {
441       if((*first).name == p)
442       {
443          buf = (*first).value;
444          return true;
445       }
446       ++first;
447    }
448
449    bool result = re_detail::re_lookup_def_collate_name(buf, p);
450    if((result == 0) && (std::strlen(p) == 1))
451    {
452       result = true;
453       buf = *p;
454    }
455    return result;
456 }
457
458 std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
459 {
460    BOOST_RE_GUARD_STACK
461    #ifdef BOOST_HAS_THREADS
462    re_detail::cs_guard g(*re_detail::p_re_lock);
463    #endif
464    if(sizeof(regex_message_catalogue) <= l.size())
465       return l;
466    std::string old(regex_message_catalogue);
467    std::strcpy(regex_message_catalogue, l.c_str());
468    return old;
469 }
470
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];
474
475 } // namespace re_detail
476
477 w32_regex_traits<char> w32_regex_traits<char>::i;
478
479 void BOOST_REGEX_CALL w32_regex_traits<char>::update()
480 {
481    BOOST_RE_GUARD_STACK
482    #ifdef BOOST_HAS_THREADS
483    re_detail::cs_guard g(*re_detail::p_re_lock);
484    #endif
485    do_init();
486 }
487
488 w32_regex_traits<char>::w32_regex_traits()
489 {
490    BOOST_RE_GUARD_STACK
491    #ifdef BOOST_HAS_THREADS
492    re_detail::re_init_threads();
493    re_detail::cs_guard g(*re_detail::p_re_lock);
494    #endif
495    ++entry_count;
496 }
497
498 w32_regex_traits<char>::~w32_regex_traits()
499 {
500    BOOST_RE_GUARD_STACK
501 #ifdef BOOST_HAS_THREADS
502    re_detail::cs_guard g(*re_detail::p_re_lock);
503 #endif
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))
507       do_free();
508 #ifdef BOOST_HAS_THREADS
509    g.acquire(false);
510    re_detail::re_free_threads();
511 #endif
512 }
513
514 void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
515 {
516    BOOST_RE_GUARD_STACK
517    size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
518    if(n == (size_t)(-1))
519    {
520       out = in;
521       return;
522    }
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))
526    {
527       out = in;
528       return;
529    }
530    out = buf.get();
531 }
532
533 void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
534 {
535    transform(out, in);
536    for(unsigned int i = 0; i < out.size(); ++i)
537    {
538       if((out[i] == 1) && (i+1 < out.size()))
539       {
540          out.erase(i+1);
541          break;
542       }
543    }
544 }
545
546
547 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
548 {
549    if(is_class(c, char_class_digit))
550       return c - re_zero;
551    if(is_class(c, char_class_xdigit))
552       return 10 + translate(c, true) - translate(re_ten, true);
553    return -1; // error!!
554 }
555
556 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
557 {
558    unsigned int maxval;
559    if(radix < 0)
560    {
561       // if radix is less than zero, then restrict
562       // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
563       radix *= -1;
564       maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
565       maxval /= radix;
566       maxval *= 2;
567       maxval -= 1;
568    }
569    else
570    {
571       maxval = (unsigned int)-1;
572       maxval /= radix;
573    }
574
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))
578    {
579       result *= radix;
580       result += toi(*first);
581       ++first;
582    }
583    return result;
584 }
585
586 #ifndef BOOST_NO_WREGEX
587
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)
589 {
590    BOOST_RE_GUARD_STACK
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());
595    std::string t_out;
596    bool result = base_type::do_lookup_collate(t_out, buf.get());
597    if(t_out.size() == 0) result = false;
598    if(result)
599    {
600       if(t_out[0])
601       {
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());
605          out = wb.get();
606       }
607       else
608          out.append(1,(wchar_t)0);
609    }
610    return result;
611 }
612
613 unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::syntax_type(size_type c)
614 {
615    BOOST_RE_GUARD_STACK
616    std::list<syntax_map_t>::const_iterator first, last;
617    first = syntax->begin();
618    last = syntax->end();
619    while(first != last)
620    {
621       if((size_type)(uchar_type)((*first).c) == c)
622          return (*first).type;
623       ++first;
624    }
625    return 0;
626 }
627
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)
629 {
630    BOOST_RE_GUARD_STACK
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());
635    std::string t_out;
636    bool result =  base_type::do_lookup_collate(t_out, buf.get());
637    if(result)
638    {
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());
642       out = wb.get();
643    }
644    return result;
645 }
646
647
648 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::update()
649 {
650    BOOST_RE_GUARD_STACK
651 #ifdef BOOST_HAS_THREADS
652    re_detail::cs_guard g(*re_detail::p_re_lock);
653 #endif
654    do_init();
655 }
656
657 w32_regex_traits<wchar_t>::w32_regex_traits()
658 {
659    BOOST_RE_GUARD_STACK
660 #ifdef BOOST_HAS_THREADS
661    re_detail::re_init_threads();
662    re_detail::cs_guard g(*re_detail::p_re_lock);
663 #endif
664    ++entry_count;
665 }
666
667 w32_regex_traits<wchar_t>::~w32_regex_traits()
668 {
669    BOOST_RE_GUARD_STACK
670 #ifdef BOOST_HAS_THREADS
671    re_detail::cs_guard g(*re_detail::p_re_lock);
672 #endif
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_))
676       do_free();
677 #ifdef BOOST_HAS_THREADS
678    g.acquire(false);
679    re_detail::re_free_threads();
680 #endif
681 }
682
683 bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::do_iswclass(wchar_t c, boost::uint_fast32_t f)
684 {
685    BOOST_RE_GUARD_STACK
686    if((c & ~0xFF) == 0)
687       return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
688    WORD mask;
689    if(f & char_class_unicode)
690       return true;
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"
695    return false;
696 }
697
698 void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
699 {
700    BOOST_RE_GUARD_STACK
701    scoped_array<char> alt;
702    size_t n;
703    if(isPlatformNT)
704       n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
705    else
706    {
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);
711    }
712    if((n == (size_t)(-1)) || (n == 0))
713    {
714       out = in;
715       return;
716    }
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]);
723    if(isPlatformNT)
724       n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), (int)n);
725    else
726       n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n);
727    int i = -1;
728    do
729    {
730       ++i;
731       buf[i] = (wchar_t)(unsigned char)t[i];
732    } while(t[i]);
733    if(n == (size_t)(-1))
734    {
735       out = in;
736       return;
737    }
738    out = buf.get();
739 }
740
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)
742 {
743    transform(out, in);
744    for(unsigned int i = 0; i < out.size(); ++i)
745    {
746       if((out[i] == 1) && ((i + 1) < out.size()))
747       {
748          out.erase(i+1);
749          break;
750       }
751    }
752 }
753
754
755 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(wchar_t c)
756 {
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!!
762 }
763
764 int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(const wchar_t*& first, const wchar_t* last, int radix)
765 {
766    unsigned int maxval;
767    if(radix < 0)
768    {
769       // if radix is less than zero, then restrict
770       // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
771       radix *= -1;
772       maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
773       maxval /= radix;
774       maxval *= 2;
775       maxval -= 1;
776    }
777    else
778    {
779       maxval = (unsigned int)-1;
780       maxval /= radix;
781    }
782
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))
786    {
787       result *= radix;
788       result += toi(*first);
789       ++first;
790    }
791    return result;
792 }
793
794 boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::lookup_classname(const wchar_t* first, const wchar_t* last)
795 {
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());
801    return result;
802 }
803
804 wchar_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::wtolower(wchar_t c)
805 {
806    BOOST_RE_GUARD_STACK
807    if(isPlatformNT)
808       return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
809    return c;
810 }
811
812
813 w32_regex_traits<wchar_t> w32_regex_traits<wchar_t>::init_;
814
815 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strnarrow(char *s1, std::size_t len, const wchar_t *s2)
816 {
817    BOOST_RE_GUARD_STACK
818    std::size_t size = WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, 0, 0, 0);
819    if(size > len)
820       return size;
821    return WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, (int)len, 0, 0);
822 }
823
824 std::size_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strwiden(wchar_t *s1, std::size_t len, const char *s2)
825 {
826    BOOST_RE_GUARD_STACK
827    std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,   s2, -1, s1, 0);
828    if(size > len)
829       return size;
830    return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, (int)len);
831 }
832
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
961
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
1091 };
1092
1093
1094
1095 #endif // BOOST_NO_WREGEX
1096
1097
1098 } // namespace boost
1099
1100 #endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
1101
1102
1103