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 char* winpr_str_url_encode(const char* str, size_t len);
41 WINPR_API 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 WINPR_API int winpr_vasprintf(char** s, size_t* slen, const char* templ, va_list ap);
48
49#ifndef _WIN32
50
51#define CSTR_LESS_THAN 1
52#define CSTR_EQUAL 2
53#define CSTR_GREATER_THAN 3
54
55#define CP_ACP 0
56#define CP_OEMCP 1
57#define CP_MACCP 2
58#define CP_THREAD_ACP 3
59#define CP_SYMBOL 42
60#define CP_UTF7 65000
61#define CP_UTF8 65001
62
63#define MB_PRECOMPOSED 0x00000001
64#define MB_COMPOSITE 0x00000002
65#define MB_USEGLYPHCHARS 0x00000004
66#define MB_ERR_INVALID_CHARS 0x00000008
67
68 WINPR_API char* _strdup(const char* strSource);
69 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
70
71 WINPR_API int _stricmp(const char* string1, const char* string2);
72 WINPR_API int _strnicmp(const char* string1, const char* string2, size_t count);
73
74 WINPR_API int _wcscmp(const WCHAR* string1, const WCHAR* string2);
75 WINPR_API int _wcsncmp(const WCHAR* string1, const WCHAR* string2, size_t count);
76
77 WINPR_API size_t _wcslen(const WCHAR* str);
78 WINPR_API size_t _wcsnlen(const WCHAR* str, size_t maxNumberOfElements);
79
80 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
81
82 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
83 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
84
85 WINPR_API char* strtok_s(char* strToken, const char* strDelimit, char** context);
86 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
87
88 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src, size_t sz);
89
90#else
91
92#define _wcscmp wcscmp
93#define _wcsncmp wcsncmp
94#define _wcslen wcslen
95#define _wcsnlen wcsnlen
96#define _wcsstr wcsstr
97#define _wcschr wcschr
98#define _wcsrchr wcsrchr
99#define _wcsncat wcsncat
100
101#endif /* _WIN32 */
102
103#if !defined(_WIN32) || defined(_UWP)
104
105 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
106 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
107
108#ifdef UNICODE
109#define CharUpper CharUpperW
110#else
111#define CharUpper CharUpperA
112#endif
113
114 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
115 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
116
117#ifdef UNICODE
118#define CharUpperBuff CharUpperBuffW
119#else
120#define CharUpperBuff CharUpperBuffA
121#endif
122
123 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
124 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
125
126#ifdef UNICODE
127#define CharLower CharLowerW
128#else
129#define CharLower CharLowerA
130#endif
131
132 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
133 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
134
135#ifdef UNICODE
136#define CharLowerBuff CharLowerBuffW
137#else
138#define CharLowerBuff CharLowerBuffA
139#endif
140
141 WINPR_API BOOL IsCharAlphaA(CHAR ch);
142 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
143
144#ifdef UNICODE
145#define IsCharAlpha IsCharAlphaW
146#else
147#define IsCharAlpha IsCharAlphaA
148#endif
149
150 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
151 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
152
153#ifdef UNICODE
154#define IsCharAlphaNumeric IsCharAlphaNumericW
155#else
156#define IsCharAlphaNumeric IsCharAlphaNumericA
157#endif
158
159 WINPR_API BOOL IsCharUpperA(CHAR ch);
160 WINPR_API BOOL IsCharUpperW(WCHAR ch);
161
162#ifdef UNICODE
163#define IsCharUpper IsCharUpperW
164#else
165#define IsCharUpper IsCharUpperA
166#endif
167
168 WINPR_API BOOL IsCharLowerA(CHAR ch);
169 WINPR_API BOOL IsCharLowerW(WCHAR ch);
170
171#ifdef UNICODE
172#define IsCharLower IsCharLowerW
173#else
174#define IsCharLower IsCharLowerA
175#endif
176
177#endif
178
179#ifndef _WIN32
180
181#define sprintf_s snprintf
182#define _snprintf snprintf
183#define _scprintf(...) snprintf(NULL, 0, __VA_ARGS__)
184
185#define _scprintf(...) snprintf(NULL, 0, __VA_ARGS__)
186
187 /* Unicode Conversion */
188
189#if defined(WITH_WINPR_DEPRECATED)
190 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar instead",
191 WINPR_API int MultiByteToWideChar(UINT CodePage, DWORD dwFlags,
192 LPCSTR lpMultiByteStr, int cbMultiByte,
193 LPWSTR lpWideCharStr, int cchWideChar));
194
195 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 instead",
196 WINPR_API int WideCharToMultiByte(UINT CodePage, DWORD dwFlags,
197 LPCWSTR lpWideCharStr, int cchWideChar,
198 LPSTR lpMultiByteStr, int cbMultiByte,
199 LPCSTR lpDefaultChar,
200 LPBOOL lpUsedDefaultChar));
201#endif
202
203#endif
204
205 /* Extended API */
221 WINPR_API SSIZE_T ConvertWCharToUtf8(const WCHAR* wstr, char* str, size_t len);
222
240 WINPR_API SSIZE_T ConvertWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
241
260 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(const WCHAR* wstr, size_t wlen, char* str, size_t len);
261
277 WINPR_API SSIZE_T ConvertUtf8ToWChar(const char* str, WCHAR* wstr, size_t wlen);
278
296 WINPR_API SSIZE_T ConvertUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
297
316 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(const char* str, size_t len, WCHAR* wstr, size_t wlen);
317
328 WINPR_API char* ConvertWCharToUtf8Alloc(const WCHAR* wstr, size_t* pUtfCharLength);
329
342 WINPR_API char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
343 size_t* pUtfCharLength);
344
357 WINPR_API char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr, size_t wlen,
358 size_t* pUtfCharLength);
359
370 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const char* str, size_t* pSize);
371
384 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
385
398 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const char* str, size_t len, size_t* pSize);
399
408 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const char* str, WCHAR* buffer, size_t len);
409
410#if defined(WITH_WINPR_DEPRECATED)
411 WINPR_DEPRECATED_VAR("Use ConvertUtf8ToWChar functions instead",
412 WINPR_API int ConvertToUnicode(UINT CodePage, DWORD dwFlags,
413 LPCSTR lpMultiByteStr, int cbMultiByte,
414 LPWSTR* lpWideCharStr, int cchWideChar));
415
416 WINPR_DEPRECATED_VAR("Use ConvertWCharToUtf8 functions instead",
417 WINPR_API int ConvertFromUnicode(UINT CodePage, DWORD dwFlags,
418 LPCWSTR lpWideCharStr, int cchWideChar,
419 LPSTR* lpMultiByteStr, int cbMultiByte,
420 LPCSTR lpDefaultChar,
421 LPBOOL lpUsedDefaultChar));
422#endif
423
424 WINPR_API const WCHAR* ByteSwapUnicode(WCHAR* wstr, size_t length);
425
426 WINPR_API size_t ConvertLineEndingToLF(char* str, size_t size);
427 WINPR_API char* ConvertLineEndingToCRLF(const char* str, size_t* size);
428
429 WINPR_API char* StrSep(char** stringp, const char* delim);
430
431 WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream);
432
433#if !defined(WINPR_HAVE_STRNDUP)
434 WINPR_ATTR_MALLOC(free, 1)
435 WINPR_API char* strndup(const char* s, size_t n);
436#endif
437
448 WINPR_ATTR_MALLOC(free, 1)
449 WINPR_API WCHAR* wcsndup(const WCHAR* s, size_t n);
450
451#ifdef __cplusplus
452}
453#endif
454
455// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
456WINPR_PRAGMA_DIAG_POP
457
458#endif /* WINPR_CRT_STRING_H */