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_has_newlines(const char* str);
84
85 WINPR_API BOOL winpr_str_append(const char* what, char* buffer, size_t size,
86 const char* separator);
87
88 WINPR_API int winpr_asprintf(char** s, size_t* slen, const char* templ, ...);
89
90 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
91
92#ifndef _WIN32
93
94#define CSTR_LESS_THAN 1
95#define CSTR_EQUAL 2
96#define CSTR_GREATER_THAN 3
97
98#define CP_ACP 0
99#define CP_OEMCP 1
100#define CP_MACCP 2
101#define CP_THREAD_ACP 3
102#define CP_SYMBOL 42
103#define CP_UTF7 65000
104#define CP_UTF8 65001
105
106#define MB_PRECOMPOSED 0x00000001
107#define MB_COMPOSITE 0x00000002
108#define MB_USEGLYPHCHARS 0x00000004
109#define MB_ERR_INVALID_CHARS 0x00000008
110
111 WINPR_ATTR_MALLOC(free, 1)
112 WINPR_API char* _strdup(const char* strSource);
113
114 WINPR_ATTR_MALLOC(free, 1)
115 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
116
117 WINPR_ATTR_NODISCARD
118 WINPR_API int _stricmp(const char* string1, const char* string2);
119
120 WINPR_ATTR_NODISCARD
121 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
122
123 WINPR_ATTR_NODISCARD
124 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
125
126 WINPR_ATTR_NODISCARD
127 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
128
129 WINPR_ATTR_NODISCARD
130 WINPR_API size_t _wcslen(const WCHAR* str);
131
132 WINPR_ATTR_NODISCARD
133 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
134
135 WINPR_ATTR_NODISCARD
136 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
137
138#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
139 WINPR_DEPRECATED_VAR("[since 3.32.0] use winpr_wcsnchr instead",
140 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c));
141
142 WINPR_DEPRECATED_VAR("[since 3.32.0] use winpr_wcsnrchr instead",
143 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c));
144#endif
145
146 WINPR_ATTR_NODISCARD
147 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
148
149 WINPR_ATTR_NODISCARD
150 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
151
152 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
153
154#else
155
156#define _wcscmp wcscmp
157#define _wcsncmp wcsncmp
158#define _wcslen wcslen
159#define _wcsnlen wcsnlen
160#define _wcsstr wcsstr
161#define _wcschr wcschr
162#define _wcsrchr wcsrchr
163#define _wcsncat wcsncat
164
165#endif /* _WIN32 */
166
175 WINPR_ATTR_NODISCARD
176 WINPR_API WCHAR* winpr_wcsnchr(const WCHAR* str, size_t charLen, WCHAR c);
177
186 WINPR_ATTR_NODISCARD
187 WINPR_API WCHAR* winpr_wcsnrchr(const WCHAR* str, size_t charLen, WCHAR c);
188
189#if !defined(_WIN32) || defined(_UWP)
190
191 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
192 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
193
194#ifdef UNICODE
195#define CharUpper CharUpperW
196#else
197#define CharUpper CharUpperA
198#endif
199
200 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
201 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
202
203#ifdef UNICODE
204#define CharUpperBuff CharUpperBuffW
205#else
206#define CharUpperBuff CharUpperBuffA
207#endif
208
209 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
210 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
211
212#ifdef UNICODE
213#define CharLower CharLowerW
214#else
215#define CharLower CharLowerA
216#endif
217
218 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
219 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
220
221#ifdef UNICODE
222#define CharLowerBuff CharLowerBuffW
223#else
224#define CharLowerBuff CharLowerBuffA
225#endif
226
227 WINPR_ATTR_NODISCARD
228 WINPR_API BOOL IsCharAlphaA(CHAR ch);
229 WINPR_ATTR_NODISCARD
230 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
231
232#ifdef UNICODE
233#define IsCharAlpha IsCharAlphaW
234#else
235#define IsCharAlpha IsCharAlphaA
236#endif
237
238 WINPR_ATTR_NODISCARD
239 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
240 WINPR_ATTR_NODISCARD
241 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
242
243#ifdef UNICODE
244#define IsCharAlphaNumeric IsCharAlphaNumericW
245#else
246#define IsCharAlphaNumeric IsCharAlphaNumericA
247#endif
248
249 WINPR_ATTR_NODISCARD
250 WINPR_API BOOL IsCharUpperA(CHAR ch);
251 WINPR_ATTR_NODISCARD
252 WINPR_API BOOL IsCharUpperW(WCHAR ch);
253
254#ifdef UNICODE
255#define IsCharUpper IsCharUpperW
256#else
257#define IsCharUpper IsCharUpperA
258#endif
259
260 WINPR_ATTR_NODISCARD
261 WINPR_API BOOL IsCharLowerA(CHAR ch);
262 WINPR_ATTR_NODISCARD
263 WINPR_API BOOL IsCharLowerW(WCHAR ch);
264
265#ifdef UNICODE
266#define IsCharLower IsCharLowerW
267#else
268#define IsCharLower IsCharLowerA
269#endif
270
271#endif
272
273#ifndef _WIN32
274
275#define sprintf_s snprintf
276#define _snprintf snprintf
277#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
278
279#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
280
281 /* Unicode Conversion */
282
283#if defined(WITH_WINPR_DEPRECATED)
284 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
285 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
286 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
287 LPWSTR lpWideCharStr, int cchWideChar));
288
289 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
290 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
291 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
292 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
293 LPBOOL lpUsedDefaultChar));
294#endif
295
296#endif
297
298 /* Extended API */
315 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
316
335 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
336
356 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
357
374 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
375
394 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
395
415 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
416
427 WINPR_ATTR_MALLOC(free, 1)
428 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
429
442 WINPR_ATTR_MALLOC(free, 1)
443 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
444 size_t* pUtfCharLength);
445
458 WINPR_ATTR_MALLOC(free, 1)
459 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
460 size_t* pUtfCharLength);
461
472 WINPR_ATTR_MALLOC(free, 1)
473 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
474
487 WINPR_ATTR_MALLOC(free, 1)
488 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
489
502 WINPR_ATTR_MALLOC(free, 1)
503 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
504
513 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
514
515#if defined(WITH_WINPR_DEPRECATED)
516 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
517 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
518 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
519 LPWSTR* lpWideCharStr, int cchWideChar));
520
521 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
522 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
523 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
524 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
525 LPBOOL lpUsedDefaultChar));
526#endif
527
528 WINPR_ATTR_NODISCARD
529 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
530
531 WINPR_ATTR_NODISCARD
532 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
533
534 WINPR_ATTR_NODISCARD
535 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
536
537 WINPR_ATTR_NODISCARD
538 WINPR_API char* StrSep(char** stringp, const char* delim);
539
540 WINPR_ATTR_NODISCARD
541 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
542
543#if !defined(WINPR_HAVE_STRNDUP)
544 WINPR_ATTR_MALLOC(free, 1)
545 WINPR_API char* strndup(const char* s, size_t n);
546#endif
547
558 WINPR_ATTR_MALLOC(free, 1)
559 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
560
561#ifdef __cplusplus
562}
563#endif
564
565// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
566WINPR_PRAGMA_DIAG_POP
567
568#endif /* WINPR_CRT_STRING_H */