2 // This file is part of the aMule Project.
4 // Copyright (c) 2004-2008 Angel Vidal ( kry@amule.org )
5 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #ifndef STRING_FUNCTIONS_H
28 #define STRING_FUNCTIONS_H
30 #include "../../Types.h" // Needed for uint16 and uint32
33 // UTF8 types: No UTF8, BOM prefix, or Raw UTF8
41 /****************************************************/
42 /******************* Inlines ************************/
43 /****************************************************/
46 * Functions to perform Unicode <-> (char *) and UTF-8 conversion
48 * Please, DO NOT store pointers returned by unicode2char(), because they
49 * get free'ed as soon as the return value of cWX2MB gets out of scope.
50 * If you need to store a pointer, use a buffer of type wxWX2MBbuf:
51 * and then cast it to a char pointer, e.g.:
53 * const wxWX2MBbuf buf(unicode2char(aWxString));
55 * --- Now you can freely use buf as if it were a (const char *) ---
58 * printf("%s", (const char *)buf);
60 * The cast in printf is necessary because variable number of parameter
61 * functions have no type for these parameters, so the automatic casting
62 * of wxWX2MBbuf to (const char *) is not performed.
64 * --- don't worry about memory allocation, memory will be ---
65 * --- free'ed when buf gets out of scope, i.e., upon return ---
67 * wxMB2WXbuf, wxWX2MBbuf are always the appropriate return type,
68 * either (wxChar *) or (wxWCharBuffer)
70 * Use the simplified names Unicode2CharBuf and Char2UnicodeBuf, and
71 * do not declare these names const or the compiler will complain about
74 typedef const wxWX2MBbuf Unicode2CharBuf
;
75 typedef const wxMB2WXbuf Char2UnicodeBuf
;
77 Unicode2CharBuf
unicode2char(const wxChar
* x
);
78 inline Char2UnicodeBuf
char2unicode(const char* x
) { return wxConvLocal
.cMB2WX(x
); }
80 inline Unicode2CharBuf
unicode2UTF8(const wxChar
* x
) { return wxConvUTF8
.cWX2MB(x
); }
81 inline Char2UnicodeBuf
UTF82unicode(const char* x
) { return wxConvUTF8
.cMB2WX(x
); }
83 inline const wxCharBuffer
char2UTF8(const char *x
) { return unicode2UTF8(char2unicode(x
)); }
84 inline const wxCharBuffer
UTF82char(const char *x
) { return unicode2char(UTF82unicode(x
)); }
86 inline Unicode2CharBuf
filename2char(const wxChar
* x
) { return wxConvFile
.cWC2MB(x
); }
87 inline Char2UnicodeBuf
char2filename(const char* x
) { return wxConvFile
.cMB2WC(x
); }
91 // Replaces "&" with "&&" in 'in' for use with text-labels
93 inline wxString
MakeStringEscaped(wxString in
) {
94 in
.Replace(wxT("&"),wxT("&&"));
98 // Make a string be a folder
99 inline wxString
MakeFoldername(wxString path
) {
101 if ( !path
.IsEmpty() && ( path
.Right(1) == wxT('/' )) ) {
108 // Duplicates a string
109 inline char* nstrdup(const char* src
)
111 size_t len
= (src
? strlen(src
) : 0) + 1;
112 char *res
= new char[len
];
113 if ( src
) strcpy(res
, src
);
119 // Replacements for atoi and atol that removes the need for converting
120 // a string to normal chars with unicode2char. The value returned is the
121 // value represented in the string or 0 if the conversion failed.
122 inline long StrToLong(const wxString
& str
)
125 if (!str
.ToLong(&value
)) { // value may be changed even if it failes according to wx docu
131 inline unsigned long StrToULong(const wxString
& str
)
133 unsigned long value
= 0;
134 if (!str
.ToULong(&value
)) {
140 inline unsigned long long StrToULongLong(const wxString
& str
)
142 #if wxCHECK_VERSION(2, 9, 0)
143 unsigned long long value
= 0;
144 if (!str
.ToULongLong(&value
)) {
151 Unicode2CharBuf buf
= unicode2char(str
);
152 if (!buf
) { // something went wrong
163 inline size_t GetRawSize(const wxString
& rstr
, EUtf8Str eEncode
)
170 Unicode2CharBuf
s(unicode2UTF8(rstr
));
172 RealLen
+= strlen(s
);
179 Unicode2CharBuf
s(unicode2char(rstr
));
190 /****************************************************/
191 /***************** Non-inlines **********************/
192 /****************************************************/
195 // Makes sIn suitable for inclusion in an URL, by escaping all chars that could cause trouble.
196 wxString
URLEncode(const wxString
& sIn
);
200 * Converts a hexadecimal number to a char.
202 * @param hex The hex-number, must be at most 2 digits long.
203 * @return The resulting char or \0 if conversion failed.
205 wxChar
HexToDec( const wxString
& hex
);
209 * This function converts all valid HTML escape-codes to their corresponding chars.
211 * @param str The string to unescape.
212 * @return The unescaped version of the input string.
214 wxString
UnescapeHTML( const wxString
& str
);
218 * Ensures that the url pass is valid by escaping various chars.
220 wxString
validateURI(const wxString
& url
);
224 * Compares two strings, while taking numerals into consideration.
226 * @return Returns -1 if a < b, 1 if a > b and 0 if a = b
228 * This function basically splits the two strings into a number of
229 * fields, deliniated by whitespace, non-alphanumerical chars. The
230 * numerals are then converted to integers, and the fields are
231 * compared. This allows strings such as "a (2)" and "a (10)" to
232 * be properly sorted for displaying.
234 * Currently does not handle floats (they are treated as to seperate
235 * fields, nor negative numbers.
237 int FuzzyStrCmp(const wxString
& a
, const wxString
& b
);
240 * As with FuzzyStrCmp, but case insensitive.
242 int FuzzyStrCaseCmp(const wxString
& a
, const wxString
& b
);
246 * This class provides a simple and fast tokenizer.
248 class CSimpleTokenizer
252 * @param str The string to tokenize.
253 * @param delim The delimiter used to split the string.
255 CSimpleTokenizer(const wxString
& str
, wxChar delim
);
258 * Returns the next part of the string separated by the
259 * given delimiter. When the entire string has been
260 * tokenized, an empty string is returned. Note that
261 * empty tokens are also returned.
266 * Returns the remaining part of the string.
268 * The remaining part is defined as being the part after
269 * the last encountered token, or an empty string if the
270 * entire string has been tokenized.
272 * If next() has yet to be called, the entire string will
275 wxString
remaining() const;
278 * Returns the number of tokens encountered so far.
280 size_t tokenCount() const;
283 //! The string being tokenized.
286 //! The delimiter used to split the string.
289 //! A pointer to the current position in the string.
292 //! The number of tokens encountered.
297 #endif // STRING_FUNCTIONS_H
298 // File_checked_for_headers