OSDN Git Service

post WM_NULL to attached threads on yamy exit to unmap mayu{32,64}.dll
[yamy/yamy.git] / stringtool.h
1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
2 // stringtool.h\r
3 \r
4 \r
5 #ifndef _STRINGTOOL_H\r
6 #  define _STRINGTOOL_H\r
7 \r
8 #  include "misc.h"\r
9 #  include <tchar.h>\r
10 #  include <cctype>\r
11 #  include <string>\r
12 #  include <iosfwd>\r
13 #  include <fstream>\r
14 #  include <locale>\r
15 #  include <boost/regex.hpp>\r
16 #  include <stdio.h>                            // for snprintf\r
17 \r
18 \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
37 \r
38 \r
39 /// string with custom stream output\r
40 class tstringq : public tstring\r
41 {\r
42 public:\r
43         ///\r
44         tstringq() { }\r
45         ///\r
46         tstringq(const tstringq &i_str) : tstring(i_str) { }\r
47         ///\r
48         tstringq(const tstring &i_str) : tstring(i_str) { }\r
49         ///\r
50         tstringq(const _TCHAR *i_str) : tstring(i_str) { }\r
51         ///\r
52         tstringq(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }\r
53         ///\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
56         ///\r
57         tstringq(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }\r
58 };\r
59 \r
60 \r
61 /// stream output\r
62 extern tostream &operator<<(tostream &i_ost, const tstringq &i_data);\r
63 \r
64 \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
69 \r
70 /// add session id to i_str\r
71 tstring addSessionId(const _TCHAR *i_str);\r
72 \r
73 /// copy\r
74 size_t strlcpy(char *o_dest, const char *i_src, size_t i_destSize);\r
75 /// copy\r
76 size_t mbslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
77                            size_t i_destSize);\r
78 /// copy\r
79 size_t wcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize);\r
80 /// copy\r
81 inline size_t tcslcpy(char *o_dest, const char *i_src, size_t i_destSize)\r
82 {\r
83         return strlcpy(o_dest, i_src, i_destSize);\r
84 }\r
85 /// copy\r
86 inline size_t tcslcpy(unsigned char *o_dest, const unsigned char *i_src,\r
87                                           size_t i_destSize)\r
88 {\r
89         return mbslcpy(o_dest, i_src, i_destSize);\r
90 }\r
91 /// copy\r
92 inline size_t tcslcpy(wchar_t *o_dest, const wchar_t *i_src, size_t i_destSize)\r
93 {\r
94         return wcslcpy(o_dest, i_src, i_destSize);\r
95 }\r
96 \r
97 // escape regexp special characters in MBCS trail bytes\r
98 std::string guardRegexpFromMbcs(const char *i_str);\r
99 /// converter\r
100 std::wstring to_wstring(const std::string &i_str);\r
101 /// converter\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
105 \r
106 \r
107 /// case insensitive string\r
108 class tstringi : public tstring\r
109 {\r
110 public:\r
111         ///\r
112         tstringi() { }\r
113         ///\r
114         tstringi(const tstringi &i_str) : tstring(i_str) { }\r
115         ///\r
116         tstringi(const tstring &i_str) : tstring(i_str) { }\r
117         ///\r
118         tstringi(const _TCHAR *i_str) : tstring(i_str) { }\r
119         ///\r
120         tstringi(const _TCHAR *i_str, size_t i_n) : tstring(i_str, i_n) { }\r
121         ///\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
124         ///\r
125         tstringi(size_t i_n, _TCHAR i_c) : tstring(i_n, i_c) { }\r
126         ///\r
127         int compare(const tstringi &i_str) const {\r
128                 return compare(i_str.c_str());\r
129         }\r
130         ///\r
131         int compare(const tstring &i_str) const {\r
132                 return compare(i_str.c_str());\r
133         }\r
134         ///\r
135         int compare(const _TCHAR *i_str) const {\r
136                 return _tcsicmp(c_str(), i_str);\r
137         }\r
138         ///\r
139         tstring &getString() {\r
140                 return *this;\r
141         }\r
142         ///\r
143         const tstring &getString() const {\r
144                 return *this;\r
145         }\r
146 };\r
147 \r
148 /// case insensitive string comparison\r
149 inline bool operator<(const tstringi &i_str1, const _TCHAR *i_str2)\r
150 {\r
151         return i_str1.compare(i_str2) < 0;\r
152 }\r
153 /// case insensitive string comparison\r
154 inline bool operator<(const _TCHAR *i_str1, const tstringi &i_str2)\r
155 {\r
156         return 0 < i_str2.compare(i_str1);\r
157 }\r
158 /// case insensitive string comparison\r
159 inline bool operator<(const tstringi &i_str1, const tstring &i_str2)\r
160 {\r
161         return i_str1.compare(i_str2) < 0;\r
162 }\r
163 /// case insensitive string comparison\r
164 inline bool operator<(const tstring &i_str1, const tstringi &i_str2)\r
165 {\r
166         return 0 < i_str2.compare(i_str1);\r
167 }\r
168 /// case insensitive string comparison\r
169 inline bool operator<(const tstringi &i_str1, const tstringi &i_str2)\r
170 {\r
171         return i_str1.compare(i_str2) < 0;\r
172 }\r
173 \r
174 /// case insensitive string comparison\r
175 inline bool operator==(const _TCHAR *i_str1, const tstringi &i_str2)\r
176 {\r
177         return i_str2.compare(i_str1) == 0;\r
178 }\r
179 /// case insensitive string comparison\r
180 inline bool operator==(const tstringi &i_str1, const _TCHAR *i_str2)\r
181 {\r
182         return i_str1.compare(i_str2) == 0;\r
183 }\r
184 /// case insensitive string comparison\r
185 inline bool operator==(const tstring &i_str1, const tstringi &i_str2)\r
186 {\r
187         return i_str2.compare(i_str1) == 0;\r
188 }\r
189 /// case insensitive string comparison\r
190 inline bool operator==(const tstringi &i_str1, const tstring &i_str2)\r
191 {\r
192         return i_str1.compare(i_str2) == 0;\r
193 }\r
194 /// case insensitive string comparison\r
195 inline bool operator==(const tstringi &i_str1, const tstringi &i_str2)\r
196 {\r
197         return i_str1.compare(i_str2) == 0;\r
198 }\r
199 \r
200 \r
201 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r
202 // workarounds for Borland C++\r
203 \r
204 \r
205 /// case insensitive string comparison\r
206 inline bool operator!=(const _TCHAR *i_str1, const tstringi &i_str2)\r
207 {\r
208         return i_str2.compare(i_str1) != 0;\r
209 }\r
210 /// case insensitive string comparison\r
211 inline bool operator!=(const tstringi &i_str1, const _TCHAR *i_str2)\r
212 {\r
213         return i_str1.compare(i_str2) != 0;\r
214 }\r
215 /// case insensitive string comparison\r
216 inline bool operator!=(const tstring &i_str1, const tstringi &i_str2)\r
217 {\r
218         return i_str2.compare(i_str1) != 0;\r
219 }\r
220 /// case insensitive string comparison\r
221 inline bool operator!=(const tstringi &i_str1, const tstring &i_str2)\r
222 {\r
223         return i_str1.compare(i_str2) != 0;\r
224 }\r
225 /// case insensitive string comparison\r
226 inline bool operator!=(const tstringi &i_str1, const tstringi &i_str2)\r
227 {\r
228         return i_str1.compare(i_str2) != 0;\r
229 }\r
230 \r
231 \r
232 /// stream output\r
233 extern tostream &operator<<(tostream &i_ost, const tregex &i_data);\r
234 \r
235 /// get lower string\r
236 extern tstring toLower(const tstring &i_str);\r
237 \r
238 \r
239 #endif // !_STRINGTOOL_H\r