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