wc_regex_traits.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 314 行

CPP
314
字号
/* * * Copyright (c) 2004 * John Maddock * * Use, modification and distribution are subject to the  * Boost Software License, Version 1.0. (See accompanying file  * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ /*  *   LOCATION:    see http://www.boost.org for most recent version.  *   FILE:        wc_regex_traits.cpp  *   VERSION:     see <boost/version.hpp>  *   DESCRIPTION: Implements out of line members for c_regex_traits<wchar_t>  */#define BOOST_REGEX_SOURCE#include <boost/detail/workaround.hpp>#include <memory>#include <string>#if defined(_DLL_CPPLIB) && !defined(_M_CEE_PURE) \   && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) || defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER))//// This is a horrible workaround, but without declaring these symbols extern we get// duplicate symbol errors when linking if the application is built without// /Zc:wchar_t//#ifdef _CRTIMP2_PURE#  define BOOST_REGEX_STDLIB_DECL _CRTIMP2_PURE#else#  define BOOST_REGEX_STDLIB_DECL _CRTIMP2#endifnamespace std{#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)template class BOOST_REGEX_STDLIB_DECL allocator<unsigned short>;template class BOOST_REGEX_STDLIB_DECL _String_val<unsigned short, allocator<unsigned short> >;template class BOOST_REGEX_STDLIB_DECL basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >;#endif#if BOOST_WORKAROUND(BOOST_MSVC, > 1300) && BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400))template<> BOOST_REGEX_STDLIB_DECL std::size_t __cdecl char_traits<unsigned short>::length(unsigned short const*);#endiftemplate BOOST_REGEX_STDLIB_DECL bool __cdecl operator==(   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&,   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&);template BOOST_REGEX_STDLIB_DECL bool __cdecl operator==(   const unsigned short *,   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&);template BOOST_REGEX_STDLIB_DECL bool __cdecl operator==(   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&,   const unsigned short *);template BOOST_REGEX_STDLIB_DECL bool __cdecl operator<(   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&,   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&);template BOOST_REGEX_STDLIB_DECL bool __cdecl operator>(   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&,   const basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short> >&);}#endif#include <boost/regex/config.hpp>#include <boost/detail/workaround.hpp>#if !BOOST_WORKAROUND(__BORLANDC__, < 0x560)#include <boost/regex/v4/c_regex_traits.hpp>#ifndef BOOST_NO_WREGEX#include <boost/regex/v4/primary_transform.hpp>#include <boost/regex/v4/regex_traits_defaults.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{   using ::wcstol;}#endifnamespace boost{c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform(const wchar_t* p1, const wchar_t* p2) {    std::size_t r;   std::size_t s = 10;   std::wstring src(p1, p2);   std::wstring result(s, L' ');   while(s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s)))   {      result.append(r - s + 3, L' ');      s = result.size();   }   result.erase(r);   return result; }c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform_primary(const wchar_t* p1, const wchar_t* p2) {   static wchar_t s_delim;   static const int s_collate_type = ::boost::re_detail::find_sort_syntax(static_cast<const c_regex_traits<wchar_t>*>(0), &s_delim);   std::wstring result;   //   // What we do here depends upon the format of the sort key returned by   // sort key returned by this->transform:   //   switch(s_collate_type)   {   case ::boost::re_detail::sort_C:   case ::boost::re_detail::sort_unknown:      // the best we can do is translate to lower case, then get a regular sort key:      {         result.assign(p1, p2);         for(std::wstring::size_type i = 0; i < result.size(); ++i)            result[i] = (std::towlower)(result[i]);         result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());         break;      }   case ::boost::re_detail::sort_fixed:      {         // get a regular sort key, and then truncate it:         result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());         result.erase(s_delim);         break;      }   case ::boost::re_detail::sort_delim:         // get a regular sort key, and then truncate everything after the delim:         result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());         if(result.size() && (result[0] == s_delim))            break;         std::size_t i;         for(i = 0; i < result.size(); ++i)         {            if(result[i] == s_delim)               break;         }         result.erase(i);         break;   }   if(result.empty())      result = std::wstring(1, char(0));   return result;}enum{   char_class_space=1<<0,    char_class_print=1<<1,    char_class_cntrl=1<<2,    char_class_upper=1<<3,    char_class_lower=1<<4,   char_class_alpha=1<<5,    char_class_digit=1<<6,    char_class_punct=1<<7,    char_class_xdigit=1<<8,   char_class_alnum=char_class_alpha|char_class_digit,    char_class_graph=char_class_alnum|char_class_punct,   char_class_blank=1<<9,   char_class_word=1<<10,   char_class_unicode=1<<11};c_regex_traits<wchar_t>::char_class_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_classname(const wchar_t* p1, const wchar_t* p2) {   static const char_class_type masks[] =    {      0,      char_class_alnum,       char_class_alpha,      char_class_blank,      char_class_cntrl,      char_class_digit,      char_class_digit,      char_class_graph,      char_class_lower,      char_class_lower,      char_class_print,      char_class_punct,      char_class_space,      char_class_space,      char_class_upper,      char_class_unicode,      char_class_upper,      char_class_alnum | char_class_word,       char_class_alnum | char_class_word,       char_class_xdigit,   };   int id = ::boost::re_detail::get_default_class_id(p1, p2);   if(id < 0)   {      std::wstring s(p1, p2);      for(std::wstring::size_type i = 0; i < s.size(); ++i)         s[i] = (std::towlower)(s[i]);      id = ::boost::re_detail::get_default_class_id(&*s.begin(), &*s.begin() + s.size());   }   BOOST_ASSERT(id+1 < static_cast<int>(sizeof(masks) / sizeof(masks[0])));   return masks[id+1];}bool BOOST_REGEX_CALL c_regex_traits<wchar_t>::isctype(wchar_t c, char_class_type mask) {   return      ((mask & char_class_space) && (std::iswspace)(c))      || ((mask & char_class_print) && (std::iswprint)(c))      || ((mask & char_class_cntrl) && (std::iswcntrl)(c))      || ((mask & char_class_upper) && (std::iswupper)(c))      || ((mask & char_class_lower) && (std::iswlower)(c))      || ((mask & char_class_alpha) && (std::iswalpha)(c))      || ((mask & char_class_digit) && (std::iswdigit)(c))      || ((mask & char_class_punct) && (std::iswpunct)(c))      || ((mask & char_class_xdigit) && (std::iswxdigit)(c))      || ((mask & char_class_blank) && (std::iswspace)(c) && !::boost::re_detail::is_separator(c))      || ((mask & char_class_word) && (c == '_'))      || ((mask & char_class_unicode) && (c & ~static_cast<wchar_t>(0xff)));}c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_collatename(const wchar_t* p1, const wchar_t* p2) {#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)   std::string name(p1, p2);#else   std::string name;   const wchar_t* p0 = p1;   while(p0 != p2)      name.append(1, char(*p0++));#endif   name = ::boost::re_detail::lookup_default_collate_name(name);#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)   if(name.size())      return string_type(name.begin(), name.end());#else   if(name.size())   {      string_type result;      typedef std::string::const_iterator iter;      iter b = name.begin();      iter e = name.end();      while(b != e)         result.append(1, wchar_t(*b++));      return result;   }#endif   if(p2 - p1 == 1)      return string_type(1, *p1);   return string_type();}int BOOST_REGEX_CALL c_regex_traits<wchar_t>::value(wchar_t c, int radix) {#ifdef __BORLANDC__   // workaround for broken wcstol:   if((std::iswxdigit)(c) == 0)      return -1;#endif   wchar_t b[2] = { c, '\0', };   wchar_t* ep;   int result = std::wcstol(b, &ep, radix);   if(ep == b)      return -1;   return result;}#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_Tc_regex_traits<unsigned short>::string_type BOOST_REGEX_CALL c_regex_traits<unsigned short>::transform(const unsigned short* p1, const unsigned short* p2){   std::wstring result = c_regex_traits<wchar_t>::transform((const wchar_t*)p1, (const wchar_t*)p2);   return string_type(result.begin(), result.end());}c_regex_traits<unsigned short>::string_type BOOST_REGEX_CALL c_regex_traits<unsigned short>::transform_primary(const unsigned short* p1, const unsigned short* p2){   std::wstring result = c_regex_traits<wchar_t>::transform_primary((const wchar_t*)p1, (const wchar_t*)p2);   return string_type(result.begin(), result.end());}c_regex_traits<unsigned short>::char_class_type BOOST_REGEX_CALL c_regex_traits<unsigned short>::lookup_classname(const unsigned short* p1, const unsigned short* p2){   return c_regex_traits<wchar_t>::lookup_classname((const wchar_t*)p1, (const wchar_t*)p2);}c_regex_traits<unsigned short>::string_type BOOST_REGEX_CALL c_regex_traits<unsigned short>::lookup_collatename(const unsigned short* p1, const unsigned short* p2){   std::wstring result = c_regex_traits<wchar_t>::lookup_collatename((const wchar_t*)p1, (const wchar_t*)p2);   return string_type(result.begin(), result.end());}bool BOOST_REGEX_CALL c_regex_traits<unsigned short>::isctype(unsigned short c, char_class_type m){   return c_regex_traits<wchar_t>::isctype(c, m);}int BOOST_REGEX_CALL c_regex_traits<unsigned short>::value(unsigned short c, int radix){   return c_regex_traits<wchar_t>::value(c, radix);}#endif}#endif // BOOST_NO_WREGEX#endif // __BORLANDC__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?