📄 c_regex_traits.cpp
字号:
if(std::strcmp(re_char_class_names[i], p) == 0)
{
return re_char_class_id[i];
}
}
return 0;
}
bool BOOST_REGEX_CALL c_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 c_traits_base::set_message_catalogue(const std::string& l)
{
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 c_traits_base::syntax_map[map_size];
unsigned short c_traits_base::class_map[map_size];
char c_traits_base::lower_case_map[map_size];
} // namespace re_detail
#ifndef BOOST_NO_WREGEX
bool BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::lookup_collatename(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
{
BOOST_RE_GUARD_STACK
std::basic_string<regex_wchar_type> s(first, last);
std::size_t 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<regex_wchar_type*>(0), 0, t_out.c_str());
scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
strwiden(wb.get(), len, t_out.c_str());
out = wb.get();
}
else
out.append(1, (regex_wchar_type)0);
}
return result;
}
#endif
c_regex_traits<char> c_regex_traits<char>::i;
void BOOST_REGEX_CALL c_regex_traits<char>::init()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::re_init_threads();
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
// just keep track of entry_count
if(entry_count == 0)
{
ctype_name = new std::string("xxxxxxxxxxxxxxxx");
#ifndef BOOST_NO_EXCEPTIONS
try{
#endif
collate_name = new std::string("xxxxxxxxxxxxxxxx");
BOOST_REGEX_NOEH_ASSERT(collate_name)
#ifndef BOOST_NO_EXCEPTIONS
}
catch(...)
{
delete ctype_name;
throw;
}
#endif
}
re_message_init();
re_init_classes();
re_init_collate();
++entry_count;
}
void BOOST_REGEX_CALL c_regex_traits<char>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
re_message_update();
if(*collate_name != re_get_locale(LC_COLLATE))
{
do_update_collate();
*collate_name = re_get_locale(LC_COLLATE);
}
if(*ctype_name != re_get_locale(LC_CTYPE))
{
do_update_ctype();
*ctype_name = re_get_locale(LC_CTYPE);
}
sort_type = re_detail::find_sort_syntax(&i, &sort_delim);
}
void BOOST_REGEX_CALL c_regex_traits<char>::m_free()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
re_message_free();
re_free_classes();
re_free_collate();
--entry_count;
// add reference to static member here to ensure
// that the linker includes it in the .exe:
if((entry_count == 0) && (0 != &c_regex_traits<char>::i))
{
delete ctype_name;
delete collate_name;
}
#ifdef BOOST_HAS_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
void BOOST_REGEX_CALL c_regex_traits<char>::transform(std::string& out, const std::string& in)
{
BOOST_RE_GUARD_STACK
std::size_t n = std::strxfrm(0, in.c_str(), 0);
if(n == (std::size_t)(-1))
{
out = in;
return;
}
scoped_array<char> buf(new char[n+1]);
n = std::strxfrm(buf.get(), in.c_str(), n+1);
if(n == (std::size_t)(-1))
{
out = in;
return;
}
out = buf.get();
}
void BOOST_REGEX_CALL c_regex_traits<char>::transform_primary(std::string& out, const std::string& in)
{
transform(out, in);
switch(sort_type)
{
case re_detail::sort_C:
case re_detail::sort_unknown:
break;
case re_detail::sort_fixed:
out.erase((int)sort_delim);
break;
case re_detail::sort_delim:
for(unsigned int j = 0; j < out.size(); ++j)
{
if((out[j] == sort_delim) && (j+1 < out.size()))
{
out.erase(j+1);
break;
}
}
}
}
unsigned c_regex_traits<char>::sort_type;
char c_regex_traits<char>::sort_delim;
int BOOST_REGEX_CALL c_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 c_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 = 1u << (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
unsigned int BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::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;
}
void BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::init()
{
BOOST_RE_GUARD_STACK
re_detail::re_init_threads();
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
re_message_init();
re_init_classes();
re_init_collate();
if(nlsw_count == 0)
{
wlocale_name = new std::string("xxxxxxxxxxxxxxxx");
#ifndef BOOST_NO_EXCEPTIONS
try{
#endif
syntax = new std::list<syntax_map_t>();
BOOST_REGEX_NOEH_ASSERT(syntax)
#ifndef BOOST_NO_EXCEPTIONS
}
catch(...)
{
delete wlocale_name;
throw;
}
#endif
}
++nlsw_count;
}
bool BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::do_lookup_collate(std::basic_string<regex_wchar_type>& out, const regex_wchar_type* first, const regex_wchar_type* last)
{
BOOST_RE_GUARD_STACK
std::basic_string<regex_wchar_type> s(first, last);
std::size_t 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<regex_wchar_type*>(0), 0, t_out.c_str());
scoped_array<regex_wchar_type> wb(new regex_wchar_type[len]);
strwiden(wb.get(), len, t_out.c_str());
out = wb.get();
}
return result;
}
void BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::update()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
re_message_update();
re_update_classes();
re_update_collate();
std::string l(re_get_locale(LC_CTYPE));
if(*wlocale_name != l)
{
*wlocale_name = l;
std::basic_string<regex_wchar_type> s;
const regex_wchar_type* p = (const regex_wchar_type*)L"zero";
if(do_lookup_collate(s, p, p+4))
{
jm_assert(s.size() == 1);
re_zero_w = *s.c_str();
}
else
re_zero_w = L'0';
p = (const regex_wchar_type*)L"ten";
if(do_lookup_collate(s, p, p+3))
{
jm_assert(s.size() == 1);
re_ten_w = *s.c_str();
}
else
re_ten_w = L'a';
unsigned int i;
regex_wchar_type buf[256];
syntax_map_t sm;
syntax->clear();
for(i = 1; i < syntax_max; ++i)
{
regex_wchar_type* ptr = buf;
re_get_message(static_cast<regex_wchar_type*>(buf), 256, i+100);
for(; *ptr; ++ptr)
{
sm.c = *ptr;
sm.type = i;
syntax->push_back(sm);
}
}
sort_type = re_detail::find_sort_syntax(&init_, &sort_delim);
}
}
void BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::m_free()
{
BOOST_RE_GUARD_STACK
#ifdef BOOST_HAS_THREADS
re_detail::cs_guard g(*re_detail::p_re_lock);
#endif
--nlsw_count;
re_message_free();
re_free_classes();
re_free_collate();
// add reference to static member here to ensure
// that the linker includes it in the .exe:
if((nlsw_count == 0) && (0 != &c_regex_traits<regex_wchar_type>::init_))
{
// cleanup:
delete wlocale_name;
delete syntax;
}
#ifdef BOOST_HAS_THREADS
g.acquire(false);
re_detail::re_free_threads();
#endif
}
bool BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::do_iswclass(regex_wchar_type 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);
if((f & char_class_alpha) && std::iswalpha(c))
return true;
if((f & char_class_cntrl) && std::iswcntrl(c))
return true;
if((f & char_class_digit) && std::iswdigit(c))
return true;
if((f & char_class_lower) && std::iswlower(c))
return true;
if((f & char_class_punct) && std::iswpunct(c))
return true;
if((f & char_class_space) && std::iswspace(c))
return true;
if((f & char_class_upper) && std::iswupper(c))
return true;
if((f & char_class_xdigit) && std::iswxdigit(c))
return true;
if(f & char_class_unicode)
return true;
return false;
}
void BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::transform(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
{
BOOST_RE_GUARD_STACK
#ifndef BOOST_MSVC
std::size_t n = std::wcsxfrm(0, in.c_str(), 0);
#else
// broken wcsxfrm under VC6 doesn't check size of
// output buffer, we have no choice but to guess!
std::size_t n = 100 * in.size();
#endif
if((n == (std::size_t)(-1)) || (n == 0))
{
out = in;
return;
}
scoped_array<regex_wchar_type> buf(new regex_wchar_type[n+1]);
n = std::wcsxfrm((wchar_t*)buf.get(), (const wchar_t*)in.c_str(), n+1);
if(n == (std::size_t)(-1))
{
out = in;
return;
}
out = buf.get();
}
void BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::transform_primary(std::basic_string<regex_wchar_type>& out, const std::basic_string<regex_wchar_type>& in)
{
transform(out, in);
switch(sort_type)
{
case re_detail::sort_C:
case re_detail::sort_unknown:
break;
case re_detail::sort_fixed:
if((unsigned)sort_delim < out.size())
out.erase((int)sort_delim);
break;
case re_detail::sort_delim:
for(unsigned int i = 0; i < out.size(); ++i)
{
if((out[i] == sort_delim) && (i+1 < out.size()))
{
out.erase(i+1);
break;
}
}
}
}
unsigned c_regex_traits<regex_wchar_type>::sort_type;
regex_wchar_type c_regex_traits<regex_wchar_type>::sort_delim;
int BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::toi(regex_wchar_type 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 c_regex_traits<regex_wchar_type>::toi(const regex_wchar_type*& first, const regex_wchar_type* 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 = 1u << (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 c_regex_traits<regex_wchar_type>::lookup_classname(const regex_wchar_type* first, const regex_wchar_type* last)
{
std::basic_string<regex_wchar_type> s(first, last);
std::size_t len = strnarrow(static_cast<char*>(0), 0, s.c_str());
scoped_array<char> buf(new char[len]);
strnarrow(buf.get(), len, s.c_str());
boost::uint_fast32_t result = do_lookup_class(buf.get());
return result;
}
c_regex_traits<regex_wchar_type> c_regex_traits<regex_wchar_type>::init_;
std::size_t BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::strnarrow(char *s1, std::size_t len, const regex_wchar_type *s2)
{
BOOST_RE_GUARD_STACK
std::size_t size = std::wcslen((const wchar_t*)s2) + 1;
if(size > len)
return size;
return std::wcstombs(s1, (const wchar_t*)s2, len);
}
std::size_t BOOST_REGEX_CALL c_regex_traits<regex_wchar_type>::strwiden(regex_wchar_type *s1, std::size_t len, const char *s2)
{
BOOST_RE_GUARD_STACK
std::size_t size = std::strlen(s2) + 1;
if(size > len)
return size;
size = std::mbstowcs((wchar_t*)s1, s2, len);
s1[size] = 0;
return size + 1;
}
#endif // BOOST_NO_WREGEX
} // namespace boost
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -