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(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 WINPR_ATTR_NODISCARD
139 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
140
141 WINPR_ATTR_NODISCARD
142 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
143
144 WINPR_ATTR_NODISCARD
145 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
146
147 WINPR_ATTR_NODISCARD
148 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
149
150 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
151
152#else
153
154#define _wcscmp wcscmp
155#define _wcsncmp wcsncmp
156#define _wcslen wcslen
157#define _wcsnlen wcsnlen
158#define _wcsstr wcsstr
159#define _wcschr wcschr
160#define _wcsrchr wcsrchr
161#define _wcsncat wcsncat
162
163#endif /* _WIN32 */
164
165#if !defined(_WIN32) || defined(_UWP)
166
167 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
168 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
169
170#ifdef UNICODE
171#define CharUpper CharUpperW
172#else
173#define CharUpper CharUpperA
174#endif
175
176 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
177 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
178
179#ifdef UNICODE
180#define CharUpperBuff CharUpperBuffW
181#else
182#define CharUpperBuff CharUpperBuffA
183#endif
184
185 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
186 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
187
188#ifdef UNICODE
189#define CharLower CharLowerW
190#else
191#define CharLower CharLowerA
192#endif
193
194 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
195 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
196
197#ifdef UNICODE
198#define CharLowerBuff CharLowerBuffW
199#else
200#define CharLowerBuff CharLowerBuffA
201#endif
202
203 WINPR_ATTR_NODISCARD
204 WINPR_API BOOL IsCharAlphaA(CHAR ch);
205 WINPR_ATTR_NODISCARD
206 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
207
208#ifdef UNICODE
209#define IsCharAlpha IsCharAlphaW
210#else
211#define IsCharAlpha IsCharAlphaA
212#endif
213
214 WINPR_ATTR_NODISCARD
215 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
216 WINPR_ATTR_NODISCARD
217 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
218
219#ifdef UNICODE
220#define IsCharAlphaNumeric IsCharAlphaNumericW
221#else
222#define IsCharAlphaNumeric IsCharAlphaNumericA
223#endif
224
225 WINPR_ATTR_NODISCARD
226 WINPR_API BOOL IsCharUpperA(CHAR ch);
227 WINPR_ATTR_NODISCARD
228 WINPR_API BOOL IsCharUpperW(WCHAR ch);
229
230#ifdef UNICODE
231#define IsCharUpper IsCharUpperW
232#else
233#define IsCharUpper IsCharUpperA
234#endif
235
236 WINPR_ATTR_NODISCARD
237 WINPR_API BOOL IsCharLowerA(CHAR ch);
238 WINPR_ATTR_NODISCARD
239 WINPR_API BOOL IsCharLowerW(WCHAR ch);
240
241#ifdef UNICODE
242#define IsCharLower IsCharLowerW
243#else
244#define IsCharLower IsCharLowerA
245#endif
246
247#endif
248
249#ifndef _WIN32
250
251#define sprintf_s snprintf
252#define _snprintf snprintf
253#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
254
255#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
256
257 /* Unicode Conversion */
258
259#if defined(WITH_WINPR_DEPRECATED)
260 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
261 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
262 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
263 LPWSTR lpWideCharStr, int cchWideChar));
264
265 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
266 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
267 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
268 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
269 LPBOOL lpUsedDefaultChar));
270#endif
271
272#endif
273
274 /* Extended API */
290 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
291
309 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
310
329 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
330
346 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
347
365 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
366
385 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
386
397 WINPR_ATTR_MALLOC(free, 1)
398 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
399
412 WINPR_ATTR_MALLOC(free, 1)
413 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
414 size_t* pUtfCharLength);
415
428 WINPR_ATTR_MALLOC(free, 1)
429 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
430 size_t* pUtfCharLength);
431
442 WINPR_ATTR_MALLOC(free, 1)
443 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
444
457 WINPR_ATTR_MALLOC(free, 1)
458 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
459
472 WINPR_ATTR_MALLOC(free, 1)
473 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
474
483 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
484
485#if defined(WITH_WINPR_DEPRECATED)
486 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
487 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
488 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
489 LPWSTR* lpWideCharStr, int cchWideChar));
490
491 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
492 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
493 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
494 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
495 LPBOOL lpUsedDefaultChar));
496#endif
497
498 WINPR_ATTR_NODISCARD
499 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
500
501 WINPR_ATTR_NODISCARD
502 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
503
504 WINPR_ATTR_NODISCARD
505 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
506
507 WINPR_ATTR_NODISCARD
508 WINPR_API char* StrSep(char** stringp, const char* delim);
509
510 WINPR_ATTR_NODISCARD
511 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
512
513#if !defined(WINPR_HAVE_STRNDUP)
514 WINPR_ATTR_MALLOC(free, 1)
515 WINPR_API char* strndup(const char* s, size_t n);
516#endif
517
528 WINPR_ATTR_MALLOC(free, 1)
529 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
530
531#ifdef __cplusplus
532}
533#endif
534
535// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
536WINPR_PRAGMA_DIAG_POP
537
538#endif /* WINPR_CRT_STRING_H */