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 + -
显示快捷键?