Files
regex/src/w32_regex_traits.cpp
John Maddock efd0ce56bc reorganised regex config setup
[SVN r10064]
2001-05-08 11:24:35 +00:00

1067 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: 3.11
* DESCRIPTION: Implements the w32_regex_traits<charT> traits class
*/
#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>
#if defined(_WIN32) && !defined(BOOST_RE_NO_W32)
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_RE_IX_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_RE_NO_WCSTRING
BOOST_RE_IX_DECL wchar_t re_zero_w;
BOOST_RE_IX_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_RE_CALL _re_get_message(char* buf, unsigned int len, unsigned int id);
template <class charT>
unsigned int BOOST_RE_CALL get_message(charT* buf, unsigned int len, unsigned int id)
{
unsigned int size = _re_get_message((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_RE_CALL get_message(char* buf, unsigned int len, unsigned int id)
{
return _re_get_message(buf, len, id);
}
unsigned int BOOST_RE_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_RE_CALL re_get_error_str(unsigned int id)
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_RE_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_RE_CALL w32_traits_base::do_init()
{
BOOST_RE_GUARD_STACK
if(is_init == 0)
{
//
// upadte the messages first:
is_init = true;
if(*regex_message_catalogue)
hresmod = LoadLibraryA(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_RE_NO_WCSTRING
//
// 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);
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_RE_NO_WCSTRING
//
// 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_RE_NO_WCSTRING
}
}
void BOOST_RE_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 w32_traits_base::error_string(unsigned id)
{
return re_get_error_str(id);
}
boost::uint_fast32_t BOOST_RE_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_RE_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 w32_traits_base::set_message_catalogue(const std::string& l)
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_RE_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 w32_regex_traits<char>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_RE_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_RE_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_RE_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
if(--entry_count == 0)
do_free();
#ifdef BOOST_RE_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
void BOOST_RE_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_RE_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_RE_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_RE_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_RE_NO_WCSTRING
bool BOOST_RE_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((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((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_RE_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((uchar_type)(*first).c == c)
return (*first).type;
++first;
}
return 0;
}
bool BOOST_RE_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((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((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_RE_CALL w32_regex_traits<wchar_t>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_RE_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_RE_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_RE_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
if(--entry_count == 0)
do_free();
#ifdef BOOST_RE_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
bool BOOST_RE_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_RE_MAKE_BOOL(re_detail::wide_unicode_classes[(uchar_type)c] & f);
WORD mask;
if(f & char_class_unicode)
return true;
else if(isPlatformNT && GetStringTypeW(CT_CTYPE1, &c, 1, &mask))
return BOOST_RE_MAKE_BOOL(mask & f);
else if((f & char_class_graph) == char_class_graph)
return true; // all wide characters are considered "graphics"
return false;
}
void BOOST_RE_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((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, (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_RE_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_RE_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_RE_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_RE_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((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_RE_CALL w32_regex_traits<wchar_t>::wtolower(wchar_t c)
{
BOOST_RE_GUARD_STACK
if(isPlatformNT)
return LOWORD(CharLowerW((wchar_t*)(MAKELONG(c, 0))));
return c;
}
w32_regex_traits<wchar_t> w32_regex_traits<wchar_t>::init_;
unsigned int BOOST_RE_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_RE_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_RE_NO_WCSTRING
} // namespace boost
#endif // #if defined(_WIN32) && !defined(BOOST_RE_NO_W32)