regex_format.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 655 行 · 第 1/2 页

HPP
655
字号
            ++m_position;            put(*m_position++);            return;         }         ++m_position;         put(static_cast<char_type>(val));         return;      }      else      {         std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);         len = (std::min)(static_cast<std::ptrdiff_t>(2), len);         int val = m_traits.toi(m_position, m_position + len, 16);         if(val < 0)         {            --m_position;            put(*m_position++);            return;         }         put(static_cast<char_type>(val));      }      break;   case 'c':      if(++m_position == m_end)      {         --m_position;         put(*m_position++);         return;      }      put(static_cast<char_type>(*m_position++ % 32));      break;   case 'e':      put(static_cast<char_type>(27));      ++m_position;      break;   default:      // see if we have a perl specific escape:      if((m_flags & boost::regex_constants::format_sed) == 0)      {         bool breakout = false;         switch(*m_position)         {         case 'l':            ++m_position;            m_restore_state = m_state;            m_state = output_next_lower;            breakout = true;            break;         case 'L':            ++m_position;            m_state = output_lower;            breakout = true;            break;         case 'u':            ++m_position;            m_restore_state = m_state;            m_state = output_next_upper;            breakout = true;            break;         case 'U':            ++m_position;            m_state = output_upper;            breakout = true;            break;         case 'E':            ++m_position;            m_state = output_copy;            breakout = true;            break;         }         if(breakout)            break;      }      // see if we have a \n sed style backreference:      int v = m_traits.toi(m_position, m_position+1, 10);      if((v > 0) || ((v == 0) && (m_flags & ::boost::regex_constants::format_sed)))      {         put(m_results[v]);         break;      }      else if(v == 0)      {         // octal ecape sequence:         --m_position;         std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);         len = (std::min)(static_cast<std::ptrdiff_t>(4), len);         v = m_traits.toi(m_position, m_position + len, 8);         BOOST_ASSERT(v >= 0);         put(static_cast<char_type>(v));         break;      }      // Otherwise output the character "as is":      put(*m_position++);      break;   }}template <class OutputIterator, class Results, class traits>void basic_regex_formatter<OutputIterator, Results, traits>::format_conditional(){   if(m_position == m_end)   {      // oops trailing '?':      put(static_cast<char_type>('?'));      return;   }   std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);   len = (std::min)(static_cast<std::ptrdiff_t>(2), len);   int v = m_traits.toi(m_position, m_position + len, 10);   if(v < 0)   {      // oops not a number:      put(static_cast<char_type>('?'));      return;   }   // output varies depending upon whether sub-expression v matched or not:   if(m_results[v].matched)   {      m_have_conditional = true;      format_all();      m_have_conditional = false;      if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))      {         // skip the ':':         ++m_position;         // save output state, then turn it off:         output_state saved_state = m_state;         m_state = output_none;         // format the rest of this scope:         format_until_scope_end();         // restore output state:         m_state = saved_state;      }   }   else   {      // save output state, then turn it off:      output_state saved_state = m_state;      m_state = output_none;      // format until ':' or ')':      m_have_conditional = true;      format_all();      m_have_conditional = false;      // restore state:      m_state = saved_state;      if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))      {         // skip the ':':         ++m_position;         // format the rest of this scope:         format_until_scope_end();      }   }}template <class OutputIterator, class Results, class traits>void basic_regex_formatter<OutputIterator, Results, traits>::format_until_scope_end(){   do   {      format_all();      if((m_position == m_end) || (*m_position == static_cast<char_type>(')')))         return;      put(*m_position++);   }while(m_position != m_end);}template <class OutputIterator, class Results, class traits>void basic_regex_formatter<OutputIterator, Results, traits>::put(char_type c){   // write a single character to output   // according to which case translation mode we are in:   switch(this->m_state)   {   case output_none:      return;   case output_next_lower:      c = m_traits.tolower(c);      this->m_state = m_restore_state;      break;   case output_next_upper:      c = m_traits.toupper(c);      this->m_state = m_restore_state;      break;   case output_lower:      c = m_traits.tolower(c);      break;   case output_upper:      c = m_traits.toupper(c);      break;   default:      break;   }   *m_out = c;   ++m_out;}template <class OutputIterator, class Results, class traits>void basic_regex_formatter<OutputIterator, Results, traits>::put(const sub_match_type& sub){   typedef typename sub_match_type::iterator iterator_type;   iterator_type i = sub.first;   while(i != sub.second)   {      put(*i);      ++i;   }}template <class S>class string_out_iterator#ifndef BOOST_NO_STD_ITERATOR   : public std::iterator<std::output_iterator_tag, typename S::value_type>#endif{   S* out;public:   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;    }#ifdef BOOST_NO_STD_ITERATOR   typedef std::ptrdiff_t difference_type;   typedef typename S::value_type value_type;   typedef value_type* pointer;   typedef value_type& reference;   typedef std::output_iterator_tag iterator_category;#endif};template <class OutputIterator, class Iterator, class Alloc, class charT, class traits>OutputIterator regex_format_imp(OutputIterator out,                          const match_results<Iterator, Alloc>& m,                          const charT* p1, const charT* p2,                          match_flag_type flags,                          const traits& t                         ){   if(flags & regex_constants::format_literal)   {      return re_detail::copy(p1, p2, out);   }   re_detail::basic_regex_formatter<      OutputIterator,       match_results<Iterator, Alloc>,       traits > f(out, m, t);   return f.format(p1, p2, flags);}} // namespace re_detailtemplate <class OutputIterator, class Iterator, class charT>OutputIterator regex_format(OutputIterator out,                          const match_results<Iterator>& m,                          const charT* fmt,                          match_flag_type flags = format_all                         ){   re_detail::trivial_format_traits<charT> traits;   return re_detail::regex_format_imp(out, m, fmt, fmt + traits.length(fmt), flags, traits);}template <class OutputIterator, class Iterator, class charT>OutputIterator regex_format(OutputIterator out,                          const match_results<Iterator>& m,                          const std::basic_string<charT>& fmt,                          match_flag_type flags = format_all                         ){   re_detail::trivial_format_traits<charT> traits;   return re_detail::regex_format_imp(out, m, fmt.data(), fmt.data() + fmt.size(), flags, traits);}  template <class Iterator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator>& 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);   re_detail::trivial_format_traits<charT> traits;   re_detail::regex_format_imp(i, m, fmt, fmt + traits.length(fmt), flags, traits);   return result;}template <class Iterator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator>& 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);   re_detail::trivial_format_traits<charT> traits;   re_detail::regex_format_imp(i, m, fmt.data(), fmt.data() + fmt.size(), flags, traits);   return result;}#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable: 4103)#endif#ifdef BOOST_HAS_ABI_HEADERS#  include BOOST_ABI_SUFFIX#endif#ifdef BOOST_MSVC#pragma warning(pop)#endif} // namespace boost#endif  // BOOST_REGEX_FORMAT_HPP

⌨️ 快捷键说明

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