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 <wchar.h>
25#include <stdio.h>
26#include <string.h>
27#include <winpr/config.h>
28#include <winpr/winpr.h>
29#include <winpr/wtypes.h>
30
31WINPR_PRAGMA_DIAG_PUSH
32WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
33// NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
34
35#ifdef __cplusplus
36extern "C"
37{
38#endif
39
50 WINPR_ATTR_NODISCARD
51 WINPR_API char* winpr_strnstr(char* haystack, const char* needle, size_t hlen);
52
53 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_encode(const char* str, size_t len);
54 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_decode(const char* str, size_t len);
55
56 WINPR_API BOOL winpr_str_append(const char* what, char* buffer, size_t size,
57 const char* separator);
58
59 WINPR_API int winpr_asprintf(char** s, size_t* slen, const char* templ, ...);
60
61 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
62
63#ifndef _WIN32
64
65#define CSTR_LESS_THAN 1
66#define CSTR_EQUAL 2
67#define CSTR_GREATER_THAN 3
68
69#define CP_ACP 0
70#define CP_OEMCP 1
71#define CP_MACCP 2
72#define CP_THREAD_ACP 3
73#define CP_SYMBOL 42
74#define CP_UTF7 65000
75#define CP_UTF8 65001
76
77#define MB_PRECOMPOSED 0x00000001
78#define MB_COMPOSITE 0x00000002
79#define MB_USEGLYPHCHARS 0x00000004
80#define MB_ERR_INVALID_CHARS 0x00000008
81
82 WINPR_ATTR_MALLOC(free, 1)
83 WINPR_API char* _strdup(const char* strSource);
84
85 WINPR_ATTR_MALLOC(free, 1)
86 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
87
88 WINPR_ATTR_NODISCARD
89 WINPR_API int _stricmp(const char* string1, const char* string2);
90
91 WINPR_ATTR_NODISCARD
92 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
93
94 WINPR_ATTR_NODISCARD
95 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
96
97 WINPR_ATTR_NODISCARD
98 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
99
100 WINPR_ATTR_NODISCARD
101 WINPR_API size_t _wcslen(const WCHAR* str);
102
103 WINPR_ATTR_NODISCARD
104 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
105
106 WINPR_ATTR_NODISCARD
107 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
108
109 WINPR_ATTR_NODISCARD
110 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
111
112 WINPR_ATTR_NODISCARD
113 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
114
115 WINPR_ATTR_NODISCARD
116 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
117
118 WINPR_ATTR_NODISCARD
119 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
120
121 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
122
123#else
124
125#define _wcscmp wcscmp
126#define _wcsncmp wcsncmp
127#define _wcslen wcslen
128#define _wcsnlen wcsnlen
129#define _wcsstr wcsstr
130#define _wcschr wcschr
131#define _wcsrchr wcsrchr
132#define _wcsncat wcsncat
133
134#endif /* _WIN32 */
135
136#if !defined(_WIN32) || defined(_UWP)
137
138 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
139 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
140
141#ifdef UNICODE
142#define CharUpper CharUpperW
143#else
144#define CharUpper CharUpperA
145#endif
146
147 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
148 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
149
150#ifdef UNICODE
151#define CharUpperBuff CharUpperBuffW
152#else
153#define CharUpperBuff CharUpperBuffA
154#endif
155
156 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
157 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
158
159#ifdef UNICODE
160#define CharLower CharLowerW
161#else
162#define CharLower CharLowerA
163#endif
164
165 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
166 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
167
168#ifdef UNICODE
169#define CharLowerBuff CharLowerBuffW
170#else
171#define CharLowerBuff CharLowerBuffA
172#endif
173
174 WINPR_ATTR_NODISCARD
175 WINPR_API BOOL IsCharAlphaA(CHAR ch);
176 WINPR_ATTR_NODISCARD
177 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
178
179#ifdef UNICODE
180#define IsCharAlpha IsCharAlphaW
181#else
182#define IsCharAlpha IsCharAlphaA
183#endif
184
185 WINPR_ATTR_NODISCARD
186 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
187 WINPR_ATTR_NODISCARD
188 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
189
190#ifdef UNICODE
191#define IsCharAlphaNumeric IsCharAlphaNumericW
192#else
193#define IsCharAlphaNumeric IsCharAlphaNumericA
194#endif
195
196 WINPR_ATTR_NODISCARD
197 WINPR_API BOOL IsCharUpperA(CHAR ch);
198 WINPR_ATTR_NODISCARD
199 WINPR_API BOOL IsCharUpperW(WCHAR ch);
200
201#ifdef UNICODE
202#define IsCharUpper IsCharUpperW
203#else
204#define IsCharUpper IsCharUpperA
205#endif
206
207 WINPR_ATTR_NODISCARD
208 WINPR_API BOOL IsCharLowerA(CHAR ch);
209 WINPR_ATTR_NODISCARD
210 WINPR_API BOOL IsCharLowerW(WCHAR ch);
211
212#ifdef UNICODE
213#define IsCharLower IsCharLowerW
214#else
215#define IsCharLower IsCharLowerA
216#endif
217
218#endif
219
220#ifndef _WIN32
221
222#define sprintf_s snprintf
223#define _snprintf snprintf
224#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
225
226#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
227
228 /* Unicode Conversion */
229
230#if defined(WITH_WINPR_DEPRECATED)
231 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
232 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
233 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
234 LPWSTR lpWideCharStr, int cchWideChar));
235
236 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
237 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
238 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
239 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
240 LPBOOL lpUsedDefaultChar));
241#endif
242
243#endif
244
245 /* Extended API */
261 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
262
280 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
281
300 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
301
317 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
318
336 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
337
356 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
357
368 WINPR_ATTR_MALLOC(free, 1)
369 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
370
383 WINPR_ATTR_MALLOC(free, 1)
384 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
385 size_t* pUtfCharLength);
386
399 WINPR_ATTR_MALLOC(free, 1)
400 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
401 size_t* pUtfCharLength);
402
413 WINPR_ATTR_MALLOC(free, 1)
414 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
415
428 WINPR_ATTR_MALLOC(free, 1)
429 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
430
443 WINPR_ATTR_MALLOC(free, 1)
444 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
445
454 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
455
456#if defined(WITH_WINPR_DEPRECATED)
457 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
458 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
459 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
460 LPWSTR* lpWideCharStr, int cchWideChar));
461
462 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
463 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
464 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
465 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
466 LPBOOL lpUsedDefaultChar));
467#endif
468
469 WINPR_ATTR_NODISCARD
470 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
471
472 WINPR_ATTR_NODISCARD
473 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
474
475 WINPR_ATTR_NODISCARD
476 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
477
478 WINPR_ATTR_NODISCARD
479 WINPR_API char* StrSep(char** stringp, const char* delim);
480
481 WINPR_ATTR_NODISCARD
482 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
483
484#if !defined(WINPR_HAVE_STRNDUP)
485 WINPR_ATTR_MALLOC(free, 1)
486 WINPR_API char* strndup(const char* s, size_t n);
487#endif
488
499 WINPR_ATTR_MALLOC(free, 1)
500 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
501
502#ifdef __cplusplus
503}
504#endif
505
506// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
507WINPR_PRAGMA_DIAG_POP
508
509#endif /* WINPR_CRT_STRING_H */