1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
5 #ifndef _STRINGTOOL_H
\r
6 # define _STRINGTOOL_H
\r
15 # include <boost/regex.hpp>
\r
16 # include <stdio.h> // for snprintf
\r
19 /// string for generic international text
\r
20 typedef std::basic_string<_TCHAR> tstring;
\r
21 /// istream for generic international text
\r
22 typedef std::basic_istream<_TCHAR> tistream;
\r
23 /// ostream for generic international text
\r
24 typedef std::basic_ostream<_TCHAR> tostream;
\r
25 /// streambuf for for generic international text
\r
26 typedef std::basic_streambuf<_TCHAR> tstreambuf;
\r
27 /// stringstream for generic international text
\r
28 typedef std::basic_stringstream<_TCHAR> tstringstream;
\r
29 /// ifstream for generic international text
\r
30 typedef std::basic_ifstream<_TCHAR> tifstream;
\r
31 /// ofstream for generic international text
\r
32 typedef std::basic_ofstream<_TCHAR> tofstream;
\r
33 /// basic_regex for generic international text
\r
34 typedef boost::basic_regex<_TCHAR> tregex;
\r
35 /// match_results for generic international text
\r
36 typedef boost::match_results<tstring::const_iterator> tsmatch;
\r
39 /// string with custom stream output
\r
40 class tstringq : public tstring
\r
46 tstringq(const tstringq &i_str) : tstring(i_str) { }
\r
48 tstringq(const tstring &i_str) : tstring(i_str) { }
\r
50 tstringq(const _TCHAR *i_str) : tstring(i_str) { }
\r
52 tstringq(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }
\r
54 tstringq(const _TCHAR *i_str, size_t i_pos, size_t i_n)
\r
55 : tstring(i_str, i_pos, i_n) { }
\r
57 tstringq(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }
\r
62 extern tostream &operator<<(tostream &i_ost, const tstringq &i_data);
\r
65 /// interpret meta characters such as \n
\r
66 tstring interpretMetaCharacters(const _TCHAR *i_str, size_t i_len,
\r
67 const _TCHAR *i_quote = NULL,
\r
68 bool i_doesUseRegexpBackReference = false);
\r
70 /// add session id to i_str
\r
71 tstring addSessionId(const _TCHAR *i_str);
\r
74 size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize);
\r
76 size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,
\r
79 size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize);
\r
81 inline size_t tcslcpy(char *o_dest, const char *i_src, size_t i_destSize)
\r
83 return strlcpy(o_dest, i_src, i_destSize);
\r
86 inline size_t tcslcpy(unsigned char *o_dest, const unsigned char *i_src,
\r
89 return mbslcpy(o_dest, i_src, i_destSize);
\r
92 inline size_t tcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)
\r
94 return wcslcpy(o_dest, i_src, i_destSize);
\r
97 // escape regexp special characters in MBCS trail bytes
\r
98 std::string guardRegexpFromMbcs(const char *i_str);
\r
100 std::wstring to_wstring(const std::string &i_str);
\r
102 std::string to_string(const std::wstring &i_str);
\r
103 // convert wstring to UTF-8
\r
104 std::string to_UTF_8(const std::wstring &i_str);
\r
107 /// case insensitive string
\r
108 class tstringi : public tstring
\r
114 tstringi(const tstringi &i_str) : tstring(i_str) { }
\r
116 tstringi(const tstring &i_str) : tstring(i_str) { }
\r
118 tstringi(const _TCHAR *i_str) : tstring(i_str) { }
\r
120 tstringi(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }
\r
122 tstringi(const _TCHAR *i_str, size_t i_pos, size_t i_n)
\r
123 : tstring(i_str, i_pos, i_n) { }
\r
125 tstringi(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }
\r
127 int compare(const tstringi &i_str) const {
\r
128 return compare(i_str.c_str());
\r
131 int compare(const tstring &i_str) const {
\r
132 return compare(i_str.c_str());
\r
135 int compare(const _TCHAR *i_str) const {
\r
136 return _tcsicmp(c_str(), i_str);
\r
139 tstring &getString() {
\r
143 const tstring &getString() const {
\r
148 /// case insensitive string comparison
\r
149 inline bool operator<(const tstringi &i_str1, const _TCHAR *i_str2)
\r
151 return i_str1.compare(i_str2) < 0;
\r
153 /// case insensitive string comparison
\r
154 inline bool operator<(const _TCHAR *i_str1, const tstringi &i_str2)
\r
156 return 0 < i_str2.compare(i_str1);
\r
158 /// case insensitive string comparison
\r
159 inline bool operator<(const tstringi &i_str1, const tstring &i_str2)
\r
161 return i_str1.compare(i_str2) < 0;
\r
163 /// case insensitive string comparison
\r
164 inline bool operator<(const tstring &i_str1, const tstringi &i_str2)
\r
166 return 0 < i_str2.compare(i_str1);
\r
168 /// case insensitive string comparison
\r
169 inline bool operator<(const tstringi &i_str1, const tstringi &i_str2)
\r
171 return i_str1.compare(i_str2) < 0;
\r
174 /// case insensitive string comparison
\r
175 inline bool operator==(const _TCHAR *i_str1, const tstringi &i_str2)
\r
177 return i_str2.compare(i_str1) == 0;
\r
179 /// case insensitive string comparison
\r
180 inline bool operator==(const tstringi &i_str1, const _TCHAR *i_str2)
\r
182 return i_str1.compare(i_str2) == 0;
\r
184 /// case insensitive string comparison
\r
185 inline bool operator==(const tstring &i_str1, const tstringi &i_str2)
\r
187 return i_str2.compare(i_str1) == 0;
\r
189 /// case insensitive string comparison
\r
190 inline bool operator==(const tstringi &i_str1, const tstring &i_str2)
\r
192 return i_str1.compare(i_str2) == 0;
\r
194 /// case insensitive string comparison
\r
195 inline bool operator==(const tstringi &i_str1, const tstringi &i_str2)
\r
197 return i_str1.compare(i_str2) == 0;
\r
201 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
202 // workarounds for Borland C++
\r
205 /// case insensitive string comparison
\r
206 inline bool operator!=(const _TCHAR *i_str1, const tstringi &i_str2)
\r
208 return i_str2.compare(i_str1) != 0;
\r
210 /// case insensitive string comparison
\r
211 inline bool operator!=(const tstringi &i_str1, const _TCHAR *i_str2)
\r
213 return i_str1.compare(i_str2) != 0;
\r
215 /// case insensitive string comparison
\r
216 inline bool operator!=(const tstring &i_str1, const tstringi &i_str2)
\r
218 return i_str2.compare(i_str1) != 0;
\r
220 /// case insensitive string comparison
\r
221 inline bool operator!=(const tstringi &i_str1, const tstring &i_str2)
\r
223 return i_str1.compare(i_str2) != 0;
\r
225 /// case insensitive string comparison
\r
226 inline bool operator!=(const tstringi &i_str1, const tstringi &i_str2)
\r
228 return i_str1.compare(i_str2) != 0;
\r
233 extern tostream &operator<<(tostream &i_ost, const tregex &i_data);
\r
235 /// get lower string
\r
236 extern tstring toLower(const tstring &i_str);
\r
239 #endif // !_STRINGTOOL_H
\r