3 * Copyright (c) 1998-2002
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
13 * LOCATION: see http://www.boost.org for most recent version.
14 * FILE regex_split.hpp
15 * VERSION see <boost/version.hpp>
16 * DESCRIPTION: Implements regex_split and associated functions.
17 * Note this is an internal header file included
18 * by regex.hpp, do not include on its own.
21 #ifndef BOOST_REGEX_SPLIT_HPP
22 #define BOOST_REGEX_SPLIT_HPP
28 #pragma warning(disable: 4103)
30 #ifdef BOOST_HAS_ABI_HEADERS
31 # include BOOST_ABI_PREFIX
38 # pragma warning(push)
40 #pragma warning(disable:4800)
44 namespace BOOST_REGEX_DETAIL_NS{
46 template <class charT>
47 const basic_regex<charT>& get_default_expression(charT)
49 static const charT expression_text[4] = { '\\', 's', '+', '\00', };
50 static const basic_regex<charT> e(expression_text);
54 template <class OutputIterator, class charT, class Traits1, class Alloc1>
57 typedef std::basic_string<charT, Traits1, Alloc1> string_type;
58 typedef typename string_type::const_iterator iterator_type;
59 iterator_type* p_last;
60 OutputIterator* p_out;
62 std::size_t initial_max;
64 split_pred(iterator_type* a, OutputIterator* b, std::size_t* c)
65 : p_last(a), p_out(b), p_max(c), initial_max(*c) {}
67 bool operator()(const match_results<iterator_type>& what);
70 template <class OutputIterator, class charT, class Traits1, class Alloc1>
71 bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
72 (const match_results<iterator_type>& what)
74 *p_last = what[0].second;
77 // output sub-expressions only:
78 for(unsigned i = 1; i < what.size(); ++i)
80 *(*p_out) = what.str(i);
82 if(0 == --*p_max) return false;
88 // output $` only if it's not-null or not at the start of the input:
89 const sub_match<iterator_type>& sub = what[-1];
90 if((sub.first != sub.second) || (*p_max != initial_max))
92 *(*p_out) = sub.str();
98 // initial null, do nothing:
102 } // namespace BOOST_REGEX_DETAIL_NS
104 template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
105 std::size_t regex_split(OutputIterator out,
106 std::basic_string<charT, Traits1, Alloc1>& s,
107 const basic_regex<charT, Traits2>& e,
108 match_flag_type flags,
109 std::size_t max_split)
111 typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator ci_t;
112 //typedef typename match_results<ci_t>::allocator_type match_allocator;
113 ci_t last = s.begin();
114 std::size_t init_size = max_split;
115 BOOST_REGEX_DETAIL_NS::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
119 regex_grep(pred, i, j, e, flags);
121 // if there is still input left, do a final push as long as max_split
122 // is not exhausted, and we're not splitting sub-expressions rather
124 if(max_split && (last != s.end()) && (e.mark_count() == 0))
126 *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end());
132 // delete from the string everything that has been processed so far:
133 s.erase(0, last - s.begin());
135 // return the number of new records pushed:
136 return init_size - max_split;
139 template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
140 inline std::size_t regex_split(OutputIterator out,
141 std::basic_string<charT, Traits1, Alloc1>& s,
142 const basic_regex<charT, Traits2>& e,
143 match_flag_type flags = match_default)
145 return regex_split(out, s, e, flags, UINT_MAX);
148 template <class OutputIterator, class charT, class Traits1, class Alloc1>
149 inline std::size_t regex_split(OutputIterator out,
150 std::basic_string<charT, Traits1, Alloc1>& s)
152 return regex_split(out, s, BOOST_REGEX_DETAIL_NS::get_default_expression(charT(0)), match_default, UINT_MAX);
156 # pragma warning(pop)
160 #pragma warning(push)
161 #pragma warning(disable: 4103)
163 #ifdef BOOST_HAS_ABI_HEADERS
164 # include BOOST_ABI_SUFFIX