FreeRDP
Loading...
Searching...
No Matches
winpr/include/winpr/string.h
1
21#ifndef WINPR_CRT_STRING_H
22#define WINPR_CRT_STRING_H
23
24#include <stdarg.h>
25#include <wchar.h>
26#include <stdio.h>
27#include <string.h>
28#include <winpr/config.h>
29#include <winpr/winpr.h>
30#include <winpr/wtypes.h>
31
32WINPR_PRAGMA_DIAG_PUSH
33WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
34// NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
35
36#ifdef __cplusplus
37extern "C"
38{
39#endif
40
51 WINPR_ATTR_NODISCARD
52 WINPR_API char* winpr_strnstr(const char* haystack, const char* needle, size_t hlen);
53
54 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_encode(const char* str, size_t len);
55 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_decode(const char* str, size_t len);
56
63 WINPR_ATTR_NODISCARD
64 WINPR_API BOOL winpr_str_is_valid_url(const char* str);
65
73 WINPR_ATTR_NODISCARD
74 WINPR_API BOOL winpr_str_is_valid_urlN(const char* str, size_t len);
75
82 WINPR_ATTR_NODISCARD
83 WINPR_API BOOL winpr_str_is_valid_hostname(const char* str);
84
92 WINPR_ATTR_NODISCARD
93 WINPR_API BOOL winpr_str_is_valid_hostnameN(const char* str, size_t len);
94
101 WINPR_ATTR_NODISCARD
102 WINPR_API BOOL winpr_str_has_newlines(const char* str);
103
104 WINPR_API BOOL winpr_str_append(const char* what, char* buffer, size_t size,
105 const char* separator);
106
107 WINPR_API int winpr_asprintf(char** s, size_t* slen, const char* templ, ...);
108
109 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
110
111#ifndef _WIN32
112
113#define CSTR_LESS_THAN 1
114#define CSTR_EQUAL 2
115#define CSTR_GREATER_THAN 3
116
117#define CP_ACP 0
118#define CP_OEMCP 1
119#define CP_MACCP 2
120#define CP_THREAD_ACP 3
121#define CP_SYMBOL 42
122#define CP_UTF7 65000
123#define CP_UTF8 65001
124
125#define MB_PRECOMPOSED 0x00000001
126#define MB_COMPOSITE 0x00000002
127#define MB_USEGLYPHCHARS 0x00000004
128#define MB_ERR_INVALID_CHARS 0x00000008
129
130 WINPR_ATTR_MALLOC(free, 1)
131 WINPR_API char* _strdup(const char* strSource);
132
133 WINPR_ATTR_MALLOC(free, 1)
134 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
135
136 WINPR_ATTR_NODISCARD
137 WINPR_API int _stricmp(const char* string1, const char* string2);
138
139 WINPR_ATTR_NODISCARD
140 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
141
142 WINPR_ATTR_NODISCARD
143 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
144
145 WINPR_ATTR_NODISCARD
146 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
147
148 WINPR_ATTR_NODISCARD
149 WINPR_API size_t _wcslen(const WCHAR* str);
150
151 WINPR_ATTR_NODISCARD
152 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
153
154 WINPR_ATTR_NODISCARD
155 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
156
157#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
158 WINPR_DEPRECATED_VAR("[since 3.32.0] use winpr_wcsnchr instead",
159 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c));
160
161 WINPR_DEPRECATED_VAR("[since 3.32.0] use winpr_wcsnrchr instead",
162 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c));
163#endif
164
165 WINPR_ATTR_NODISCARD
166 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
167
168 WINPR_ATTR_NODISCARD
169 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
170
171 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
172
173#else
174
175#define _wcscmp wcscmp
176#define _wcsncmp wcsncmp
177#define _wcslen wcslen
178#define _wcsnlen wcsnlen
179#define _wcsstr wcsstr
180#define _wcschr wcschr
181#define _wcsrchr wcsrchr
182#define _wcsncat wcsncat
183
184#endif /* _WIN32 */
185
194 WINPR_ATTR_NODISCARD
195 WINPR_API WCHAR* winpr_wcsnchr(const WCHAR* str, size_t charLen, WCHAR c);
196
205 WINPR_ATTR_NODISCARD
206 WINPR_API WCHAR* winpr_wcsnrchr(const WCHAR* str, size_t charLen, WCHAR c);
207
208#if !defined(_WIN32) || defined(_UWP)
209
210 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
211 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
212
213#ifdef UNICODE
214#define CharUpper CharUpperW
215#else
216#define CharUpper CharUpperA
217#endif
218
219 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
220 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
221
222#ifdef UNICODE
223#define CharUpperBuff CharUpperBuffW
224#else
225#define CharUpperBuff CharUpperBuffA
226#endif
227
228 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
229 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
230
231#ifdef UNICODE
232#define CharLower CharLowerW
233#else
234#define CharLower CharLowerA
235#endif
236
237 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
238 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
239
240#ifdef UNICODE
241#define CharLowerBuff CharLowerBuffW
242#else
243#define CharLowerBuff CharLowerBuffA
244#endif
245
246 WINPR_ATTR_NODISCARD
247 WINPR_API BOOL IsCharAlphaA(CHAR ch);
248 WINPR_ATTR_NODISCARD
249 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
250
251#ifdef UNICODE
252#define IsCharAlpha IsCharAlphaW
253#else
254#define IsCharAlpha IsCharAlphaA
255#endif
256
257 WINPR_ATTR_NODISCARD
258 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
259 WINPR_ATTR_NODISCARD
260 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
261
262#ifdef UNICODE
263#define IsCharAlphaNumeric IsCharAlphaNumericW
264#else
265#define IsCharAlphaNumeric IsCharAlphaNumericA
266#endif
267
268 WINPR_ATTR_NODISCARD
269 WINPR_API BOOL IsCharUpperA(CHAR ch);
270 WINPR_ATTR_NODISCARD
271 WINPR_API BOOL IsCharUpperW(WCHAR ch);
272
273#ifdef UNICODE
274#define IsCharUpper IsCharUpperW
275#else
276#define IsCharUpper IsCharUpperA
277#endif
278
279 WINPR_ATTR_NODISCARD
280 WINPR_API BOOL IsCharLowerA(CHAR ch);
281 WINPR_ATTR_NODISCARD
282 WINPR_API BOOL IsCharLowerW(WCHAR ch);
283
284#ifdef UNICODE
285#define IsCharLower IsCharLowerW
286#else
287#define IsCharLower IsCharLowerA
288#endif
289
290#endif
291
292#ifndef _WIN32
293
294#define sprintf_s snprintf
295#define _snprintf snprintf
296#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
297
298#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
299
300 /* Unicode Conversion */
301
302#if defined(WITH_WINPR_DEPRECATED)
303 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
304 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
305 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
306 LPWSTR lpWideCharStr, int cchWideChar));
307
308 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
309 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
310 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
311 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
312 LPBOOL lpUsedDefaultChar));
313#endif
314
315#endif
316
317 /* Extended API */
334 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
335
354 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
355
375 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
376
393 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
394
413 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
414
434 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
435
446 WINPR_ATTR_MALLOC(free, 1)
447 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
448
461 WINPR_ATTR_MALLOC(free, 1)
462 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
463 size_t* pUtfCharLength);
464
477 WINPR_ATTR_MALLOC(free, 1)
478 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
479 size_t* pUtfCharLength);
480
491 WINPR_ATTR_MALLOC(free, 1)
492 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
493
506 WINPR_ATTR_MALLOC(free, 1)
507 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
508
521 WINPR_ATTR_MALLOC(free, 1)
522 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
523
532 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
533
534#if defined(WITH_WINPR_DEPRECATED)
535 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
536 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
537 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
538 LPWSTR* lpWideCharStr, int cchWideChar));
539
540 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
541 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
542 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
543 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
544 LPBOOL lpUsedDefaultChar));
545#endif
546
547 WINPR_ATTR_NODISCARD
548 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
549
550 WINPR_ATTR_NODISCARD
551 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
552
553 WINPR_ATTR_NODISCARD
554 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
555
556 WINPR_ATTR_NODISCARD
557 WINPR_API char* StrSep(char** stringp, const char* delim);
558
559 WINPR_ATTR_NODISCARD
560 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
561
562#if !defined(WINPR_HAVE_STRNDUP)
563 WINPR_ATTR_MALLOC(free, 1)
564 WINPR_API char* strndup(const char* s, size_t n);
565#endif
566
577 WINPR_ATTR_MALLOC(free, 1)
578 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
579
580#ifdef __cplusplus
581}
582#endif
583
584// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
585WINPR_PRAGMA_DIAG_POP
586
587#endif /* WINPR_CRT_STRING_H */