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