regex_format.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 577 行 · 第 1/2 页

HPP
577
字号
/* * * Copyright (c) 1998-2002 * Dr 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         regex_format.hpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: Provides formatting output routines for search and replace  *                operations.  Note this is an internal header file included  *                by regex.hpp, do not include on its own.  */#ifndef BOOST_REGEX_FORMAT_HPP#define BOOST_REGEX_FORMAT_HPPnamespace boost{enum format_flags_t{   format_all = 0,                      // enable all extentions to sytax   format_sed = match_max << 1,         // sed style replacement.   format_perl = format_sed << 1,       // perl style replacement.   format_no_copy = format_perl << 1,   // don't copy non-matching segments.   format_first_only = format_no_copy << 1,   // Only replace first occurance.   format_is_if = format_first_only << 1   // internal use only.};namespace re_detail{#ifdef __BORLANDC__   #pragma option push -a8 -b -Vx -Ve -pc  -w-8037#endiftemplate <class O, class I>O BOOST_REGEX_CALL re_copy_out(O out, I first, I last){   while(first != last)   {      *out = *first;      ++out;      ++first;   }   return out;}template <class charT, class traits_type>void BOOST_REGEX_CALL re_skip_format(const charT*& fmt, const traits_type& traits_inst){   // dwa 9/13/00 - suppress incorrect unused parameter warning for MSVC   (void)traits_inst;   typedef typename traits_type::size_type traits_size_type;   typedef typename traits_type::uchar_type traits_uchar_type;   typedef typename traits_type::string_type traits_string_type;   unsigned int parens = 0;   unsigned int c;   while(*fmt)   {      c = traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt));      if((c == traits_type::syntax_colon) && (parens == 0))      {         ++fmt;         return;      }      else if(c == traits_type::syntax_close_bracket)      {         if(parens == 0)         {            ++fmt;            return;         }         --parens;      }      else if(c == traits_type::syntax_open_bracket)         ++parens;      else if(c == traits_type::syntax_slash)      {         ++fmt;         if(*fmt == 0)            return;      }      ++fmt;   }}#ifdef BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN//// ugly hack for buggy output iteratorstemplate <class T>inline void oi_assign(T* p, T v){   ::boost::re_detail::pointer_destroy(p);   pointer_construct(p, v);}#elsetemplate <class T>inline void oi_assign(T* p, T v){   //   // if you get a compile time error in here then you either   // need to rewrite your output iterator to make it assignable   // (as is required by the standard), or define   // BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN to use the ugly hack above   *p = v;}#endif#if defined(BOOST_REGEX_NO_TEMPLATE_SWITCH_MERGE)//// Ugly ugly hack,// template don't merge if they contain switch statements so declare these// templates in unnamed namespace (ie with internal linkage), each translation// unit then gets its own local copy, it works seemlessly but bloats the app.namespace{#endif//// algorithm reg_format:// takes the result of a match and a format string// and merges them to produce a new string which// is sent to an OutputIterator,// _reg_format_aux does the actual work://template <class OutputIterator, class Iterator, class Allocator, class charT, class traits_type>OutputIterator BOOST_REGEX_CALL _reg_format_aux(OutputIterator out,                           const match_results<Iterator, Allocator>& m,                           const charT*& fmt,                          unsigned flags, const traits_type& traits_inst){   const charT* fmt_end = fmt;   while(*fmt_end) ++ fmt_end;   typedef typename traits_type::size_type traits_size_type;   typedef typename traits_type::uchar_type traits_uchar_type;   typedef typename traits_type::string_type traits_string_type;   while(*fmt)   {      switch(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)))      {      case traits_type::syntax_dollar:         if(flags & format_sed)         {            // no perl style replacement,            // $ is an ordinary character:            goto default_opt;         }         ++fmt;         if(*fmt == 0) // oops trailing $         {            --fmt;            *out = *fmt;            ++out;            return out;         }         switch(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)))         {         case traits_type::syntax_start_buffer:            oi_assign(&out, re_copy_out(out, Iterator(m[-1].first), Iterator(m[-1].second)));            ++fmt;            continue;         case traits_type::syntax_end_buffer:            oi_assign(&out, re_copy_out(out, Iterator(m[-2].first), Iterator(m[-2].second)));            ++fmt;            continue;         case traits_type::syntax_digit:         {expand_sub:            unsigned int index = traits_inst.toi(fmt, fmt_end, 10);            oi_assign(&out, re_copy_out(out, Iterator(m[index].first), Iterator(m[index].second)));            continue;         }         }         // anything else:         if(*fmt == '&')         {            oi_assign(&out, re_copy_out(out, Iterator(m[0].first), Iterator(m[0].second)));            ++fmt;         }         else         {            // probably an error, treat as a literal '$'            --fmt;            *out = *fmt;            ++out;            ++fmt;         }         continue;      case traits_type::syntax_slash:      {         // escape sequence:         ++fmt;         charT c(*fmt);         if(*fmt == 0)         {            --fmt;            *out = *fmt;            ++out;            ++fmt;            return out;         }         switch(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)))         {         case traits_type::syntax_a:            c = '\a';            ++fmt;            break;         case traits_type::syntax_f:            c = '\f';            ++fmt;            break;         case traits_type::syntax_n:            c = '\n';            ++fmt;            break;         case traits_type::syntax_r:            c = '\r';            ++fmt;            break;         case traits_type::syntax_t:            c = '\t';            ++fmt;            break;         case traits_type::syntax_v:            c = '\v';            ++fmt;            break;         case traits_type::syntax_x:            ++fmt;            if(fmt == fmt_end)            {               *out = *--fmt;               ++out;               return out;            }            // maybe have \x{ddd}            if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) == traits_type::syntax_open_brace)            {               ++fmt;               if(fmt == fmt_end)               {                  fmt -= 2;                  *out = *fmt;                  ++out;                  ++fmt;                  continue;               }               if(traits_inst.is_class(*fmt, traits_type::char_class_xdigit) == false)               {                  fmt -= 2;                  *out = *fmt;                  ++out;                  ++fmt;                  continue;               }               c = (charT)traits_inst.toi(fmt, fmt_end, -16);               if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) != traits_type::syntax_close_brace)               {                  while(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) != traits_type::syntax_slash)                     --fmt;                  ++fmt;                  *out = *fmt;                  ++out;                  ++fmt;                  continue;               }               ++fmt;               break;            }            else            {               if(traits_inst.is_class(*fmt, traits_type::char_class_xdigit) == false)               {                  --fmt;

⌨️ 快捷键说明

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