regex_format.hpp

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

HPP
682
字号
         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;                  *out = *fmt;                  ++out;                  ++fmt;                  continue;               }               c = (charT)traits_inst.toi(fmt, fmt_end, -16);            }            break;         case traits_type::syntax_c:            ++fmt;            if(fmt == fmt_end)            {               --fmt;               *out = *fmt;               ++out;               return out;            }            if(((typename traits_type::uchar_type)(*fmt) < (typename traits_type::uchar_type)'@')                  || ((typename traits_type::uchar_type)(*fmt) > (typename traits_type::uchar_type)127) )            {               --fmt;               *out = *fmt;               ++out;               ++fmt;               break;            }            c = (charT)((typename traits_type::uchar_type)(*fmt) - (typename traits_type::uchar_type)'@');            ++fmt;            break;         case traits_type::syntax_e:            c = (charT)27;            ++fmt;            break;         case traits_type::syntax_digit:            if(flags & format_sed)               goto expand_sub;            else               c = (charT)traits_inst.toi(fmt, fmt_end, -8);            break;         case traits_type::syntax_u:            ++fmt;            if(flags & format_sed) break;            case_flags = case_oneupper;            continue;         case traits_type::syntax_l:            ++fmt;            if(flags & format_sed) break;            case_flags = case_onelower;            continue;         case traits_type::syntax_U:            ++fmt;            if(flags & format_sed) break;            case_flags = case_allupper;            continue;         case traits_type::syntax_L:            ++fmt;            if(flags & format_sed) break;            case_flags = case_alllower;            continue;         case traits_type::syntax_E:            ++fmt;            if(flags & format_sed) break;            case_flags = case_nochange;            continue;         default:            //c = *fmt;            ++fmt;         }         *out = c;         ++out;         continue;      }      case traits_type::syntax_open_bracket:         if(0 == (flags & format_all))         {            *out = *fmt;            ++out;            ++fmt;            continue;         }         else         {            ++fmt;  // recurse            oi_assign(&out, _reg_format_aux(out, m, fmt, flags, traits_inst, case_flags));            continue;         }      case traits_type::syntax_close_bracket:         if(0 == (flags & format_all))         {            *out = *fmt;            ++out;            ++fmt;            continue;         }         else         {            ++fmt;  // return from recursion            return out;         }      case traits_type::syntax_colon:         if(flags & regex_constants::format_is_if)         {            ++fmt;            return out;         }         *out = *fmt;         ++out;         ++fmt;         continue;      case traits_type::syntax_question:      {         if(0 == (flags & format_all))         {            *out = *fmt;            ++out;            ++fmt;            continue;         }         else         {            ++fmt;            if(*fmt == 0)            {               --fmt;               *out = *fmt;               ++out;               ++fmt;               return out;            }            unsigned int id = traits_inst.toi(fmt, fmt_end, 10);            if(m[id].matched)            {               oi_assign(&out, _reg_format_aux(out, m, fmt, flags | regex_constants::format_is_if, traits_inst, case_flags));               if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*(fmt-1))) == traits_type::syntax_colon)                  re_skip_format(fmt, traits_inst);            }            else            {               re_skip_format(fmt, traits_inst);               if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*(fmt-1))) == traits_type::syntax_colon)                  oi_assign(&out, _reg_format_aux(out, m, fmt, flags | regex_constants::format_is_if, traits_inst, case_flags));            }            return out;         }      }      default:default_opt:         if((flags & format_sed) && (*fmt == '&'))         {            oi_assign(&out, re_copy_out(out, Iterator(m[0].first), Iterator(m[0].second),                     traits_inst, case_flags));            ++fmt;            continue;         }         output_char(out, *fmt, traits_inst, case_flags);         ++out;         ++fmt;      }   }   return out;#ifdef __BORLANDC__#pragma option pop#endif}#if defined(BOOST_REGEX_NO_TEMPLATE_SWITCH_MERGE)} // namespace#endiftemplate <class S>class string_out_iterator{   S* out;public:   typedef typename S::difference_type difference_type;   typedef typename S::value_type value_type;   typedef typename S::pointer pointer;   typedef typename S::reference reference;   typedef          std::output_iterator_tag iterator_category;   string_out_iterator(S& s) : out(&s) {}   string_out_iterator& operator++() { return *this; }   string_out_iterator& operator++(int) { return *this; }   string_out_iterator& operator*() { return *this; }   string_out_iterator& operator=(typename S::value_type v)   {      out->append(1, v);      return *this;   }};template <class OutputIterator, class Iterator, class charT, class Allocator, class traits_type>class merge_out_predicate{   OutputIterator* out;   Iterator* last;   const charT* fmt;   match_flag_type flags;   const traits_type* pt;   // rebind allocator to correct type:   typedef typename detail::rebind_allocator<sub_match<Iterator>, Allocator>::type alloc_type;public:   merge_out_predicate(OutputIterator& o, Iterator& pi, const charT* f, match_flag_type format_flags, const traits_type& p)      : out(&o), last(&pi), fmt(f), flags(format_flags), pt(&p){}   ~merge_out_predicate() {}   bool BOOST_REGEX_CALL operator()(const boost::match_results<Iterator, alloc_type>& m)   {      const charT* f = fmt;      case_flags_type cf = case_nochange;      if(0 == (flags & format_no_copy))      {         oi_assign(out, re_copy_out(                     *out,                      Iterator(m[-1].first),                      Iterator(m[-1].second),                     *pt,                      cf));      }      oi_assign(out, _reg_format_aux(*out, m, f, flags, *pt, cf));      *last = m[-2].first;      return flags & format_first_only ? false : true;   }};} // namespace re_detailtemplate <class OutputIterator, class Iterator, class Allocator, class charT>OutputIterator regex_format(OutputIterator out,                          const match_results<Iterator, Allocator>& m,                          const charT* fmt,                          match_flag_type flags = format_all                         ){   regex_traits<charT> t;   re_detail::case_flags_type cf = re_detail::case_nochange;   return re_detail::_reg_format_aux(out, m, fmt, flags, t, cf);}template <class OutputIterator, class Iterator, class Allocator, class charT>OutputIterator regex_format(OutputIterator out,                          const match_results<Iterator, Allocator>& m,                          const std::basic_string<charT>& fmt,                          match_flag_type flags = format_all                         ){   regex_traits<charT> t;   const charT* start = fmt.c_str();   re_detail::case_flags_type cf = re_detail::case_nochange;   return re_detail::_reg_format_aux(out, m, start, flags, t, cf);}template <class Iterator, class Allocator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator, Allocator>& m,                                      const charT* fmt,                                      match_flag_type flags = format_all){   std::basic_string<charT> result;   re_detail::string_out_iterator<std::basic_string<charT> > i(result);   regex_format(i, m, fmt, flags);   return result;}template <class Iterator, class Allocator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator, Allocator>& m,                                      const std::basic_string<charT>& fmt,                                      match_flag_type flags = format_all){   std::basic_string<charT> result;   re_detail::string_out_iterator<std::basic_string<charT> > i(result);   regex_format(i, m, fmt.c_str(), flags);   return result;}#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_SUFFIX#endif} // namespace boost#endif  // BOOST_REGEX_FORMAT_HPP

⌨️ 快捷键说明

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