3 #include "threadtypes.hpp"
6 #include <boost/regex.hpp>
7 #include "map-pointer.hpp"
9 std::string
strip_CR(const std::string
& str
)
16 void istrip_CR(std::string
& str
)
19 size_t xl
= str
.length();
21 char y
= str
[xl
- crc
- 1];
22 if(y
!= '\r' && y
!= '\n')
26 str
= str
.substr(0, xl
- crc
);
29 int firstchar(const std::string
& str
)
32 return static_cast<unsigned char>(str
[0]);
37 int string_to_bool(const std::string
& x
)
40 for(size_t i
= 0; i
< y
.length(); i
++)
42 if(y
== "on" || y
== "true" || y
== "yes" || y
== "1" || y
== "enable" || y
== "enabled")
44 if(y
== "off" || y
== "false" || y
== "no" || y
== "0" || y
== "disable" || y
== "disabled")
49 regex_results::regex_results()
54 regex_results::regex_results(std::vector
<std::string
> res
, std::vector
<std::pair
<size_t, size_t>> mch
)
61 regex_results::operator bool() const
66 bool regex_results::operator!() const
71 size_t regex_results::size() const
73 return results
.size();
76 const std::string
& regex_results::operator[](size_t i
) const
81 std::pair
<size_t, size_t> regex_results::match(size_t i
) const
86 regex_results
regex(const std::string
& regexp
, const std::string
& str
, const char* ex
) throw(std::bad_alloc
,
91 static std::map
<std::string
, map_pointer
<boost::regex
>> regexps
;
92 if(!regexps
.count(regexp
)) {
93 boost::regex
* y
= NULL
;
95 y
= new boost::regex(regexp
, boost::regex::extended
& ~boost::regex::collate
);
97 } catch(std::bad_alloc
& e
) {
100 } catch(std::exception
& e
) {
101 throw std::runtime_error(e
.what());
105 boost::smatch matches
;
106 bool x
= boost::regex_match(str
.begin(), str
.end(), matches
, *(regexps
[regexp
]));
108 std::vector
<std::string
> res
;
109 std::vector
<std::pair
<size_t, size_t>> mch
;
110 for(size_t i
= 0; i
< matches
.size(); i
++) {
111 res
.push_back(matches
.str(i
));
112 mch
.push_back(std::make_pair(matches
[i
].first
- str
.begin(),
113 matches
[i
].second
- matches
[i
].first
));
115 return regex_results(res
, mch
);
117 throw std::runtime_error(ex
);
119 return regex_results();
122 bool regex_match(const std::string
& regexp
, const std::string
& str
) throw(std::bad_alloc
, std::runtime_error
)
124 return regex(regexp
, str
);
129 template<typename ch
>
130 std::list
<std::basic_string
<ch
>> _split_on_codepoint(const std::basic_string
<ch
>& s
,
131 const std::basic_string
<ch
>& cp
)
133 std::list
<std::basic_string
<ch
>> ret
;
136 size_t len
= s
.length();
138 end
= s
.find(cp
, start
);
139 std::basic_string
<ch
> x
;
141 x
.resize(end
- start
);
142 std::copy(s
.begin() + start
, s
.begin() + end
, x
.begin());
143 start
= end
+ cp
.length();
145 x
.resize(len
- start
);
146 std::copy(s
.begin() + start
, s
.end(), x
.begin());
155 string_list
<T
>::string_list()
160 string_list
<T
>::string_list(const std::list
<std::basic_string
<T
>>& list
)
162 v
.resize(list
.size());
163 std::copy(list
.begin(), list
.end(), v
.begin());
167 bool string_list
<T
>::empty()
169 return (v
.size() == 0);
173 string_list
<T
> string_list
<T
>::strip_one() const
175 return string_list
<T
>(&v
[0], (v
.size() > 0) ? (v
.size() - 1) : 0);
179 size_t string_list
<T
>::size() const
185 const std::basic_string
<T
>& string_list
<T
>::operator[](size_t idx
) const
188 throw std::runtime_error("Index out of range");
193 string_list
<T
>::string_list(const std::basic_string
<T
>* array
, size_t arrsize
)
196 std::copy(array
, array
+ arrsize
, v
.begin());
200 bool string_list
<T
>::operator<(const string_list
<T
>& x
) const
202 for(size_t i
= 0; i
< v
.size() && i
< x
.v
.size(); i
++)
205 else if(v
[i
] > x
.v
[i
])
207 return (v
.size() < x
.v
.size());
211 bool string_list
<T
>::operator==(const string_list
<T
>& x
) const
213 if(v
.size() != x
.v
.size())
215 for(size_t i
= 0; i
< v
.size(); i
++)
222 bool string_list
<T
>::prefix_of(const string_list
<T
>& x
) const
224 if(v
.size() > x
.v
.size())
226 for(size_t i
= 0; i
< v
.size(); i
++)
234 template<typename T
> std::basic_string
<T
> separator();
235 template<> std::basic_string
<char> separator()
237 return utf8::to8(U
"\u2023");
240 template<> std::basic_string
<char16_t
> separator()
245 template<> std::basic_string
<char32_t
> separator()
250 template<> std::basic_string
<wchar_t> separator()
257 std::basic_string
<T
> string_list
<T
>::debug_name() const
259 std::basic_stringstream
<T
> x
;
260 for(size_t i
= 0; i
< v
.size(); i
++)
262 x
<< separator
<T
>() << v
[i
];
268 template class string_list
<char>;
269 template class string_list
<wchar_t>;
270 template class string_list
<char16_t
>;
271 template class string_list
<char32_t
>;
274 string_list
<char> split_on_codepoint(const std::string
& s
, char32_t cp
)
276 std::string _cp
= utf8::to8(std::u32string(1, cp
));
277 return _split_on_codepoint
<char>(s
, _cp
);
280 string_list
<char32_t
> split_on_codepoint(const std::u32string
& s
, char32_t cp
)
282 std::u32string
_cp(1, cp
);
283 return _split_on_codepoint
<char32_t
>(s
, _cp
);
286 template<typename T
> void token_iterator
<T
>::ctor_eos()
288 is_end_iterator
= true;
291 template<typename T
> void token_iterator
<T
>::ctor_itr(std::initializer_list
<const T
*> sep
, bool whole_sequence
)
292 throw(std::bad_alloc
)
294 whole_seq
= whole_sequence
;
295 is_end_iterator
= false;
303 template<typename T
> bool token_iterator
<T
>::equals_op(const token_iterator
<T
>& itr
) const throw()
305 bool is_end_a
= is_end_iterator
|| (bidx
>= str
.length());
306 bool is_end_b
= itr
.is_end_iterator
|| (itr
.bidx
>= itr
.str
.length());
316 return bidx
== itr
.bidx
;
319 template<typename T
> const std::basic_string
<T
>& token_iterator
<T
>::dereference() const throw()
324 template<typename T
> token_iterator
<T
> token_iterator
<T
>::postincrement() throw(std::bad_alloc
)
326 token_iterator
<T
> t
= *this;
331 template<typename T
> token_iterator
<T
>& token_iterator
<T
>::preincrement() throw(std::bad_alloc
)
333 bidx
= eidx
+ is_sep(eidx
);
338 template<typename T
> void token_iterator
<T
>::load_helper()
342 while(bidx
< str
.length() && (t
= is_sep(bidx
)))
345 while(eidx
< str
.length() && !is_sep(eidx
))
347 tmp
.resize(eidx
- bidx
);
348 std::copy(str
.begin() + bidx
, str
.begin() + eidx
, tmp
.begin());
351 template<typename T
> size_t token_iterator
<T
>::is_sep(size_t pos
)
353 if(pos
>= str
.length())
355 std::basic_string
<T
> h(1, str
[pos
++]);
359 auto i
= spliton
.lower_bound(h
);
360 //If string at i is end-of-set or does not start with h, there can't be a match.
361 if(i
== spliton
.end())
363 std::basic_string
<T
> i2
= *i
;
364 if(i2
.length() < h
.length() || (i2
.substr(0, h
.length()) != h
))
366 h
= h
+ std::basic_string
<T
>(1, str
[pos
++]);
370 template<typename T
> void token_iterator
<T
>::pull_fn()
372 eat_argument(&token_iterator
<T
>::ctor_itr
);
373 eat_argument(&token_iterator
<T
>::ctor_eos
);
374 eat_argument(&token_iterator
<T
>::postincrement
);
375 eat_argument(&token_iterator
<T
>::preincrement
);
376 eat_argument(&token_iterator
<T
>::dereference
);
377 eat_argument(&token_iterator
<T
>::equals_op
);
378 eat_argument(&token_iterator
<T
>::is_sep
);
379 eat_argument(&token_iterator
<T
>::load_helper
);
384 template<typename T
> void pull_token_itr()
386 token_iterator
<T
>::pull_fn();
389 void pull_token_itr2()
391 pull_token_itr
<char>();
392 pull_token_itr
<char32_t
>();
396 void _dummy_63263896236732867328673826783276283673867()