]> git.lyx.org Git - lyx.git/blob - boost/libs/regex/src/w32_regex_traits.cpp
update to boost 1.32.0
[lyx.git] / boost / libs / regex / src / w32_regex_traits.cpp
1 /*
2  *
3  * Copyright (c) 1998-2002
4  * Dr John Maddock
5  *
6  * Use, modification and distribution are subject to the 
7  * Boost Software License, Version 1.0. (See accompanying file 
8  * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9  *
10  */
11  
12  /*
13   *   LOCATION:    see http://www.boost.org for most recent version.
14   *   FILE:        w32_regex_traits.cpp
15   *   VERSION:     see <boost/version.hpp>
16   *   DESCRIPTION: Implements the w32_regex_traits<charT> traits class
17   */
18
19 #define BOOST_REGEX_SOURCE
20
21 #include <clocale>
22 #include <cstdio>
23 #include <list>
24 #include <cctype>
25 #include <cstdio>
26 #include <boost/regex/regex_traits.hpp>
27 #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
28 #include <boost/cregex.hpp>
29 #ifdef BOOST_REGEX_V3
30 #include <boost/regex/v3/regex_synch.hpp>
31 #include <boost/regex/v3/regex_cstring.hpp>
32 #else
33 #include <boost/regex/v4/regex_synch.hpp>
34 #include <boost/regex/v4/regex_cstring.hpp>
35 #endif
36 #include <boost/scoped_array.hpp>
37
38
39 //
40 // VC6 needs to link to user32.lib, as do all compilers that
41 // claim to be VC6/7 compatible:
42 //
43 #if defined(_MSC_VER) && !defined(__BORLANDC__)
44 #pragma comment(lib, "user32.lib")
45 #endif
46
47 namespace{
48
49 //
50 // character classes:
51
52 boost::uint_fast32_t re_char_class_id[] = {
53    boost::re_detail::w32_traits_base::char_class_alnum,
54    boost::re_detail::w32_traits_base::char_class_alpha,
55    boost::re_detail::w32_traits_base::char_class_cntrl,
56    boost::re_detail::w32_traits_base::char_class_digit,
57    boost::re_detail::w32_traits_base::char_class_graph,
58    boost::re_detail::w32_traits_base::char_class_lower,
59    boost::re_detail::w32_traits_base::char_class_print,
60    boost::re_detail::w32_traits_base::char_class_punct,
61    boost::re_detail::w32_traits_base::char_class_space,
62    boost::re_detail::w32_traits_base::char_class_upper,
63    boost::re_detail::w32_traits_base::char_class_xdigit,
64    boost::re_detail::w32_traits_base::char_class_blank,
65    boost::re_detail::w32_traits_base::char_class_word,
66    boost::re_detail::w32_traits_base::char_class_unicode,
67 };
68
69 const char* re_char_class_names[] = {
70 "alnum",
71 "alpha",
72 "cntrl",
73 "digit",
74 "graph",
75 "lower",
76 "print",
77 "punct",
78 "space",
79 "upper",
80 "xdigit",
81 "blank",
82 "word",
83 "unicode",
84 };
85
86 std::string* pclasses = 0;
87 const unsigned int re_classes_max = 14;
88
89 //
90 // collate names:
91
92 struct collate_name_t
93 {
94    std::string name;
95    std::string value;
96    collate_name_t(){}
97    collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4)
98       : name(p1, p2), value(p3, p4) {}
99 };
100
101 std::list<collate_name_t>* pcoll_names = 0;
102
103 //
104 // message handling:
105 #ifndef BOOST_RE_MESSAGE_BASE
106 #define BOOST_RE_MESSAGE_BASE 0
107 #endif
108
109 HINSTANCE hresmod = 0;
110
111 char* re_custom_error_messages[] = {
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    0,
135 };
136
137 char re_zero;
138 char re_ten;
139
140 unsigned int entry_count = 0;
141 bool is_init = false;
142
143 enum syntax_map_size
144 {
145    map_size = UCHAR_MAX + 1
146 };
147
148 #ifndef BOOST_NO_WREGEX
149
150 boost::regex_wchar_type re_zero_w;
151 boost::regex_wchar_type re_ten_w;
152
153 bool isPlatformNT = false;
154
155 struct syntax_map_t
156 {
157    boost::regex_wchar_type c;
158    unsigned int type;
159 };
160
161 std::list<syntax_map_t>* syntax;
162
163 #endif
164
165 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id);
166
167 std::size_t BOOST_REGEX_CALL get_message(boost::regex_wchar_type* buf, std::size_t len, unsigned id)
168 {
169    std::size_t size = _re_get_message(static_cast<char*>(0), 0, id);
170    if(len < size)
171       return size;
172    boost::scoped_array<char> cb(new char[size]);
173    _re_get_message(cb.get(), size, id);
174    size = boost::w32_regex_traits<boost::regex_wchar_type>::strwiden(buf, len, cb.get());
175    return size;
176 }
177
178 inline std::size_t BOOST_REGEX_CALL get_message(char* buf, std::size_t len, unsigned id)
179 {
180    return _re_get_message(buf, len, id);
181 }
182
183 std::size_t BOOST_REGEX_CALL _re_get_message(char* buf, std::size_t len, unsigned id)
184 {
185    BOOST_RE_GUARD_STACK
186    // get the customised message if any:
187    if(len < 255)
188       return 255;
189    std::size_t size = 0;
190    if(hresmod)
191       size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255);
192    if(size)
193       return size;
194
195    //
196    // now get the default message if any:
197    return boost::re_detail::re_get_default_message(buf, len, id);
198 }
199
200 const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id)
201 {
202    BOOST_RE_GUARD_STACK
203 #ifdef BOOST_HAS_THREADS
204    boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock);
205 #endif
206    if(re_custom_error_messages[id] == 0)
207    {
208       char buf[256];
209       _re_get_message(buf, 256, id + 200);
210       if(*buf)
211       {
212          re_custom_error_messages[id] = boost::re_detail::re_strdup(buf);
213          return re_custom_error_messages[id];
214       }
215       return boost::re_detail::re_default_error_messages[id];
216    }
217    return re_custom_error_messages[id];
218 }
219
220 } // namespace
221
222 namespace boost{
223
224 namespace re_detail{
225
226 char w32_traits_base::regex_message_catalogue[BOOST_REGEX_MAX_PATH] = {0};
227
228 void BOOST_REGEX_CALL w32_traits_base::do_init()
229 {
230    BOOST_RE_GUARD_STACK
231    if(is_init == 0)
232    {
233       //
234       // update the messages first:
235       is_init = true;
236       if(*regex_message_catalogue)
237       {
238          hresmod = LoadLibraryA(regex_message_catalogue);
239          if(hresmod == NULL)
240          {
241             std::string s("Unable to open dll: ");
242             std::runtime_error err(s + regex_message_catalogue);
243             boost::throw_exception(err);
244          }
245       }
246       unsigned int i;
247       for(i = 0; i < REG_E_UNKNOWN; ++i)
248       {
249          if(re_custom_error_messages[i])
250          {
251             re_detail::re_strfree(re_custom_error_messages[i]);
252             re_custom_error_messages[i] = 0;
253          }
254       }
255 #ifndef BOOST_NO_WREGEX
256       //
257       // wide character strings:
258       syntax = new std::list<syntax_map_t>();
259       OSVERSIONINFO VersionInformation = {0};
260       VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
261       GetVersionEx(&VersionInformation);
262       if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
263          isPlatformNT = true;
264 #endif
265       //
266       // now the character classes:
267       pclasses = new std::string[re_classes_max];
268       char buf[map_size+2];
269       for(i = 0; i < re_classes_max; ++i)
270       {
271          get_message(buf, 256, i+300);
272          pclasses[i] = buf;
273       }
274       // start by updating the syntax map:
275       std::memset(syntax_map, syntax_char, map_size);
276       for(i = 1; i < syntax_max; ++i)
277       {
278          char* ptr = buf;
279          get_message(buf, map_size, i+100);
280          for(; *ptr; ++ptr)
281          {
282             syntax_map[(unsigned char)*ptr] = (unsigned char)i;
283          }
284       }
285
286       // now update the character class map,
287       // and lower case map:
288       for(i = 0; i < map_size; ++i)
289       {
290          buf[i] = (char)i;
291       }
292       buf[map_size] = (char)0;
293       GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
294       for(i = 0; i < map_size; ++i)
295       {
296          class_map[i] &= char_class_win;
297       }
298       class_map[(unsigned char)'_'] |= char_class_underscore;
299       LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
300       //
301       // update our collating elements:
302       pcoll_names = new std::list<collate_name_t>();
303       i = 400;
304       get_message(buf, 256, i);
305       while(*buf)
306       {
307          char* p1, *p2, *p3, *p4;;
308          p1 = buf;
309          while(*p1 && isspace(*p1))++p1;
310          p2 = p1;
311          while(*p2 && !isspace(*p2))++p2;
312          p3 = p2;
313          while(*p3 && isspace(*p3))++p3;
314          p4 = p3;
315          while(*p4 && !isspace(*p4))++p4;
316          pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
317          ++i;
318          get_message(buf, 256, i);
319       }
320       std::string s;
321       const char* p = "zero";
322       if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
323       {
324          jm_assert(s.size() == 1);
325          re_zero = *s.c_str();
326       }
327       else
328          re_zero = '0';
329
330       p = "ten";
331       if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
332       {
333          jm_assert(s.size() == 1);
334          re_ten = *s.c_str();
335       }
336       else
337          re_ten = 'a';
338 #ifndef BOOST_NO_WREGEX
339       //
340       // wide string data:
341       std::basic_string<regex_wchar_type> ws;
342       const regex_wchar_type* wp = (const regex_wchar_type*)L"zero";
343       if(w32_regex_traits<regex_wchar_type>::lookup_collatename(ws, wp, wp+4))
344       {
345          jm_assert(ws.size() == 1);
346          re_zero_w = *ws.c_str();
347       }
348       else
349          re_zero_w = (regex_wchar_type)L'0';
350
351       wp = (const regex_wchar_type*)L"ten";
352       if(w32_regex_traits<regex_wchar_type>::lookup_collatename(ws, wp, wp+3))
353       {
354          jm_assert(ws.size() == 1);
355          re_ten_w = *ws.c_str();
356       }
357       else
358          re_ten_w = L'a';
359
360       regex_wchar_type wbuf[256];
361       syntax_map_t sm;
362       syntax->clear();
363       for(i = 1; i < syntax_max; ++i)
364       {
365          regex_wchar_type* ptr = wbuf;
366          get_message(wbuf, 256, i+100);
367          for(; *ptr; ++ptr)
368          {
369             sm.c = *ptr;
370             sm.type = i;
371             syntax->push_back(sm);
372          }
373       }
374 #endif // BOOST_NO_WREGEX
375    }
376 }
377
378 void BOOST_REGEX_CALL w32_traits_base::do_free()
379 {
380    BOOST_RE_GUARD_STACK
381    delete[] pclasses;
382    pclasses = 0;
383    delete pcoll_names;
384    pcoll_names = 0;
385 #ifndef BOOST_NO_WREGEX
386    delete syntax;
387    syntax = 0;
388 #endif
389    if(hresmod)
390    {
391       FreeLibrary(hresmod);
392       hresmod = 0;
393    }
394    for(int i = 0; i < REG_E_UNKNOWN; ++i)
395    {
396       if(re_custom_error_messages[i])
397       {
398          re_detail::re_strfree(re_custom_error_messages[i]);
399          re_custom_error_messages[i] = 0;
400       }
401    }
402    is_init = false;
403 }
404
405 std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
406 {
407    return re_get_error_str(id);
408 }
409
410 boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
411 {
412    BOOST_RE_GUARD_STACK
413    unsigned int i;
414    for(i = 0; i < re_classes_max; ++i)
415    {
416       if(pclasses[i] == p)
417       {
418          return re_char_class_id[i];
419       }
420    }
421    for(i = 0; i < re_classes_max; ++i)
422    {
423       if(std::strcmp(re_char_class_names[i], p) == 0)
424       {
425          return re_char_class_id[i];
426       }
427    }
428    return 0;
429 }
430
431 bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
432 {
433    BOOST_RE_GUARD_STACK
434    std::list<collate_name_t>::iterator first, last;
435    first = pcoll_names->begin();
436    last = pcoll_names->end();
437    while(first != last)
438    {
439       if((*first).name == p)
440       {
441          buf = (*first).value;
442          return true;
443       }
444       ++first;
445    }
446
447    bool result = re_detail::re_lookup_def_collate_name(buf, p);
448    if((result == 0) && (std::strlen(p) == 1))
449    {
450       result = true;
451       buf = *p;
452    }
453    return result;
454 }
455
456 std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
457 {
458    BOOST_RE_GUARD_STACK
459    #ifdef BOOST_HAS_THREADS
460    re_detail::cs_guard g(*re_detail::p_re_lock);
461    #endif
462    if(sizeof(regex_message_catalogue) <= l.size())
463       return l;
464    std::string old(regex_message_catalogue);
465    std::strcpy(regex_message_catalogue, l.c_str());
466    return old;
467 }
468
469 unsigned char w32_traits_base::syntax_map[map_size];
470 unsigned short w32_traits_base::class_map[map_size];
471 char w32_traits_base::lower_case_map[map_size];
472
473 } // namespace re_detail
474
475 w32_regex_traits<char> w32_regex_traits<char>::i;
476
477 void BOOST_REGEX_CALL w32_regex_traits<char>::update()
478 {
479    BOOST_RE_GUARD_STACK
480    #ifdef BOOST_HAS_THREADS
481    re_detail::cs_guard g(*re_detail::p_re_lock);
482    #endif
483    do_init();
484 }
485
486 w32_regex_traits<char>::w32_regex_traits()
487 {
488    BOOST_RE_GUARD_STACK
489    #ifdef BOOST_HAS_THREADS
490    re_detail::re_init_threads();
491    re_detail::cs_guard g(*re_detail::p_re_lock);
492    #endif
493    ++entry_count;
494 }
495
496 w32_regex_traits<char>::~w32_regex_traits()
497 {
498    BOOST_RE_GUARD_STACK
499 #ifdef BOOST_HAS_THREADS
500    re_detail::cs_guard g(*re_detail::p_re_lock);
501 #endif
502    // add reference to static member here to ensure
503    // that the linker includes it in the .exe:
504    if((--entry_count == 0) && (0 != &w32_regex_traits<char>::i) && is_init)
505       do_free();
506 #ifdef BOOST_HAS_THREADS
507    g.acquire(false);
508    re_detail::re_free_threads();
509 #endif
510 }
511
512 void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
513 {
514    BOOST_RE_GUARD_STACK
515    size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
516    if(n == (size_t)(-1))
517    {
518       out = in;
519       return;
520    }
521    scoped_array<char> buf(new char[n+1]);
522    n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), (int)n);
523    if(n == (size_t)(-1))
524    {
525       out = in;
526       return;
527    }
528    out = buf.get();
529 }
530
531 void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
532 {
533    transform(out, in);
534    for(unsigned int i = 0; i < out.size(); ++i)
535    {
536       if((out[i] == 1) && (i+1 < out.size()))
537       {
538          out.erase(i+1);
539          break;
540       }
541    }
542 }
543
544
545 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
546 {
547    if(is_class(c, char_class_digit))
548       return c - re_zero;
549    if(is_class(c, char_class_xdigit))
550       return 10 + translate(c, true) - translate(re_ten, true);
551    return -1; // error!!
552 }
553
554 int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
555 {
556    unsigned int maxval;
557    if(radix < 0)
558    {
559       // if radix is less than zero, then restrict
560       // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
561       radix *= -1;
562       maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
563       maxval /= radix;
564       maxval *= 2;
565       maxval -= 1;
566    }
567    else
568    {
569       maxval = (unsigned int)-1;
570       maxval /= radix;
571    }
572
573    unsigned int result = 0;
574    unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
575    while((first != last) && is_class(*first, type) && (result <= maxval))
576    {
577       result *= radix;
578       result += toi(*first);
579       ++first;
580    }
581    return result;
582 }
583
584 #ifndef BOOST_NO_WREGEX
585
586 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::lookup_collatename(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
587 {
588    BOOST_RE_GUARD_STACK
589    std::basic_string<regex_wchar_type> s(first, last);
590    std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
591    scoped_array<char> buf(new char[len]);
592    strnarrow(buf.get(), len, s.c_str());
593    std::string t_out;
594    bool result = base_type::do_lookup_collate(t_out, buf.get());
595    if(t_out.size() == 0) result = false;
596    if(result)
597    {
598       if(t_out[0])
599       {
600          len = strwiden(static_cast<regex_wchar_type*>(0), 0, t_out.c_str());
601          scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
602          strwiden(wb.get(), len, t_out.c_str());
603          out = wb.get();
604       }
605       else
606          out.append(1,(regex_wchar_type)0);
607    }
608    return result;
609 }
610
611 unsigned int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::syntax_type(size_type c)
612 {
613    BOOST_RE_GUARD_STACK
614    std::list<syntax_map_t>::const_iterator first, last;
615    first = syntax->begin();
616    last = syntax->end();
617    while(first != last)
618    {
619       if((size_type)(uchar_type)((*first).c) == c)
620          return (*first).type;
621       ++first;
622    }
623    return 0;
624 }
625
626 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::do_lookup_collate(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
627 {
628    BOOST_RE_GUARD_STACK
629    std::basic_string<regex_wchar_type> s(first, last);
630    std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
631    scoped_array<char> buf(new char[len]);
632    strnarrow(buf.get(), len, s.c_str());
633    std::string t_out;
634    bool result =  base_type::do_lookup_collate(t_out, buf.get());
635    if(result)
636    {
637       len = strwiden(static_cast<regex_wchar_type*>(0), 0, t_out.c_str());
638       scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
639       strwiden(wb.get(), len, t_out.c_str());
640       out = wb.get();
641    }
642    return result;
643 }
644
645
646 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::update()
647 {
648    BOOST_RE_GUARD_STACK
649 #ifdef BOOST_HAS_THREADS
650    re_detail::cs_guard g(*re_detail::p_re_lock);
651 #endif
652    do_init();
653 }
654
655 w32_regex_traits<regex_wchar_type>::w32_regex_traits()
656 {
657    BOOST_RE_GUARD_STACK
658 #ifdef BOOST_HAS_THREADS
659    re_detail::re_init_threads();
660    re_detail::cs_guard g(*re_detail::p_re_lock);
661 #endif
662    ++entry_count;
663 }
664
665 w32_regex_traits<regex_wchar_type>::~w32_regex_traits()
666 {
667    BOOST_RE_GUARD_STACK
668 #ifdef BOOST_HAS_THREADS
669    re_detail::cs_guard g(*re_detail::p_re_lock);
670 #endif
671    // add reference to static member here to ensure
672    // that the linker includes it in the .exe:
673    if((--entry_count == 0) && (0 != &w32_regex_traits<regex_wchar_type>::init_) && is_init)
674       do_free();
675 #ifdef BOOST_HAS_THREADS
676    g.acquire(false);
677    re_detail::re_free_threads();
678 #endif
679 }
680
681 bool BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::do_iswclass(regex_wchar_type c, boost::uint_fast32_t f)
682 {
683    BOOST_RE_GUARD_STACK
684    if((c & ~0xFF) == 0)
685       return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
686    WORD mask;
687    if(f & char_class_unicode)
688       return true;
689    else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, (const wchar_t*)&c, 1, &mask))
690       return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win);
691    else if((f & char_class_graph) == char_class_graph)
692       return true;  // all wide characters are considered "graphics"
693    return false;
694 }
695
696 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::transform(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
697 {
698    BOOST_RE_GUARD_STACK
699    scoped_array<char> alt;
700    size_t n;
701    if(isPlatformNT)
702       n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, 0, 0);
703    else
704    {
705       n = strnarrow(static_cast<char*>(0), 0, in.c_str());
706       alt.reset(new char[n+1]);
707       strnarrow(alt.get(), n+1, in.c_str());
708       n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0);
709    }
710    if((n == (size_t)(-1)) || (n == 0))
711    {
712       out = in;
713       return;
714    }
715    scoped_array<regex_wchar_type> buf(new regex_wchar_type[n+1]);
716    // under win32 we get mapped to an array of bytes
717    // not characters; since the underlying engine has to
718    // deal with chars we widen the bytes to regex_wchar_type to ensure
719    // the sort order remains unchanged when we compare.
720    scoped_array<char> t(new char[n+1]);
721    if(isPlatformNT)
722       n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, (const wchar_t*)in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), (int)n);
723    else
724       n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), (int)n);
725    int i = -1;
726    do
727    {
728       ++i;
729       buf[i] = (regex_wchar_type)(unsigned char)t[i];
730    } while(t[i]);
731    if(n == (size_t)(-1))
732    {
733       out = in;
734       return;
735    }
736    out = buf.get();
737 }
738
739 void BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::transform_primary(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
740 {
741    transform(out, in);
742    for(unsigned int i = 0; i < out.size(); ++i)
743    {
744       if((out[i] == 1) && ((i + 1) < out.size()))
745       {
746          out.erase(i+1);
747          break;
748       }
749    }
750 }
751
752
753 int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::toi(regex_wchar_type c)
754 {
755    if(is_class(c, char_class_digit))
756       return c - re_zero_w;
757    if(is_class(c, char_class_xdigit))
758       return 10 + translate(c, true) - translate(re_ten_w, true);
759    return -1; // error!!
760 }
761
762 int BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::toi(const regex_wchar_type*& first, const regex_wchar_type* last, int radix)
763 {
764    unsigned int maxval;
765    if(radix < 0)
766    {
767       // if radix is less than zero, then restrict
768       // return value to charT. NB assumes sizeof(charT) <= sizeof(int)
769       radix *= -1;
770       maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
771       maxval /= radix;
772       maxval *= 2;
773       maxval -= 1;
774    }
775    else
776    {
777       maxval = (unsigned int)-1;
778       maxval /= radix;
779    }
780
781    unsigned int result = 0;
782    unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
783    while((first != last) && is_class(*first, type) && (result <= maxval))
784    {
785       result *= radix;
786       result += toi(*first);
787       ++first;
788    }
789    return result;
790 }
791
792 boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last)
793 {
794    std::basic_string<regex_wchar_type> s(first, last);
795    std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
796    scoped_array<char> buf(new char[len]);
797    strnarrow(buf.get(), len, s.c_str());
798    boost::uint_fast32_t result =  do_lookup_class(buf.get());
799    return result;
800 }
801
802 regex_wchar_type BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::wtolower(regex_wchar_type c)
803 {
804    BOOST_RE_GUARD_STACK
805    if(isPlatformNT)
806       return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
807    return c;
808 }
809
810
811 w32_regex_traits<regex_wchar_type> w32_regex_traits<regex_wchar_type>::init_;
812
813 std::size_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2)
814 {
815    BOOST_RE_GUARD_STACK
816    std::size_t size = WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, 0, 0, 0);
817    if(size > len)
818       return size;
819    return WideCharToMultiByte(CP_ACP, 0, (const wchar_t*)s2, -1, s1, (int)len, 0, 0);
820 }
821
822 std::size_t BOOST_REGEX_CALL w32_regex_traits<regex_wchar_type>::strwiden(regex_wchar_type *s1, std::size_t len, const char *s2)
823 {
824    BOOST_RE_GUARD_STACK
825    std::size_t size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,   s2, -1, (wchar_t*)s1, 0);
826    if(size > len)
827       return size;
828    return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, (wchar_t*)s1, (int)len);
829 }
830
831 unsigned short w32_regex_traits<regex_wchar_type>::wide_unicode_classes[] = {
832    re_detail::w32_traits_base::char_class_cntrl,        // ''  0
833    re_detail::w32_traits_base::char_class_cntrl,        // ''  1
834    re_detail::w32_traits_base::char_class_cntrl,        // ''  2
835    re_detail::w32_traits_base::char_class_cntrl,        // ''  3
836    re_detail::w32_traits_base::char_class_cntrl,        // ''  4
837    re_detail::w32_traits_base::char_class_cntrl,        // ''  5
838    re_detail::w32_traits_base::char_class_cntrl,        // ''  6
839    re_detail::w32_traits_base::char_class_cntrl,        // ''  7
840    re_detail::w32_traits_base::char_class_cntrl,        // ''  8
841    re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank,        // ''  9
842    re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space,        // ''  10
843    re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space,        // ''  11
844    re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space,        // ''  12
845    re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space,        // ''  13
846    re_detail::w32_traits_base::char_class_cntrl,        // '.'  14
847    re_detail::w32_traits_base::char_class_cntrl,        // '.'  15
848    re_detail::w32_traits_base::char_class_cntrl,        // '.'  16
849    re_detail::w32_traits_base::char_class_cntrl,        // '.'  17
850    re_detail::w32_traits_base::char_class_cntrl,        // '.'  18
851    re_detail::w32_traits_base::char_class_cntrl,        // '.'  19
852    re_detail::w32_traits_base::char_class_cntrl,        // '.'  20
853    re_detail::w32_traits_base::char_class_cntrl,        // '.'  21
854    re_detail::w32_traits_base::char_class_cntrl,        // '.'  22
855    re_detail::w32_traits_base::char_class_cntrl,        // '.'  23
856    re_detail::w32_traits_base::char_class_cntrl,        // '.'  24
857    re_detail::w32_traits_base::char_class_cntrl,        // ''  25
858    re_detail::w32_traits_base::char_class_cntrl,        // ''  26
859    re_detail::w32_traits_base::char_class_cntrl,        // ''  27
860    re_detail::w32_traits_base::char_class_cntrl,        // '.'  28
861    re_detail::w32_traits_base::char_class_cntrl,        // '.'  29
862    re_detail::w32_traits_base::char_class_cntrl,        // '.'  30
863    re_detail::w32_traits_base::char_class_cntrl,        // '.'  31
864    re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank,        // ' '  32
865    re_detail::w32_traits_base::char_class_punct,        // '!'  33
866    re_detail::w32_traits_base::char_class_punct,        // '"'  34
867    re_detail::w32_traits_base::char_class_punct,        // '#'  35
868    re_detail::w32_traits_base::char_class_punct,        // '$'  36
869    re_detail::w32_traits_base::char_class_punct,        // '%'  37
870    re_detail::w32_traits_base::char_class_punct,        // '&'  38
871    re_detail::w32_traits_base::char_class_punct,        // '''  39
872    re_detail::w32_traits_base::char_class_punct,        // '('  40
873    re_detail::w32_traits_base::char_class_punct,        // ')'  41
874    re_detail::w32_traits_base::char_class_punct,        // '*'  42
875    re_detail::w32_traits_base::char_class_punct,        // '+'  43
876    re_detail::w32_traits_base::char_class_punct,        // ','  44
877    re_detail::w32_traits_base::char_class_punct,        // '-'  45
878    re_detail::w32_traits_base::char_class_punct,        // '.'  46
879    re_detail::w32_traits_base::char_class_punct,        // '/'  47
880    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '0'  48
881    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '1'  49
882    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '2'  50
883    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '3'  51
884    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '4'  52
885    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '5'  53
886    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '6'  54
887    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '7'  55
888    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '8'  56
889    re_detail::w32_traits_base::char_class_digit |   re_detail::w32_traits_base::char_class_xdigit,        // '9'  57
890    re_detail::w32_traits_base::char_class_punct,        // ':'  58
891    re_detail::w32_traits_base::char_class_punct,        // ';'  59
892    re_detail::w32_traits_base::char_class_punct,        // '<'  60
893    re_detail::w32_traits_base::char_class_punct,        // '='  61
894    re_detail::w32_traits_base::char_class_punct,        // '>'  62
895    re_detail::w32_traits_base::char_class_punct,        // '?'  63
896    re_detail::w32_traits_base::char_class_punct,        // '@'  64
897    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'A'  65
898    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'B'  66
899    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'C'  67
900    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'D'  68
901    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'E'  69
902    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper | re_detail::w32_traits_base::char_class_xdigit,        // 'F'  70
903    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'G'  71
904    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'H'  72
905    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'I'  73
906    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'J'  74
907    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'K'  75
908    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'L'  76
909    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'M'  77
910    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'N'  78
911    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'O'  79
912    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'P'  80
913    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Q'  81
914    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'R'  82
915    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'S'  83
916    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'T'  84
917    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'U'  85
918    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'V'  86
919    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'W'  87
920    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'X'  88
921    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Y'  89
922    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Z'  90
923    re_detail::w32_traits_base::char_class_punct,        // '['  91
924    re_detail::w32_traits_base::char_class_punct,        // '\'  92
925    re_detail::w32_traits_base::char_class_punct,        // ']'  93
926    re_detail::w32_traits_base::char_class_punct,        // '^'  94
927    re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore,        // '_'  95
928    re_detail::w32_traits_base::char_class_punct,        // '`'  96
929    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'a'  97
930    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'b'  98
931    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'c'  99
932    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'd'  100
933    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'e'  101
934    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower |  re_detail::w32_traits_base::char_class_xdigit,        // 'f'  102
935    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'g'  103
936    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'h'  104
937    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'i'  105
938    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'j'  106
939    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'k'  107
940    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'l'  108
941    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'm'  109
942    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'n'  110
943    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'o'  111
944    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'p'  112
945    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'q'  113
946    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'r'  114
947    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 's'  115
948    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 't'  116
949    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'u'  117
950    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'v'  118
951    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'w'  119
952    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'x'  120
953    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'y'  121
954    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'z'  122
955    re_detail::w32_traits_base::char_class_punct,        // '{'  123
956    re_detail::w32_traits_base::char_class_punct,        // '|'  124
957    re_detail::w32_traits_base::char_class_punct,        // '}'  125
958    re_detail::w32_traits_base::char_class_punct,        // '~'  126
959
960    re_detail::w32_traits_base::char_class_cntrl,        // '\7f'  127
961    re_detail::w32_traits_base::char_class_cntrl,        // '\80'  128
962    re_detail::w32_traits_base::char_class_cntrl,        // '\81'  129
963    re_detail::w32_traits_base::char_class_cntrl,        // '\82'  130
964    re_detail::w32_traits_base::char_class_cntrl,        // '\83'  131
965    re_detail::w32_traits_base::char_class_cntrl,        // '\84'  132
966    re_detail::w32_traits_base::char_class_cntrl,        // '\85'  133
967    re_detail::w32_traits_base::char_class_cntrl,        // '\86'  134
968    re_detail::w32_traits_base::char_class_cntrl,        // '\87'  135
969    re_detail::w32_traits_base::char_class_cntrl,        // '\88'  136
970    re_detail::w32_traits_base::char_class_cntrl,        // '\89'  137
971    re_detail::w32_traits_base::char_class_cntrl,        // '\8a'  138
972    re_detail::w32_traits_base::char_class_cntrl,        // '\8b'  139
973    re_detail::w32_traits_base::char_class_cntrl,        // '\8c'  140
974    re_detail::w32_traits_base::char_class_cntrl,        // '\8d'  141
975    re_detail::w32_traits_base::char_class_cntrl,        // '\8e'  142
976    re_detail::w32_traits_base::char_class_cntrl,        // '\8f'  143
977    re_detail::w32_traits_base::char_class_cntrl,        // '\90'  144
978    re_detail::w32_traits_base::char_class_cntrl,        // '\91'  145
979    re_detail::w32_traits_base::char_class_cntrl,        // '\92'  146
980    re_detail::w32_traits_base::char_class_cntrl,        // '\93'  147
981    re_detail::w32_traits_base::char_class_cntrl,        // '\94'  148
982    re_detail::w32_traits_base::char_class_cntrl,        // '\95'  149
983    re_detail::w32_traits_base::char_class_cntrl,        // '\96'  150
984    re_detail::w32_traits_base::char_class_cntrl,        // '\97'  151
985    re_detail::w32_traits_base::char_class_cntrl,        // '\98'  152
986    re_detail::w32_traits_base::char_class_cntrl,        // '\99'  153
987    re_detail::w32_traits_base::char_class_cntrl,        // '\9a'  154
988    re_detail::w32_traits_base::char_class_cntrl,        // '\9b'  155
989    re_detail::w32_traits_base::char_class_cntrl,        // '\9c'  156
990    re_detail::w32_traits_base::char_class_cntrl,        // '\9d'  157
991    re_detail::w32_traits_base::char_class_cntrl,        // '\9e'  158
992    re_detail::w32_traits_base::char_class_cntrl,        // '\9f'  159
993    re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank,        // ' '  160
994    re_detail::w32_traits_base::char_class_punct,        // '¡'  161
995    re_detail::w32_traits_base::char_class_punct,        // '¢'  162
996    re_detail::w32_traits_base::char_class_punct,        // '£'  163
997    re_detail::w32_traits_base::char_class_punct,        // '¤'  164
998    re_detail::w32_traits_base::char_class_punct,        // '¥'  165
999    re_detail::w32_traits_base::char_class_punct,        // '¦'  166
1000    re_detail::w32_traits_base::char_class_punct,        // '§'  167
1001    re_detail::w32_traits_base::char_class_punct,        // '¨'  168
1002    re_detail::w32_traits_base::char_class_punct,        // '©'  169
1003    re_detail::w32_traits_base::char_class_punct,        // 'ª'  170
1004    re_detail::w32_traits_base::char_class_punct,        // '«'  171
1005    re_detail::w32_traits_base::char_class_punct,        // '¬'  172
1006    re_detail::w32_traits_base::char_class_punct,        // '­'  173
1007    re_detail::w32_traits_base::char_class_punct,        // '®'  174
1008    re_detail::w32_traits_base::char_class_punct,        // '¯'  175
1009    re_detail::w32_traits_base::char_class_punct,        // '°'  176
1010    re_detail::w32_traits_base::char_class_punct,        // '±'  177
1011    re_detail::w32_traits_base::char_class_punct,        // '²'  178
1012    re_detail::w32_traits_base::char_class_punct,        // '³'  179
1013    re_detail::w32_traits_base::char_class_punct,        // '´'  180
1014    re_detail::w32_traits_base::char_class_punct,        // 'µ'  181
1015    re_detail::w32_traits_base::char_class_punct,        // '¶'  182
1016    re_detail::w32_traits_base::char_class_punct,        // '·'  183
1017    re_detail::w32_traits_base::char_class_punct,        // '¸'  184
1018    re_detail::w32_traits_base::char_class_punct,        // '¹'  185
1019    re_detail::w32_traits_base::char_class_punct,        // 'º'  186
1020    re_detail::w32_traits_base::char_class_punct,        // '»'  187
1021    re_detail::w32_traits_base::char_class_punct,        // '¼'  188
1022    re_detail::w32_traits_base::char_class_punct,        // '½'  189
1023    re_detail::w32_traits_base::char_class_punct,        // '¾'  190
1024    re_detail::w32_traits_base::char_class_punct,        // '¿'  191
1025    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'À'  192
1026    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Á'  193
1027    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Â'  194
1028    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ã'  195
1029    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ä'  196
1030    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Å'  197
1031    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Æ'  198
1032    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ç'  199
1033    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'È'  200
1034    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'É'  201
1035    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ê'  202
1036    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ë'  203
1037    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ì'  204
1038    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Í'  205
1039    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Î'  206
1040    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ï'  207
1041    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ð'  208
1042    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ñ'  209
1043    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ò'  210
1044    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ó'  211
1045    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ô'  212
1046    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Õ'  213
1047    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ö'  214
1048    re_detail::w32_traits_base::char_class_punct,        // '×'  215
1049    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ø'  216
1050    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ù'  217
1051    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ú'  218
1052    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Û'  219
1053    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ü'  220
1054    re_detail::w32_traits_base::char_class_alpha |   re_detail::w32_traits_base::char_class_upper,        // 'Ý'  221
1055    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_upper,        // 'Þ'  222
1056    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ß'  223
1057    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'à'  224
1058    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'á'  225
1059    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'â'  226
1060    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ã'  227
1061    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ä'  228
1062    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'å'  229
1063    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'æ'  230
1064    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ç'  231
1065    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'è'  232
1066    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'é'  233
1067    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ê'  234
1068    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ë'  235
1069    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ì'  236
1070    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'í'  237
1071    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'î'  238
1072    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ï'  239
1073    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ð'  240
1074    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ñ'  241
1075    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ò'  242
1076    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ó'  243
1077    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ô'  244
1078    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'õ'  245
1079    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ö'  246
1080    re_detail::w32_traits_base::char_class_punct,        // '÷'  247
1081    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ø'  248
1082    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ù'  249
1083    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ú'  250
1084    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'û'  251
1085    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ü'  252
1086    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ý'  253
1087    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'þ'  254
1088    re_detail::w32_traits_base::char_class_alpha |  re_detail::w32_traits_base::char_class_lower,        // 'ÿ'  255
1089 };
1090
1091
1092
1093 #endif // BOOST_NO_WREGEX
1094
1095
1096 } // namespace boost
1097
1098 #endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
1099
1100
1101
1102
1103
1104