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
40 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_encode(const char* str, size_t len);
41 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_decode(const char* str, size_t len);
42
43 WINPR_API BOOL winpr_str_append(const char* what, char* buffer, size_t size,
44 const char* separator);
45
46 WINPR_API int winpr_asprintf(char** s, size_t* slen, const char* templ, ...);
47
48 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
49
50#ifndef _WIN32
51
52#define CSTR_LESS_THAN 1
53#define CSTR_EQUAL 2
54#define CSTR_GREATER_THAN 3
55
56#define CP_ACP 0
57#define CP_OEMCP 1
58#define CP_MACCP 2
59#define CP_THREAD_ACP 3
60#define CP_SYMBOL 42
61#define CP_UTF7 65000
62#define CP_UTF8 65001
63
64#define MB_PRECOMPOSED 0x00000001
65#define MB_COMPOSITE 0x00000002
66#define MB_USEGLYPHCHARS 0x00000004
67#define MB_ERR_INVALID_CHARS 0x00000008
68
69 WINPR_ATTR_MALLOC(free, 1)
70 WINPR_API char* _strdup(const char* strSource);
71
72 WINPR_ATTR_MALLOC(free, 1)
73 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
74
75 WINPR_ATTR_NODISCARD
76 WINPR_API int _stricmp(const char* string1, const char* string2);
77
78 WINPR_ATTR_NODISCARD
79 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
80
81 WINPR_ATTR_NODISCARD
82 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
83
84 WINPR_ATTR_NODISCARD
85 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
86
87 WINPR_ATTR_NODISCARD
88 WINPR_API size_t _wcslen(const WCHAR* str);
89
90 WINPR_ATTR_NODISCARD
91 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
92
93 WINPR_ATTR_NODISCARD
94 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
95
96 WINPR_ATTR_NODISCARD
97 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
98
99 WINPR_ATTR_NODISCARD
100 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
101
102 WINPR_ATTR_NODISCARD
103 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
104
105 WINPR_ATTR_NODISCARD
106 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
107
108 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
109
110#else
111
112#define _wcscmp wcscmp
113#define _wcsncmp wcsncmp
114#define _wcslen wcslen
115#define _wcsnlen wcsnlen
116#define _wcsstr wcsstr
117#define _wcschr wcschr
118#define _wcsrchr wcsrchr
119#define _wcsncat wcsncat
120
121#endif /* _WIN32 */
122
123#if !defined(_WIN32) || defined(_UWP)
124
125 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
126 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
127
128#ifdef UNICODE
129#define CharUpper CharUpperW
130#else
131#define CharUpper CharUpperA
132#endif
133
134 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
135 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
136
137#ifdef UNICODE
138#define CharUpperBuff CharUpperBuffW
139#else
140#define CharUpperBuff CharUpperBuffA
141#endif
142
143 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
144 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
145
146#ifdef UNICODE
147#define CharLower CharLowerW
148#else
149#define CharLower CharLowerA
150#endif
151
152 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
153 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
154
155#ifdef UNICODE
156#define CharLowerBuff CharLowerBuffW
157#else
158#define CharLowerBuff CharLowerBuffA
159#endif
160
161 WINPR_ATTR_NODISCARD
162 WINPR_API BOOL IsCharAlphaA(CHAR ch);
163 WINPR_ATTR_NODISCARD
164 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
165
166#ifdef UNICODE
167#define IsCharAlpha IsCharAlphaW
168#else
169#define IsCharAlpha IsCharAlphaA
170#endif
171
172 WINPR_ATTR_NODISCARD
173 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
174 WINPR_ATTR_NODISCARD
175 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
176
177#ifdef UNICODE
178#define IsCharAlphaNumeric IsCharAlphaNumericW
179#else
180#define IsCharAlphaNumeric IsCharAlphaNumericA
181#endif
182
183 WINPR_ATTR_NODISCARD
184 WINPR_API BOOL IsCharUpperA(CHAR ch);
185 WINPR_ATTR_NODISCARD
186 WINPR_API BOOL IsCharUpperW(WCHAR ch);
187
188#ifdef UNICODE
189#define IsCharUpper IsCharUpperW
190#else
191#define IsCharUpper IsCharUpperA
192#endif
193
194 WINPR_ATTR_NODISCARD
195 WINPR_API BOOL IsCharLowerA(CHAR ch);
196 WINPR_ATTR_NODISCARD
197 WINPR_API BOOL IsCharLowerW(WCHAR ch);
198
199#ifdef UNICODE
200#define IsCharLower IsCharLowerW
201#else
202#define IsCharLower IsCharLowerA
203#endif
204
205#endif
206
207#ifndef _WIN32
208
209#define sprintf_s snprintf
210#define _snprintf snprintf
211#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
212
213#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
214
215 /* Unicode Conversion */
216
217#if defined(WITH_WINPR_DEPRECATED)
218 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
219 WINPR_ATTR_NODISCARD WINPR_API int MultiByteToWideChar(
220 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
221 LPWSTR lpWideCharStr, int cchWideChar));
222
223 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
224 WINPR_ATTR_NODISCARD WINPR_API int WideCharToMultiByte(
225 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
226 LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
227 LPBOOL lpUsedDefaultChar));
228#endif
229
230#endif
231
232 /* Extended API */
248 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
249
267 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
268
287 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
288
304 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
305
323 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
324
343 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
344
355 WINPR_ATTR_MALLOC(free, 1)
356 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
357
370 WINPR_ATTR_MALLOC(free, 1)
371 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
372 size_t* pUtfCharLength);
373
386 WINPR_ATTR_MALLOC(free, 1)
387 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
388 size_t* pUtfCharLength);
389
400 WINPR_ATTR_MALLOC(free, 1)
401 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
402
415 WINPR_ATTR_MALLOC(free, 1)
416 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
417
430 WINPR_ATTR_MALLOC(free, 1)
431 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
432
441 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
442
443#if defined(WITH_WINPR_DEPRECATED)
444 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
445 WINPR_ATTR_NODISCARD WINPR_API int ConvertToUnicode(
446 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte,
447 LPWSTR* lpWideCharStr, int cchWideChar));
448
449 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
450 WINPR_ATTR_NODISCARD WINPR_API int ConvertFromUnicode(
451 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar,
452 LPSTR* lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar,
453 LPBOOL lpUsedDefaultChar));
454#endif
455
456 WINPR_ATTR_NODISCARD
457 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
458
459 WINPR_ATTR_NODISCARD
460 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
461
462 WINPR_ATTR_NODISCARD
463 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
464
465 WINPR_ATTR_NODISCARD
466 WINPR_API char* StrSep(char** stringp, const char* delim);
467
468 WINPR_ATTR_NODISCARD
469 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
470
471#if !defined(WINPR_HAVE_STRNDUP)
472 WINPR_ATTR_MALLOC(free, 1)
473 WINPR_API char* strndup(const char* s, size_t n);
474#endif
475
486 WINPR_ATTR_MALLOC(free, 1)
487 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
488
489#ifdef __cplusplus
490}
491#endif
492
493// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
494WINPR_PRAGMA_DIAG_POP
495
496#endif /* WINPR_CRT_STRING_H */