Use new shorten_stl_types in scope tracker
[libi2ncommon] / src / stringfunc.hxx
CommitLineData
0e23f538
TJ
1/*
2The software in this package is distributed under the GNU General
3Public License version 2 (with a special exception described below).
4
5A copy of GNU General Public License (GPL) is included in this distribution,
6in the file COPYING.GPL.
7
8As a special exception, if other files instantiate templates or use macros
9or inline functions from this file, or you compile this file and link it
10with other works to produce a work based on this file, this file
11does not by itself cause the resulting work to be covered
12by the GNU General Public License.
13
14However the source code for this file must still be made available
15in accordance with section (3) of the GNU General Public License.
16
17This exception does not invalidate any other reasons why a work based
18on this file might be covered by the GNU General Public License.
19*/
6a93d84a
TJ
20/** @file
21 * @brief collection of string tools (/ functions).
22 *
23 * contains a collection of miscellaneous functions for dealing with strings.
24 *
25 * some functions (like trim, lower case, upper case ...) are available in two versions:
26 * - a modifying one (suffix "Mod") which modifies the given string argument in place.
27 * - a non modifying one which take a constant string reference and returns a new string.
28 * .
29 *
30 *
31 * (c) Copyright 2007-2008 by Intra2net AG
6a93d84a 32 */
e93545dd
GE
33
34#ifndef __STRINGFUNC_HXX
35#define __STRINGFUNC_HXX
36
6a93d84a 37#include <list>
376ec4fa 38#include <vector>
e93545dd 39#include <string>
6a93d84a
TJ
40#include <sstream>
41#include <stdexcept>
b04b4f7e 42#include <sys/types.h>
6a93d84a 43
6ab3bc95
RP
44namespace I2n
45{
6a93d84a
TJ
46
47/*
48** some useful constants:
49*/
50
6ab3bc95
RP
51extern const std::string Whitespaces;
52extern const std::string LineEndings;
6a93d84a
TJ
53
54
55/*
56** predicates:
57*/
58
59
6ab3bc95 60bool has_prefix(const std::string& str, const std::string& prefix);
6a93d84a 61
6ab3bc95 62bool has_suffix(const std::string& str, const std::string& suffix);
6a93d84a
TJ
63
64
65/*
6ab3bc95 66** tool functions(modifying):
6a93d84a
TJ
67*/
68
6ab3bc95 69std::string trim_mod(std::string& str, const std::string& charlist = Whitespaces);
6a93d84a 70
6ab3bc95 71std::string chomp_mod(std::string& str, const std::string& what= LineEndings );
6a93d84a 72
6ab3bc95 73std::string to_lower_mod(std::string& str);
6a93d84a 74
6ab3bc95 75std::string to_upper_mod(std::string& str);
6a93d84a
TJ
76
77
78/*
79** tool functions (not modifying):
80*/
81
6ab3bc95 82std::string trim(const std::string& str, const std::string& charlist = Whitespaces);
6a93d84a 83
6ab3bc95 84std::string chomp(const std::string& str, const std::string& what= LineEndings );
6a93d84a 85
6ab3bc95 86std::string to_lower(const std::string& str);
6a93d84a 87
6ab3bc95 88std::string to_upper(const std::string& str);
6a93d84a
TJ
89
90
6ab3bc95 91std::string remove_suffix(const std::string& str, const std::string& suffix);
6a93d84a 92
6ab3bc95 93std::string remove_prefix(const std::string& str, const std::string& prefix);
6a93d84a
TJ
94
95
96
97/*
98** split and join:
99*/
100
101
6ab3bc95
RP
102bool pair_split(
103 const std::string& str,
104 std::string& key,
105 std::string& value,
106 char delimiter = '=');
6a93d84a
TJ
107
108
6ab3bc95
RP
109void split_string(
110 const std::string& str,
111 std::list< std::string >& result,
112 const std::string& delimiter= "\n",
113 bool omit_empty= false,
114 const std::string& trim_list= std::string()
6a93d84a
TJ
115);
116
338da253
CH
117void split_string(
118 const std::string& str,
119 std::vector< std::string >& result,
120 const std::string& delimiter= "\n",
121 bool omit_empty= false,
122 const std::string& trim_list= std::string()
123);
124
6ab3bc95
RP
125std::list< std::string > split_string(
126 const std::string& str,
127 const std::string& delimiter = "\n",
128 bool omit_empty= false,
129 const std::string& trim_list= std::string()
6a93d84a
TJ
130);
131
132
6ab3bc95
RP
133std::string join_string(
134 const std::list< std::string >& parts,
135 const std::string& delimiter = "\n"
6a93d84a
TJ
136);
137
376ec4fa
CH
138std::string join_string(
139 const std::vector< std::string >& parts,
140 const std::string& delimiter = "\n"
141);
142
6a93d84a
TJ
143
144/*
145** conversions:
146*/
147
148
6ab3bc95 149std::string convert_binary_to_hex(const std::string&str, bool upper_case_digits= false);
6a93d84a 150
6ab3bc95 151std::string convert_hex_to_binary(const std::string& str) throw(std::runtime_error);
6a93d84a
TJ
152
153
6a93d84a
TJ
154/*
155** "type conversions":
156*/
157
158
159/**
160 * convert a datatype @a T to a string via string stream.
161 *
1fe2e899
CH
162 * This will not report trouble in conversion; for example:
163 * string_to<int>("christian")
164 * will return 0 and not throw an error.
165 * Use boost::lexical_cast<T>(string) to get error-checked results.
166 *
6a93d84a
TJ
167 * @param s the string which should be converted to @a T.
168 * @return the value of type T.
169 */
170template<
6ab3bc95 171class T
6a93d84a 172>
6ab3bc95 173T string_to(const std::string& s)
6a93d84a 174{
6ab3bc95
RP
175 std::istringstream istr(s);
176 T result;
177 istr >> result;
178 return result;
179} // eo string_to(const std::string&)
6a93d84a
TJ
180
181
182/**
183 * convert a datatype @a T to a string via string stream.
184 *
185 * @param s the string which should be converted to @a T.
186 * @param result the resulting value of type @a T.
187 * @return @a true iff the internal string stream was EOF after the conversion.
08f2d184
GE
188 *
189 * @attention: does not return if the conversion was successful. So check for empty strings before.
6a93d84a
TJ
190 */
191template<
6ab3bc95 192class T
6a93d84a 193>
6ab3bc95 194bool string_to(const std::string& s, T& result)
6a93d84a 195{
6ab3bc95
RP
196 std::istringstream istr(s);
197 istr >> result;
198 return istr.eof();
199} // eo string_to(const std::string&)
6a93d84a
TJ
200
201
202/**
3bcc713f
GE
203 * convert string in hexadecimal notation to a datatype @a T
204 * supports strings with and without "0x" notation, e.g. 0xff and FF are both valid
205 *
206 * @param s the hex string which should be converted to @a T.
207 * @return the value of type T.
208 */
209template<
210class T
211>
212T hex_string_to(const std::string& s)
213{
214 std::istringstream istr(s);
215 T result;
216 istr >> std::hex >> result;
217 return result;
218} // eo string_to(const std::string&)
219
220
221/**
222 * convert string in hexadecimal notation to a datatype @a T
223 * supports strings with and without "0x" notation, e.g. 0xff and FF are both valid
224 *
225 * @param s the hex string which should be converted to @a T.
226 * @param result the resulting value of type @a T.
227 * @return @a true iff the internal string stream was EOF after the conversion.
228 *
229 * @attention: does not return if the conversion was successful. So check for empty strings before.
230 */
231template<
232class T
233>
234bool hex_string_to(const std::string& s, T& result)
235{
236 std::istringstream istr(s);
237 istr >> std::hex >> result;
238 return istr.eof();
239} // eo string_to(const std::string&)
240
241
242/**
6a93d84a
TJ
243 * convert a string to another datatype @a T via string stream.
244 *
245 * @param v the value (of type @a T) which should be converted to a string.
246 * @return the resulting string.
247 */
248template<
6ab3bc95 249class T
6a93d84a 250>
6ab3bc95 251std::string to_string(const T& v)
6a93d84a 252{
6ab3bc95
RP
253 std::ostringstream ostr;
254 ostr << v;
255 return ostr.str();
256} // eo to_string(const T&)
257
258
1a0267e5
CH
259/**
260 * Create a string with types shortened in texts describing C++ types
261 *
262 * for example: std::list<some_long_type, std::allocator<some_long_type> >
263 * --> std::list<some_long_type, _alloc_>
264 *
265 * and std::basic_string<char, std::char_traits<char>, std::allocator<char> >
266 * --> std::string
267 */
268std::string shorten_stl_types(const std::string &input);
269
270
6ab3bc95
RP
271} // eo namespace I2n
272
6a93d84a 273
e5b21dbb 274#if 0
6ab3bc95
RP
275std::string to_lower(const std::string &src);
276std::string to_upper(const std::string &src);
e5b21dbb
RP
277#else
278// compatibility: import lower/upper funcs from I2n:
279using I2n::to_lower;
280using I2n::to_upper;
281#endif
e93545dd 282
81267544 283
8f296924
GMF
284enum UnitBase {
285 UnitBase1000, // SI decimal, composed by multiples of 1000 (KB, MB, etc.)
286 UnitBase1024 // IEC binary, composed by multiples of 1024 (KiB, MiB, etc. )
81267544
GMF
287};
288
8f296924
GMF
289enum UnitFormat {
290 ShortUnitFormat, // B, KB, MB, ...
291 LongUnitFormat // Byte, KByte, MByte, ...
d1ea9075
GMF
292};
293
81267544
GMF
294std::string nice_unit_format(
295 const int64_t input,
ee037ee3
GMF
296 const UnitFormat format = ShortUnitFormat,
297 const UnitBase base = UnitBase1024
81267544 298);
e93545dd 299
5cd64148
CH
300std::string nice_unit_format(
301 const double input,
302 const UnitFormat format = ShortUnitFormat,
303 const UnitBase base = UnitBase1024
304);
305
e93545dd
GE
306bool replace_all(std::string &base, const std::string *ist, const std::string *soll);
307bool replace_all(std::string &base, const char *ist, const char *soll);
308bool replace_all(std::string &base, const char *ist, const std::string *soll);
309bool replace_all(std::string &base, const std::string &ist, const char *soll);
310bool replace_all(std::string &base, const std::string &ist, const std::string &soll);
311
312std::string iso_to_utf8(const std::string& isostring);
313std::string utf8_to_iso(const std::string& utf8string);
13cc4db1 314std::string utf7imap_to_utf8(const std::string &utf7imapstring);
6a2b6dd1 315std::string utf8_to_utf7imap(const std::string &utf8string);
118e216e
TJ
316
317std::string strip_html_tags(const std::string &input);
318std::string smart_html_entities(const std::string &input);
319std::string html_entities(std::string str);
554f813d 320std::string html_entities_to_console(std::string str);
118e216e 321
3f5c5ccd 322typedef std::pair<std::string::size_type, std::string::size_type> CommentZone;
46dd1321 323std::vector<CommentZone> find_html_comments(const std::string &str);
3f5c5ccd
CH
324void remove_html_comments(std::string &str);
325void remove_html_comments(std::string &str, const std::vector<CommentZone> &comments);
326
b953bf36
GE
327std::string sanitize_for_logging(const std::string &str, const char replace_with='?');
328
47c07fba
GE
329std::string escape(const std::string &s);
330
331std::string descape(const std::string &s, int startpos, int &endpos);
e6da286a 332inline std::string descape(const std::string &s)
47c07fba 333{
6ab3bc95
RP
334 int endpos;
335 return descape(s,0,endpos);
47c07fba
GE
336}
337
338std::string escape_shellarg(const std::string &input);
339
e93545dd 340#endif