21#ifndef WINPR_CRT_STRING_H
22#define WINPR_CRT_STRING_H
27#include <winpr/config.h>
28#include <winpr/winpr.h>
29#include <winpr/wtypes.h>
32WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
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);
43 WINPR_API BOOL winpr_str_append(const
char* what,
char* buffer,
size_t size,
44 const
char* separator);
46 WINPR_API
int winpr_asprintf(
char** s,
size_t* slen, const
char* templ, ...);
48 WINPR_API
int winpr_vasprintf(
char** s,
size_t* slen, const
char* templ, va_list ap);
52#define CSTR_LESS_THAN 1
54#define CSTR_GREATER_THAN 3
59#define CP_THREAD_ACP 3
64#define MB_PRECOMPOSED 0x00000001
65#define MB_COMPOSITE 0x00000002
66#define MB_USEGLYPHCHARS 0x00000004
67#define MB_ERR_INVALID_CHARS 0x00000008
69 WINPR_ATTR_MALLOC(free, 1)
70 WINPR_API
char* _strdup(const
char* strSource);
72 WINPR_ATTR_MALLOC(free, 1)
73 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
76 WINPR_API
int _stricmp(const
char* string1, const
char* string2);
79 WINPR_API
int _strnicmp(const
char* string1, const
char* string2,
size_t count);
82 WINPR_API
int _wcscmp(const WCHAR* string1, const WCHAR* string2);
85 WINPR_API
int _wcsncmp(const WCHAR* string1, const WCHAR* string2,
size_t count);
88 WINPR_API
size_t _wcslen(const WCHAR* str);
91 WINPR_API
size_t _wcsnlen(const WCHAR* str,
size_t maxNumberOfElements);
94 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
97 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
100 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
103 WINPR_API
char* strtok_s(
char* strToken, const
char* strDelimit,
char** context);
106 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
108 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src,
size_t sz);
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
123#if !defined(_WIN32) || defined(_UWP)
125 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
126 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
129#define CharUpper CharUpperW
131#define CharUpper CharUpperA
134 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
135 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
138#define CharUpperBuff CharUpperBuffW
140#define CharUpperBuff CharUpperBuffA
143 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
144 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
147#define CharLower CharLowerW
149#define CharLower CharLowerA
152 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
153 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
156#define CharLowerBuff CharLowerBuffW
158#define CharLowerBuff CharLowerBuffA
162 WINPR_API BOOL IsCharAlphaA(CHAR ch);
164 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
167#define IsCharAlpha IsCharAlphaW
169#define IsCharAlpha IsCharAlphaA
173 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
175 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
178#define IsCharAlphaNumeric IsCharAlphaNumericW
180#define IsCharAlphaNumeric IsCharAlphaNumericA
184 WINPR_API BOOL IsCharUpperA(CHAR ch);
186 WINPR_API BOOL IsCharUpperW(WCHAR ch);
189#define IsCharUpper IsCharUpperW
191#define IsCharUpper IsCharUpperA
195 WINPR_API BOOL IsCharLowerA(CHAR ch);
197 WINPR_API BOOL IsCharLowerW(WCHAR ch);
200#define IsCharLower IsCharLowerW
202#define IsCharLower IsCharLowerA
209#define sprintf_s snprintf
210#define _snprintf snprintf
211#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
213#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
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));
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));
248 WINPR_API SSIZE_T ConvertWCharToUtf8(
const WCHAR* wstr,
char* str,
size_t len);
267 WINPR_API SSIZE_T ConvertWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
287 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
304 WINPR_API SSIZE_T ConvertUtf8ToWChar(
const char* str, WCHAR* wstr,
size_t wlen);
323 WINPR_API SSIZE_T ConvertUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
343 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
355 WINPR_ATTR_MALLOC(free, 1)
356 WINPR_API
char* ConvertWCharToUtf8Alloc(const WCHAR* wstr,
size_t* pUtfCharLength);
370 WINPR_ATTR_MALLOC(free, 1)
371 WINPR_API
char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
372 size_t* pUtfCharLength);
386 WINPR_ATTR_MALLOC(free, 1)
387 WINPR_API
char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
388 size_t* pUtfCharLength);
400 WINPR_ATTR_MALLOC(free, 1)
401 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const
char* str,
size_t* pSize);
415 WINPR_ATTR_MALLOC(free, 1)
416 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
430 WINPR_ATTR_MALLOC(free, 1)
431 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
441 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const
char* str, WCHAR* buffer,
size_t len);
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));
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));
457 WINPR_API
const WCHAR* ByteSwapUnicode(WCHAR* wstr,
size_t length);
460 WINPR_API
size_t ConvertLineEndingToLF(
char* str,
size_t size);
463 WINPR_API
char* ConvertLineEndingToCRLF(
const char* str,
size_t* size);
466 WINPR_API
char* StrSep(
char** stringp,
const char* delim);
469 WINPR_API INT64 GetLine(
char** lineptr,
size_t* size, FILE* stream);
471#if !defined(WINPR_HAVE_STRNDUP)
472 WINPR_ATTR_MALLOC(free, 1)
473 WINPR_API
char* strndup(const
char* s,
size_t n);
486 WINPR_ATTR_MALLOC(free, 1)
487 WINPR_API WCHAR* wcsndup(const WCHAR* s,
size_t n);