Files
boost_regex/src/w32_regex_traits.cpp
Darin Adler d227059666 New smart pointer documentation. Related clean-up of the smart pointer
library. Changing includes to include the new individual smart pointer
headers. Replacing old smart pointer library with an include of the new
smart pointer headers. Simplify ifdefs that involve the member templates
macros now that BOOST_MSVC6_MEMBER_TEMPLATES is also guaranteed to bet
set for platforms that have full member templates.


[SVN r12647]
2002-02-02 18:36:12 +00:00

1089 lines
44 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*
* Copyright (c) 1998-2000
* Dr John Maddock
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Dr John Maddock makes no representations
* about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*
*/
/*
* LOCATION: see http://www.boost.org for most recent version.
* FILE: w32_regex_traits.cpp
* VERSION: see <boost/version.hpp>
* DESCRIPTION: Implements the w32_regex_traits<charT> traits class
*/
#define BOOST_REGEX_SOURCE
#include <clocale>
#include <cstdio>
#include <list>
#include <cctype>
#include <cstdio>
#include <boost/cregex.hpp>
#include <boost/regex/regex_traits.hpp>
#include <boost/regex/detail/regex_synch.hpp>
#include <boost/regex/detail/regex_cstring.hpp>
#include <boost/scoped_array.hpp>
#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
//
// VC6 needs to link to user32.lib, as do all compilers that
// claim to be VC6/7 compatible:
//
#if defined(_MSC_VER) && !defined(__BORLANDC__)
#pragma comment(lib, "user32.lib")
#endif
namespace{
//
// character classes:
boost::uint_fast32_t re_char_class_id[] = {
boost::re_detail::w32_traits_base::char_class_alnum,
boost::re_detail::w32_traits_base::char_class_alpha,
boost::re_detail::w32_traits_base::char_class_cntrl,
boost::re_detail::w32_traits_base::char_class_digit,
boost::re_detail::w32_traits_base::char_class_graph,
boost::re_detail::w32_traits_base::char_class_lower,
boost::re_detail::w32_traits_base::char_class_print,
boost::re_detail::w32_traits_base::char_class_punct,
boost::re_detail::w32_traits_base::char_class_space,
boost::re_detail::w32_traits_base::char_class_upper,
boost::re_detail::w32_traits_base::char_class_xdigit,
boost::re_detail::w32_traits_base::char_class_blank,
boost::re_detail::w32_traits_base::char_class_word,
boost::re_detail::w32_traits_base::char_class_unicode,
};
const char* re_char_class_names[] = {
"alnum",
"alpha",
"cntrl",
"digit",
"graph",
"lower",
"print",
"punct",
"space",
"upper",
"xdigit",
"blank",
"word",
"unicode",
};
std::string* pclasses = 0;
const unsigned int re_classes_max = 14;
//
// collate names:
struct collate_name_t
{
std::string name;
std::string value;
collate_name_t(){}
collate_name_t(const char* p1, const char* p2, const char* p3, const char* p4)
: name(p1, p2), value(p3, p4) {}
};
std::list<collate_name_t>* pcoll_names = 0;
//
// message handling:
#ifndef BOOST_RE_MESSAGE_BASE
#define BOOST_RE_MESSAGE_BASE 0
#endif
HINSTANCE hresmod = 0;
BOOST_REGEX_DECL char* re_custom_error_messages[] = {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
};
char re_zero;
char re_ten;
unsigned int entry_count = 0;
bool is_init = false;
enum syntax_map_size
{
map_size = UCHAR_MAX + 1
};
#ifndef BOOST_NO_WREGEX
BOOST_REGEX_DECL wchar_t re_zero_w;
BOOST_REGEX_DECL wchar_t re_ten_w;
bool isPlatformNT = false;
struct syntax_map_t
{
wchar_t c;
unsigned int type;
};
std::list<syntax_map_t>* syntax;
#endif
unsigned int BOOST_REGEX_CALL _re_get_message(char* buf, unsigned int len, unsigned int id);
template <class charT>
unsigned int BOOST_REGEX_CALL get_message(charT* buf, unsigned int len, unsigned int id)
{
unsigned int size = _re_get_message(static_cast<char*>(0), 0, id);
if(len < size)
return size;
boost::scoped_array<char> cb(new char[size]);
_re_get_message(cb.get(), size, id);
size = boost::w32_regex_traits<wchar_t>::strwiden(buf, len, cb.get());
return size;
}
inline unsigned int BOOST_REGEX_CALL get_message(char* buf, unsigned int len, unsigned int id)
{
return _re_get_message(buf, len, id);
}
unsigned int BOOST_REGEX_CALL _re_get_message(char* buf, unsigned int len, unsigned int id)
{
BOOST_RE_GUARD_STACK
// get the customised message if any:
if(len < 255)
return 255;
unsigned int size = 0;
if(hresmod)
size = LoadStringA(hresmod, BOOST_RE_MESSAGE_BASE + id, buf, 255);
if(size)
return size;
//
// now get the default message if any:
return boost::re_detail::re_get_default_message(buf, len, id);
}
const char* BOOST_REGEX_CALL re_get_error_str(unsigned int id)
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
boost::re_detail::cs_guard g(*boost::re_detail::p_re_lock);
#endif
if(re_custom_error_messages[id] == 0)
{
char buf[256];
_re_get_message(buf, 256, id + 200);
if(*buf)
{
re_custom_error_messages[id] = boost::re_detail::re_strdup(buf);
return re_custom_error_messages[id];
}
return boost::re_detail::re_default_error_messages[id];
}
return re_custom_error_messages[id];
}
} // namespace
namespace boost{
namespace re_detail{
char w32_traits_base::regex_message_catalogue[200] = {0};
void BOOST_REGEX_CALL w32_traits_base::do_init()
{
BOOST_RE_GUARD_STACK
if(is_init == 0)
{
//
// update the messages first:
is_init = true;
if(*regex_message_catalogue)
{
hresmod = LoadLibraryA(regex_message_catalogue);
if(hresmod == NULL)
{
std::string s("Unable to open dll: ");
throw std::runtime_error(s + regex_message_catalogue);
}
}
unsigned int i;
for(i = 0; i < REG_E_UNKNOWN; ++i)
{
if(re_custom_error_messages[i])
{
re_detail::re_strfree(re_custom_error_messages[i]);
re_custom_error_messages[i] = 0;
}
}
#ifndef BOOST_NO_WREGEX
//
// wide character strings:
syntax = new std::list<syntax_map_t>();
OSVERSIONINFO VersionInformation = {0};
VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&VersionInformation);
if(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
isPlatformNT = true;
#endif
//
// now the character classes:
pclasses = new std::string[re_classes_max];
char buf[map_size+2];
for(i = 0; i < re_classes_max; ++i)
{
get_message(buf, 256, i+300);
pclasses[i] = buf;
}
// start by updating the syntax map:
std::memset(syntax_map, syntax_char, map_size);
for(i = 1; i < syntax_max; ++i)
{
char* ptr = buf;
get_message(buf, map_size, i+100);
for(; *ptr; ++ptr)
{
syntax_map[(unsigned char)*ptr] = (unsigned char)i;
}
}
// now update the character class map,
// and lower case map:
for(i = 0; i < map_size; ++i)
{
buf[i] = (char)i;
}
buf[map_size] = (char)0;
GetStringTypeA(GetUserDefaultLCID(), CT_CTYPE1, buf, map_size, class_map);
for(i = 0; i < map_size; ++i)
{
class_map[i] &= char_class_win;
}
class_map['_'] |= char_class_underscore;
LCMapStringA(GetUserDefaultLCID(), LCMAP_LOWERCASE, buf, map_size, lower_case_map, map_size);
//
// update our collating elements:
pcoll_names = new std::list<collate_name_t>();
i = 400;
get_message(buf, 256, i);
while(*buf)
{
char* p1, *p2, *p3, *p4;;
p1 = buf;
while(*p1 && isspace(*p1))++p1;
p2 = p1;
while(*p2 && !isspace(*p2))++p2;
p3 = p2;
while(*p3 && isspace(*p3))++p3;
p4 = p3;
while(*p4 && !isspace(*p4))++p4;
pcoll_names->push_back(collate_name_t(p1, p2, p3, p4));
++i;
get_message(buf, 256, i);
}
std::string s;
const char* p = "zero";
if(w32_regex_traits<char>::lookup_collatename(s, p, p+4))
{
jm_assert(s.size() == 1);
re_zero = *s.c_str();
}
else
re_zero = '0';
p = "ten";
if(w32_regex_traits<char>::lookup_collatename(s, p, p+3))
{
jm_assert(s.size() == 1);
re_ten = *s.c_str();
}
else
re_ten = 'a';
#ifndef BOOST_NO_WREGEX
//
// wide string data:
std::basic_string<wchar_t> ws;
const wchar_t* wp = L"zero";
if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+4))
{
jm_assert(ws.size() == 1);
re_zero_w = *ws.c_str();
}
else
re_zero_w = L'0';
wp = L"ten";
if(w32_regex_traits<wchar_t>::lookup_collatename(ws, wp, wp+3))
{
jm_assert(ws.size() == 1);
re_ten_w = *ws.c_str();
}
else
re_ten_w = L'a';
wchar_t wbuf[256];
syntax_map_t sm;
syntax->clear();
for(i = 1; i < syntax_max; ++i)
{
wchar_t* ptr = wbuf;
get_message(wbuf, 256, i+100);
for(; *ptr; ++ptr)
{
sm.c = *ptr;
sm.type = i;
syntax->push_back(sm);
}
}
#endif // BOOST_NO_WREGEX
}
}
void BOOST_REGEX_CALL w32_traits_base::do_free()
{
BOOST_RE_GUARD_STACK
delete[] pclasses;
delete pcoll_names;
delete syntax;
if(hresmod)
{
FreeLibrary(hresmod);
hresmod = 0;
}
for(int i = 0; i < REG_E_UNKNOWN; ++i)
{
if(re_custom_error_messages[i])
{
re_detail::re_strfree(re_custom_error_messages[i]);
re_custom_error_messages[i] = 0;
}
}
}
std::string BOOST_REGEX_CALL w32_traits_base::error_string(unsigned id)
{
return re_get_error_str(id);
}
boost::uint_fast32_t BOOST_REGEX_CALL w32_traits_base::do_lookup_class(const char* p)
{
BOOST_RE_GUARD_STACK
unsigned int i;
for(i = 0; i < re_classes_max; ++i)
{
if(pclasses[i] == p)
{
return re_char_class_id[i];
}
}
for(i = 0; i < re_classes_max; ++i)
{
if(std::strcmp(re_char_class_names[i], p) == 0)
{
return re_char_class_id[i];
}
}
return 0;
}
bool BOOST_REGEX_CALL w32_traits_base::do_lookup_collate(std::string& buf, const char* p)
{
BOOST_RE_GUARD_STACK
std::list<collate_name_t>::iterator first, last;
first = pcoll_names->begin();
last = pcoll_names->end();
while(first != last)
{
if((*first).name == p)
{
buf = (*first).value;
return true;
}
++first;
}
bool result = re_detail::re_lookup_def_collate_name(buf, p);
if((result == 0) && (std::strlen(p) == 1))
{
result = true;
buf = *p;
}
return result;
}
std::string BOOST_REGEX_CALL w32_traits_base::set_message_catalogue(const std::string& l)
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
if(sizeof(regex_message_catalogue) <= l.size())
return l;
std::string old(regex_message_catalogue);
std::strcpy(regex_message_catalogue, l.c_str());
return old;
}
unsigned char w32_traits_base::syntax_map[map_size];
unsigned short w32_traits_base::class_map[map_size];
char w32_traits_base::lower_case_map[map_size];
} // namespace re_detail
w32_regex_traits<char> w32_regex_traits<char>::i;
void BOOST_REGEX_CALL w32_regex_traits<char>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
do_init();
}
w32_regex_traits<char>::w32_regex_traits()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::re_init_threads();
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
++entry_count;
}
w32_regex_traits<char>::~w32_regex_traits()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
if(--entry_count == 0)
do_free();
#ifdef BOOST_HAS_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
void BOOST_REGEX_CALL w32_regex_traits<char>::transform(std::string& out, const std::string& in)
{
BOOST_RE_GUARD_STACK
size_t n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
if(n == (size_t)(-1))
{
out = in;
return;
}
scoped_array<char> buf(new char[n+1]);
n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, buf.get(), n);
if(n == (size_t)(-1))
{
out = in;
return;
}
out = buf.get();
}
void BOOST_REGEX_CALL w32_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
{
transform(out, in);
for(unsigned int i = 0; i < out.size(); ++i)
{
if((out[i] == 1) && (i+1 < out.size()))
{
out.erase(i+1);
break;
}
}
}
int BOOST_REGEX_CALL w32_regex_traits<char>::toi(char c)
{
if(is_class(c, char_class_digit))
return c - re_zero;
if(is_class(c, char_class_xdigit))
return 10 + translate(c, true) - translate(re_ten, true);
return -1; // error!!
}
int BOOST_REGEX_CALL w32_regex_traits<char>::toi(const char*& first, const char* last, int radix)
{
unsigned int maxval;
if(radix < 0)
{
// if radix is less than zero, then restrict
// return value to charT. NB assumes sizeof(charT) <= sizeof(int)
radix *= -1;
maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
maxval /= radix;
maxval *= 2;
maxval -= 1;
}
else
{
maxval = (unsigned int)-1;
maxval /= radix;
}
unsigned int result = 0;
unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
while((first != last) && is_class(*first, type) && (result <= maxval))
{
result *= radix;
result += toi(*first);
++first;
}
return result;
}
#ifndef BOOST_NO_WREGEX
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)
{
BOOST_RE_GUARD_STACK
std::basic_string<wchar_t> s(first, last);
unsigned int len = strnarrow(static_cast<char*>(0), 0, s.c_str());
scoped_array<char> buf(new char[len]);
strnarrow(buf.get(), len, s.c_str());
std::string t_out;
bool result = base_type::do_lookup_collate(t_out, buf.get());
if(t_out.size() == 0) result = false;
if(result)
{
if(t_out[0])
{
len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
scoped_array<wchar_t> wb(new wchar_t[len]);
strwiden(wb.get(), len, t_out.c_str());
out = wb.get();
}
else
out.append(1,(wchar_t)0);
}
return result;
}
unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::syntax_type(size_type c)
{
BOOST_RE_GUARD_STACK
std::list<syntax_map_t>::const_iterator first, last;
first = syntax->begin();
last = syntax->end();
while(first != last)
{
if((size_type)(uchar_type)((*first).c) == c)
return (*first).type;
++first;
}
return 0;
}
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)
{
BOOST_RE_GUARD_STACK
std::basic_string<wchar_t> s(first, last);
unsigned int len = strnarrow(static_cast<char*>(0), 0, s.c_str());
scoped_array<char> buf(new char[len]);
strnarrow(buf.get(), len, s.c_str());
std::string t_out;
bool result = base_type::do_lookup_collate(t_out, buf.get());
if(result)
{
len = strwiden(static_cast<wchar_t*>(0), 0, t_out.c_str());
scoped_array<wchar_t> wb(new wchar_t[len]);
strwiden(wb.get(), len, t_out.c_str());
out = wb.get();
}
return result;
}
void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
do_init();
}
w32_regex_traits<wchar_t>::w32_regex_traits()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::re_init_threads();
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
++entry_count;
}
w32_regex_traits<wchar_t>::~w32_regex_traits()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
if(--entry_count == 0)
do_free();
#ifdef BOOST_HAS_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
bool BOOST_REGEX_CALL w32_regex_traits<wchar_t>::do_iswclass(wchar_t c, boost::uint_fast32_t f)
{
BOOST_RE_GUARD_STACK
if((c & ~0xFF) == 0)
return BOOST_REGEX_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f & char_class_win);
WORD mask;
if(f & char_class_unicode)
return true;
else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, &c, 1, &mask))
return BOOST_REGEX_MAKE_BOOL(mask & f & char_class_win);
else if((f & char_class_graph) == char_class_graph)
return true; // all wide characters are considered "graphics"
return false;
}
void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
{
BOOST_RE_GUARD_STACK
scoped_array<char> alt;
size_t n;
if(isPlatformNT)
n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, 0, 0);
else
{
n = strnarrow(static_cast<char*>(0), 0, in.c_str());
alt.reset(new char[n+1]);
strnarrow(alt.get(), n+1, in.c_str());
n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, 0, 0);
}
if((n == (size_t)(-1)) || (n == 0))
{
out = in;
return;
}
scoped_array<wchar_t> buf(new wchar_t[n+1]);
// under win32 we get mapped to an array of bytes
// not characters; since the underlying engine has to
// deal with chars we widen the bytes to wchar_t to ensure
// the sort order remains unchanged when we compare.
scoped_array<char> t(new char[n+1]);
if(isPlatformNT)
n = LCMapStringW(GetUserDefaultLCID(), LCMAP_SORTKEY, in.c_str(), -1, reinterpret_cast<wchar_t*>(t.get()), n);
else
n = LCMapStringA(GetUserDefaultLCID(), LCMAP_SORTKEY, alt.get(), -1, t.get(), n);
int i = -1;
do
{
++i;
buf[i] = (wchar_t)(unsigned char)t[i];
} while(t[i]);
if(n == (size_t)(-1))
{
out = in;
return;
}
out = buf.get();
}
void BOOST_REGEX_CALL w32_regex_traits<wchar_t>::transform_primary(std::basic_string<wchar_t>& out, const std::basic_string<wchar_t>& in)
{
transform(out, in);
for(unsigned int i = 0; i < out.size(); ++i)
{
if((out[i] == 1) && ((i + 1) < out.size()))
{
out.erase(i+1);
break;
}
}
}
int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(wchar_t c)
{
if(is_class(c, char_class_digit))
return c - re_zero_w;
if(is_class(c, char_class_xdigit))
return 10 + translate(c, true) - translate(re_ten_w, true);
return -1; // error!!
}
int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::toi(const wchar_t*& first, const wchar_t* last, int radix)
{
unsigned int maxval;
if(radix < 0)
{
// if radix is less than zero, then restrict
// return value to charT. NB assumes sizeof(charT) <= sizeof(int)
radix *= -1;
maxval = 1 << (sizeof(*first) * CHAR_BIT - 1);
maxval /= radix;
maxval *= 2;
maxval -= 1;
}
else
{
maxval = (unsigned int)-1;
maxval /= radix;
}
unsigned int result = 0;
unsigned int type = (radix > 10) ? char_class_xdigit : char_class_digit;
while((first != last) && is_class(*first, type) && (result <= maxval))
{
result *= radix;
result += toi(*first);
++first;
}
return result;
}
boost::uint_fast32_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::lookup_classname(const wchar_t* first, const wchar_t* last)
{
std::basic_string<wchar_t> s(first, last);
unsigned int len = strnarrow(static_cast<char*>(0), 0, s.c_str());
scoped_array<char> buf(new char[len]);
strnarrow(buf.get(), len, s.c_str());
len = do_lookup_class(buf.get());
return len;
}
wchar_t BOOST_REGEX_CALL w32_regex_traits<wchar_t>::wtolower(wchar_t c)
{
BOOST_RE_GUARD_STACK
if(isPlatformNT)
return LOWORD(CharLowerW(reinterpret_cast<wchar_t*>(static_cast<unsigned short>(c))));
return c;
}
w32_regex_traits<wchar_t> w32_regex_traits<wchar_t>::init_;
unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strnarrow(char *s1, unsigned int len, const wchar_t *s2)
{
BOOST_RE_GUARD_STACK
unsigned int size = WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, 0, 0, 0);
if(size > len)
return size;
return WideCharToMultiByte(CP_ACP, 0, s2, -1, s1, len, 0, 0);
}
unsigned int BOOST_REGEX_CALL w32_regex_traits<wchar_t>::strwiden(wchar_t *s1, unsigned int len, const char *s2)
{
BOOST_RE_GUARD_STACK
unsigned int size = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, 0);
if(size > len)
return size;
return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s2, -1, s1, len);
}
unsigned short w32_regex_traits<wchar_t>::wide_unicode_classes[] = {
re_detail::w32_traits_base::char_class_cntrl, // '' 0
re_detail::w32_traits_base::char_class_cntrl, // '' 1
re_detail::w32_traits_base::char_class_cntrl, // '' 2
re_detail::w32_traits_base::char_class_cntrl, // '' 3
re_detail::w32_traits_base::char_class_cntrl, // '' 4
re_detail::w32_traits_base::char_class_cntrl, // '' 5
re_detail::w32_traits_base::char_class_cntrl, // '' 6
re_detail::w32_traits_base::char_class_cntrl, // '' 7
re_detail::w32_traits_base::char_class_cntrl, // '' 8
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
re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 10
re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 11
re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 12
re_detail::w32_traits_base::char_class_cntrl | re_detail::w32_traits_base::char_class_space, // '' 13
re_detail::w32_traits_base::char_class_cntrl, // '.' 14
re_detail::w32_traits_base::char_class_cntrl, // '.' 15
re_detail::w32_traits_base::char_class_cntrl, // '.' 16
re_detail::w32_traits_base::char_class_cntrl, // '.' 17
re_detail::w32_traits_base::char_class_cntrl, // '.' 18
re_detail::w32_traits_base::char_class_cntrl, // '.' 19
re_detail::w32_traits_base::char_class_cntrl, // '.' 20
re_detail::w32_traits_base::char_class_cntrl, // '.' 21
re_detail::w32_traits_base::char_class_cntrl, // '.' 22
re_detail::w32_traits_base::char_class_cntrl, // '.' 23
re_detail::w32_traits_base::char_class_cntrl, // '.' 24
re_detail::w32_traits_base::char_class_cntrl, // '' 25
re_detail::w32_traits_base::char_class_cntrl, // '' 26
re_detail::w32_traits_base::char_class_cntrl, // '' 27
re_detail::w32_traits_base::char_class_cntrl, // '.' 28
re_detail::w32_traits_base::char_class_cntrl, // '.' 29
re_detail::w32_traits_base::char_class_cntrl, // '.' 30
re_detail::w32_traits_base::char_class_cntrl, // '.' 31
re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // ' ' 32
re_detail::w32_traits_base::char_class_punct, // '!' 33
re_detail::w32_traits_base::char_class_punct, // '"' 34
re_detail::w32_traits_base::char_class_punct, // '#' 35
re_detail::w32_traits_base::char_class_punct, // '$' 36
re_detail::w32_traits_base::char_class_punct, // '%' 37
re_detail::w32_traits_base::char_class_punct, // '&' 38
re_detail::w32_traits_base::char_class_punct, // ''' 39
re_detail::w32_traits_base::char_class_punct, // '(' 40
re_detail::w32_traits_base::char_class_punct, // ')' 41
re_detail::w32_traits_base::char_class_punct, // '*' 42
re_detail::w32_traits_base::char_class_punct, // '+' 43
re_detail::w32_traits_base::char_class_punct, // ',' 44
re_detail::w32_traits_base::char_class_punct, // '-' 45
re_detail::w32_traits_base::char_class_punct, // '.' 46
re_detail::w32_traits_base::char_class_punct, // '/' 47
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '0' 48
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '1' 49
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '2' 50
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '3' 51
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '4' 52
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '5' 53
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '6' 54
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '7' 55
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '8' 56
re_detail::w32_traits_base::char_class_digit | re_detail::w32_traits_base::char_class_xdigit, // '9' 57
re_detail::w32_traits_base::char_class_punct, // ':' 58
re_detail::w32_traits_base::char_class_punct, // ';' 59
re_detail::w32_traits_base::char_class_punct, // '<' 60
re_detail::w32_traits_base::char_class_punct, // '=' 61
re_detail::w32_traits_base::char_class_punct, // '>' 62
re_detail::w32_traits_base::char_class_punct, // '?' 63
re_detail::w32_traits_base::char_class_punct, // '@' 64
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
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
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
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
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
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
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'G' 71
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'H' 72
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'I' 73
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'J' 74
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'K' 75
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'L' 76
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'M' 77
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'N' 78
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'O' 79
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'P' 80
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Q' 81
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'R' 82
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'S' 83
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'T' 84
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'U' 85
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'V' 86
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'W' 87
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'X' 88
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Y' 89
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // 'Z' 90
re_detail::w32_traits_base::char_class_punct, // '[' 91
re_detail::w32_traits_base::char_class_punct, // '\' 92
re_detail::w32_traits_base::char_class_punct, // ']' 93
re_detail::w32_traits_base::char_class_punct, // '^' 94
re_detail::w32_traits_base::char_class_punct | re_detail::w32_traits_base::char_class_underscore, // '_' 95
re_detail::w32_traits_base::char_class_punct, // '`' 96
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
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
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
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
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
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
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'g' 103
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'h' 104
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'i' 105
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'j' 106
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'k' 107
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'l' 108
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'm' 109
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'n' 110
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'o' 111
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'p' 112
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'q' 113
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'r' 114
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 's' 115
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 't' 116
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'u' 117
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'v' 118
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'w' 119
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'x' 120
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'y' 121
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // 'z' 122
re_detail::w32_traits_base::char_class_punct, // '{' 123
re_detail::w32_traits_base::char_class_punct, // '|' 124
re_detail::w32_traits_base::char_class_punct, // '}' 125
re_detail::w32_traits_base::char_class_punct, // '~' 126
re_detail::w32_traits_base::char_class_cntrl, // '' 127
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 128
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 129
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 130
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 131
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 132
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 133
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 134
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 135
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 136
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 137
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 138
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 139
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 140
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 141
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 142
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 143
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 144
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 145
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 146
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 147
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 148
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 149
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 150
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 151
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 152
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 153
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 154
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 155
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 156
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 157
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 158
re_detail::w32_traits_base::char_class_cntrl, // '<27>' 159
re_detail::w32_traits_base::char_class_space | re_detail::w32_traits_base::char_class_blank, // '<27>' 160
re_detail::w32_traits_base::char_class_punct, // '<27>' 161
re_detail::w32_traits_base::char_class_punct, // '<27>' 162
re_detail::w32_traits_base::char_class_punct, // '<27>' 163
re_detail::w32_traits_base::char_class_punct, // '<27>' 164
re_detail::w32_traits_base::char_class_punct, // '<27>' 165
re_detail::w32_traits_base::char_class_punct, // '<27>' 166
re_detail::w32_traits_base::char_class_punct, // '<27>' 167
re_detail::w32_traits_base::char_class_punct, // '<27>' 168
re_detail::w32_traits_base::char_class_punct, // '<27>' 169
re_detail::w32_traits_base::char_class_punct, // '<27>' 170
re_detail::w32_traits_base::char_class_punct, // '<27>' 171
re_detail::w32_traits_base::char_class_punct, // '<27>' 172
re_detail::w32_traits_base::char_class_punct, // '<27>' 173
re_detail::w32_traits_base::char_class_punct, // '<27>' 174
re_detail::w32_traits_base::char_class_punct, // '<27>' 175
re_detail::w32_traits_base::char_class_punct, // '<27>' 176
re_detail::w32_traits_base::char_class_punct, // '<27>' 177
re_detail::w32_traits_base::char_class_punct, // '<27>' 178
re_detail::w32_traits_base::char_class_punct, // '<27>' 179
re_detail::w32_traits_base::char_class_punct, // '<27>' 180
re_detail::w32_traits_base::char_class_punct, // '<27>' 181
re_detail::w32_traits_base::char_class_punct, // '<27>' 182
re_detail::w32_traits_base::char_class_punct, // '<27>' 183
re_detail::w32_traits_base::char_class_punct, // '<27>' 184
re_detail::w32_traits_base::char_class_punct, // '<27>' 185
re_detail::w32_traits_base::char_class_punct, // '<27>' 186
re_detail::w32_traits_base::char_class_punct, // '<27>' 187
re_detail::w32_traits_base::char_class_punct, // '<27>' 188
re_detail::w32_traits_base::char_class_punct, // '<27>' 189
re_detail::w32_traits_base::char_class_punct, // '<27>' 190
re_detail::w32_traits_base::char_class_punct, // '<27>' 191
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 192
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 193
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 194
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 195
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 196
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 197
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 198
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 199
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 200
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 201
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 202
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 203
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 204
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 205
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 206
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 207
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 208
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 209
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 210
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 211
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 212
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 213
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 214
re_detail::w32_traits_base::char_class_punct, // '<27>' 215
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 216
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 217
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 218
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 219
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 220
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 221
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_upper, // '<27>' 222
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 223
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 224
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 225
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 226
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 227
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 228
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 229
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 230
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 231
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 232
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 233
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 234
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 235
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 236
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 237
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 238
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 239
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 240
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 241
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 242
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 243
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 244
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 245
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 246
re_detail::w32_traits_base::char_class_punct, // '<27>' 247
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 248
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 249
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 250
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 251
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 252
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 253
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 254
re_detail::w32_traits_base::char_class_alpha | re_detail::w32_traits_base::char_class_lower, // '<27>' 255
};
#endif // BOOST_NO_WREGEX
} // namespace boost
#endif // #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)