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)
39 # pragma warning(disable: 4800)
44 template <class charT
>
45 const basic_regex
<charT
>& get_default_expression(charT
)
47 static const charT expression_text
[4] = { '\\', 's', '+', '\00', };
48 static const basic_regex
<charT
> e(expression_text
);
52 template <class OutputIterator
, class charT
, class Traits1
, class Alloc1
>
55 typedef std::basic_string
<charT
, Traits1
, Alloc1
> string_type
;
56 typedef typename
string_type::const_iterator iterator_type
;
57 iterator_type
* p_last
;
58 OutputIterator
* p_out
;
60 std::size_t initial_max
;
62 split_pred(iterator_type
* a
, OutputIterator
* b
, std::size_t* c
)
63 : p_last(a
), p_out(b
), p_max(c
), initial_max(*c
) {}
65 bool operator()(const match_results
<iterator_type
>& what
);
68 template <class OutputIterator
, class charT
, class Traits1
, class Alloc1
>
69 bool split_pred
<OutputIterator
, charT
, Traits1
, Alloc1
>::operator()
70 (const match_results
<iterator_type
>& what
)
72 *p_last
= what
[0].second
;
75 // output sub-expressions only:
76 for(unsigned i
= 1; i
< what
.size(); ++i
)
78 *(*p_out
) = what
.str(i
);
80 if(0 == --*p_max
) return false;
86 // output $` only if it's not-null or not at the start of the input:
87 const sub_match
<iterator_type
>& sub
= what
[-1];
88 if((sub
.first
!= sub
.second
) || (*p_max
!= initial_max
))
90 *(*p_out
) = sub
.str();
96 // initial null, do nothing:
100 } // namespace re_detail
102 template <class OutputIterator
, class charT
, class Traits1
, class Alloc1
, class Traits2
>
103 std::size_t regex_split(OutputIterator out
,
104 std::basic_string
<charT
, Traits1
, Alloc1
>& s
,
105 const basic_regex
<charT
, Traits2
>& e
,
106 match_flag_type flags
,
107 std::size_t max_split
)
109 typedef typename
std::basic_string
<charT
, Traits1
, Alloc1
>::const_iterator ci_t
;
110 typedef typename match_results
<ci_t
>::allocator_type match_allocator
;
111 ci_t last
= s
.begin();
112 std::size_t init_size
= max_split
;
113 re_detail::split_pred
<OutputIterator
, charT
, Traits1
, Alloc1
> pred(&last
, &out
, &max_split
);
117 regex_grep(pred
, i
, j
, e
, flags
);
119 // if there is still input left, do a final push as long as max_split
120 // is not exhausted, and we're not splitting sub-expressions rather
122 if(max_split
&& (last
!= s
.end()) && (e
.mark_count() == 1))
124 *out
= std::basic_string
<charT
, Traits1
, Alloc1
>((ci_t
)last
, (ci_t
)s
.end());
130 // delete from the string everything that has been processed so far:
131 s
.erase(0, last
- s
.begin());
133 // return the number of new records pushed:
134 return init_size
- max_split
;
137 template <class OutputIterator
, class charT
, class Traits1
, class Alloc1
, class Traits2
>
138 inline std::size_t regex_split(OutputIterator out
,
139 std::basic_string
<charT
, Traits1
, Alloc1
>& s
,
140 const basic_regex
<charT
, Traits2
>& e
,
141 match_flag_type flags
= match_default
)
143 return regex_split(out
, s
, e
, flags
, UINT_MAX
);
146 template <class OutputIterator
, class charT
, class Traits1
, class Alloc1
>
147 inline std::size_t regex_split(OutputIterator out
,
148 std::basic_string
<charT
, Traits1
, Alloc1
>& s
)
150 return regex_split(out
, s
, re_detail::get_default_expression(charT(0)), match_default
, UINT_MAX
);
154 # pragma warning(pop)
158 #pragma warning(push)
159 #pragma warning(disable: 4103)
161 #ifdef BOOST_HAS_ABI_HEADERS
162 # include BOOST_ABI_SUFFIX