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
62 WINPR_ATTR_NODISCARD
63 WINPR_API BOOL winpr_str_is_valid_url(const char* str);
64
72 WINPR_ATTR_NODISCARD
73 WINPR_API BOOL winpr_str_is_valid_urlN(const char* str, size_t len);
74
81 WINPR_ATTR_NODISCARD
82 WINPR_API BOOL winpr_str_has_newlines(const char* str);
83
84 WINPR_API BOOL winpr_str_append(const char* what, char* buffer, size_t size,
85 const char* separator);
86
87 WINPR_API int winpr_asprintf(char** s, size_t* slen, const char* templ, ...);
88
89 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
90
91#ifndef _WIN32
92
93#define CSTR_LESS_THAN 1
94#define CSTR_EQUAL 2
95#define CSTR_GREATER_THAN 3
96
97#define CP_ACP 0
98#define CP_OEMCP 1
99#define CP_MACCP 2
100#define CP_THREAD_ACP 3
101#define CP_SYMBOL 42
102#define CP_UTF7 65000
103#define CP_UTF8 65001
104
105#define MB_PRECOMPOSED 0x00000001
106#define MB_COMPOSITE 0x00000002
107#define MB_USEGLYPHCHARS 0x00000004
108#define MB_ERR_INVALID_CHARS 0x00000008
109
110 WINPR_ATTR_MALLOC(free, 1)
111 WINPR_API char* _strdup(const char* strSource);
112
113 WINPR_ATTR_MALLOC(free, 1)
114 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
115
116 WINPR_ATTR_NODISCARD
117 WINPR_API int _stricmp(const char* string1, const char* string2);
118
119 WINPR_ATTR_NODISCARD
120 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
121
122 WINPR_ATTR_NODISCARD
123 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
124
125 WINPR_ATTR_NODISCARD
126 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
127
128 WINPR_ATTR_NODISCARD
129 WINPR_API size_t _wcslen(const WCHAR* str);
130
131 WINPR_ATTR_NODISCARD
132 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
133
134 WINPR_ATTR_NODISCARD
135 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
136
137 WINPR_ATTR_NODISCARD
138 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
139
140 WINPR_ATTR_NODISCARD
141 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
142
143 WINPR_ATTR_NODISCARD
144 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
145
146 WINPR_ATTR_NODISCARD
147 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
148
149 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
150
151#else
152
153#define _wcscmp wcscmp
154#define _wcsncmp wcsncmp
155#define _wcslen wcslen
156#define _wcsnlen wcsnlen
157#define _wcsstr wcsstr
158#define _wcschr wcschr
159#define _wcsrchr wcsrchr
160#define _wcsncat wcsncat
161
162#endif /* _WIN32 */
163
164#if !defined(_WIN32) || defined(_UWP)
165
166 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
167 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
168
169#ifdef UNICODE
170#define CharUpper CharUpperW
171#else
172#define CharUpper CharUpperA
173#endif
174
175 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
176 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
177
178#ifdef UNICODE
179#define CharUpperBuff CharUpperBuffW
180#else
181#define CharUpperBuff CharUpperBuffA
182#endif
183
184 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
185 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
186
187#ifdef UNICODE
188#define CharLower CharLowerW
189#else
190#define CharLower CharLowerA
191#endif
192
193 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
194 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
195
196#ifdef UNICODE
197#define CharLowerBuff CharLowerBuffW
198#else
199#define CharLowerBuff CharLowerBuffA
200#endif
201
202 WINPR_ATTR_NODISCARD
203 WINPR_API BOOL IsCharAlphaA(CHAR ch);
204 WINPR_ATTR_NODISCARD
205 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
206
207#ifdef UNICODE
208#define IsCharAlpha IsCharAlphaW
209#else
210#define IsCharAlpha IsCharAlphaA
211#endif
212
213 WINPR_ATTR_NODISCARD
214 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
215 WINPR_ATTR_NODISCARD
216 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
217
218#ifdef UNICODE
219#define IsCharAlphaNumeric IsCharAlphaNumericW
220#else
221#define IsCharAlphaNumeric IsCharAlphaNumericA
222#endif
223
224 WINPR_ATTR_NODISCARD
225 WINPR_API BOOL IsCharUpperA(CHAR ch);
226 WINPR_ATTR_NODISCARD
227 WINPR_API BOOL IsCharUpperW(WCHAR ch);
228
229#ifdef UNICODE
230#define IsCharUpper IsCharUpperW
231#else
232#define IsCharUpper IsCharUpperA
233#endif
234
235 WINPR_ATTR_NODISCARD
236 WINPR_API BOOL IsCharLowerA(CHAR ch);
237 WINPR_ATTR_NODISCARD
238 WINPR_API BOOL IsCharLowerW(WCHAR ch);
239
240#ifdef UNICODE
241#define IsCharLower IsCharLowerW
242#else
243#define IsCharLower IsCharLowerA
244#endif
245
246#endif
247
248#ifndef _WIN32
249
250#define sprintf_s snprintf
251#define _snprintf snprintf
252#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
253
254#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
255
256 /* Unicode Conversion */
257
258#if defined(WITH_WINPR_DEPRECATED)
259 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
260 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
261 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
262 LPWSTR lpWideCharStr, int cchWideChar));
263
264 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
265 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
266 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
267 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
268 LPBOOL lpUsedDefaultChar));
269#endif
270
271#endif
272
273 /* Extended API */
289 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
290
308 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
309
328 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
329
345 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
346
364 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
365
384 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
385
396 WINPR_ATTR_MALLOC(free, 1)
397 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
398
411 WINPR_ATTR_MALLOC(free, 1)
412 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
413 size_t* pUtfCharLength);
414
427 WINPR_ATTR_MALLOC(free, 1)
428 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
429 size_t* pUtfCharLength);
430
441 WINPR_ATTR_MALLOC(free, 1)
442 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
443
456 WINPR_ATTR_MALLOC(free, 1)
457 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
458
471 WINPR_ATTR_MALLOC(free, 1)
472 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
473
482 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
483
484#if defined(WITH_WINPR_DEPRECATED)
485 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
486 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
487 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
488 LPWSTR* lpWideCharStr, int cchWideChar));
489
490 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
491 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
492 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
493 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
494 LPBOOL lpUsedDefaultChar));
495#endif
496
497 WINPR_ATTR_NODISCARD
498 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
499
500 WINPR_ATTR_NODISCARD
501 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
502
503 WINPR_ATTR_NODISCARD
504 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
505
506 WINPR_ATTR_NODISCARD
507 WINPR_API char* StrSep(char** stringp, const char* delim);
508
509 WINPR_ATTR_NODISCARD
510 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
511
512#if !defined(WINPR_HAVE_STRNDUP)
513 WINPR_ATTR_MALLOC(free, 1)
514 WINPR_API char* strndup(const char* s, size_t n);
515#endif
516
527 WINPR_ATTR_MALLOC(free, 1)
528 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
529
530#ifdef __cplusplus
531}
532#endif
533
534// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
535WINPR_PRAGMA_DIAG_POP
536
537#endif /* WINPR_CRT_STRING_H */