21#ifndef WINPR_CRT_STRING_H
22#define WINPR_CRT_STRING_H
28#include <winpr/config.h>
29#include <winpr/winpr.h>
30#include <winpr/wtypes.h>
33WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
52 WINPR_API
char* winpr_strnstr(
const char* haystack,
const char* needle,
size_t hlen);
54 WINPR_API WINPR_ATTR_MALLOC(free, 1) char* winpr_str_url_encode(const
char* str,
size_t len);
55 WINPR_API WINPR_ATTR_MALLOC(free, 1)
char* winpr_str_url_decode(const
char* str,
size_t len);
64 WINPR_API BOOL winpr_str_is_valid_url(const
char* str);
74 WINPR_API BOOL winpr_str_is_valid_urlN(const
char* str,
size_t len);
83 WINPR_API BOOL winpr_str_is_valid_hostname(const
char* str);
93 WINPR_API BOOL winpr_str_is_valid_hostnameN(const
char* str,
size_t len);
102 WINPR_API BOOL winpr_str_has_newlines(const
char* str);
104 WINPR_API BOOL winpr_str_append(const
char* what,
char* buffer,
size_t size,
105 const
char* separator);
107 WINPR_API
int winpr_asprintf(
char** s,
size_t* slen, const
char* templ, ...);
109 WINPR_API
int winpr_vasprintf(
char** s,
size_t* slen, const
char* templ, va_list ap);
113#define CSTR_LESS_THAN 1
115#define CSTR_GREATER_THAN 3
120#define CP_THREAD_ACP 3
125#define MB_PRECOMPOSED 0x00000001
126#define MB_COMPOSITE 0x00000002
127#define MB_USEGLYPHCHARS 0x00000004
128#define MB_ERR_INVALID_CHARS 0x00000008
130 WINPR_ATTR_MALLOC(free, 1)
131 WINPR_API
char* _strdup(const
char* strSource);
133 WINPR_ATTR_MALLOC(free, 1)
134 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
137 WINPR_API
int _stricmp(const
char* string1, const
char* string2);
140 WINPR_API
int _strnicmp(const
char* string1, const
char* string2,
size_t count);
143 WINPR_API
int _wcscmp(const WCHAR* string1, const WCHAR* string2);
146 WINPR_API
int _wcsncmp(const WCHAR* string1, const WCHAR* string2,
size_t count);
149 WINPR_API
size_t _wcslen(const WCHAR* str);
152 WINPR_API
size_t _wcsnlen(const WCHAR* str,
size_t maxNumberOfElements);
155 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
157#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
158 WINPR_DEPRECATED_VAR(
"[since 3.32.0] use winpr_wcsnchr instead",
159 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcschr(
const WCHAR* str, WCHAR c));
161 WINPR_DEPRECATED_VAR(
"[since 3.32.0] use winpr_wcsnrchr instead",
162 WINPR_ATTR_NODISCARD WINPR_API WCHAR* _wcsrchr(
const WCHAR* str, WCHAR c));
166 WINPR_API
char* strtok_s(
char* strToken,
const char* strDelimit,
char** context);
169 WINPR_API WCHAR* wcstok_s(WCHAR* strToken,
const WCHAR* strDelimit, WCHAR** context);
171 WINPR_API WCHAR* _wcsncat(WCHAR* dst,
const WCHAR* src,
size_t sz);
175#define _wcscmp wcscmp
176#define _wcsncmp wcsncmp
177#define _wcslen wcslen
178#define _wcsnlen wcsnlen
179#define _wcsstr wcsstr
180#define _wcschr wcschr
181#define _wcsrchr wcsrchr
182#define _wcsncat wcsncat
195 WINPR_API WCHAR* winpr_wcsnchr(
const WCHAR* str,
size_t charLen, WCHAR c);
206 WINPR_API WCHAR* winpr_wcsnrchr(
const WCHAR* str,
size_t charLen, WCHAR c);
208#if !defined(_WIN32) || defined(_UWP)
210 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
211 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
214#define CharUpper CharUpperW
216#define CharUpper CharUpperA
219 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
220 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
223#define CharUpperBuff CharUpperBuffW
225#define CharUpperBuff CharUpperBuffA
228 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
229 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
232#define CharLower CharLowerW
234#define CharLower CharLowerA
237 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
238 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
241#define CharLowerBuff CharLowerBuffW
243#define CharLowerBuff CharLowerBuffA
247 WINPR_API BOOL IsCharAlphaA(CHAR ch);
249 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
252#define IsCharAlpha IsCharAlphaW
254#define IsCharAlpha IsCharAlphaA
258 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
260 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
263#define IsCharAlphaNumeric IsCharAlphaNumericW
265#define IsCharAlphaNumeric IsCharAlphaNumericA
269 WINPR_API BOOL IsCharUpperA(CHAR ch);
271 WINPR_API BOOL IsCharUpperW(WCHAR ch);
274#define IsCharUpper IsCharUpperW
276#define IsCharUpper IsCharUpperA
280 WINPR_API BOOL IsCharLowerA(CHAR ch);
282 WINPR_API BOOL IsCharLowerW(WCHAR ch);
285#define IsCharLower IsCharLowerW
287#define IsCharLower IsCharLowerA
294#define sprintf_s snprintf
295#define _snprintf snprintf
296#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
298#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
302#if defined(WITH_WINPR_DEPRECATED)
303 WINPR_DEPRECATED_VAR(
"Use ConvertUtf8ToWChar instead",
304 WINPR_ATTR_NODISCARD WINPR_API
int MultiByteToWideChar(
305 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr,
int cbMultiByte,
306 LPWSTR lpWideCharStr,
int cchWideChar));
308 WINPR_DEPRECATED_VAR(
"Use ConvertWCharToUtf8 instead",
309 WINPR_ATTR_NODISCARD WINPR_API
int WideCharToMultiByte(
310 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr,
int cchWideChar,
311 LPSTR lpMultiByteStr,
int cbMultiByte, LPCSTR lpDefaultChar,
312 LPBOOL lpUsedDefaultChar));
334 WINPR_API SSIZE_T ConvertWCharToUtf8(
const WCHAR* wstr,
char* str,
size_t len);
354 WINPR_API SSIZE_T ConvertWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
375 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
393 WINPR_API SSIZE_T ConvertUtf8ToWChar(
const char* str, WCHAR* wstr,
size_t wlen);
413 WINPR_API SSIZE_T ConvertUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
434 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
446 WINPR_ATTR_MALLOC(free, 1)
447 WINPR_API
char* ConvertWCharToUtf8Alloc(const WCHAR* wstr,
size_t* pUtfCharLength);
461 WINPR_ATTR_MALLOC(free, 1)
462 WINPR_API
char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
463 size_t* pUtfCharLength);
477 WINPR_ATTR_MALLOC(free, 1)
478 WINPR_API
char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
479 size_t* pUtfCharLength);
491 WINPR_ATTR_MALLOC(free, 1)
492 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const
char* str,
size_t* pSize);
506 WINPR_ATTR_MALLOC(free, 1)
507 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
521 WINPR_ATTR_MALLOC(free, 1)
522 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
532 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const
char* str, WCHAR* buffer,
size_t len);
534#if defined(WITH_WINPR_DEPRECATED)
535 WINPR_DEPRECATED_VAR(
"Use ConvertUtf8ToWChar functions instead",
536 WINPR_ATTR_NODISCARD WINPR_API
int ConvertToUnicode(
537 UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr,
int cbMultiByte,
538 LPWSTR* lpWideCharStr,
int cchWideChar));
540 WINPR_DEPRECATED_VAR(
"Use ConvertWCharToUtf8 functions instead",
541 WINPR_ATTR_NODISCARD WINPR_API
int ConvertFromUnicode(
542 UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr,
int cchWideChar,
543 LPSTR* lpMultiByteStr,
int cbMultiByte, LPCSTR lpDefaultChar,
544 LPBOOL lpUsedDefaultChar));
548 WINPR_API
const WCHAR* ByteSwapUnicode(WCHAR* wstr,
size_t length);
551 WINPR_API
size_t ConvertLineEndingToLF(
char* str,
size_t size);
554 WINPR_API
char* ConvertLineEndingToCRLF(
const char* str,
size_t* size);
557 WINPR_API
char* StrSep(
char** stringp,
const char* delim);
560 WINPR_API INT64 GetLine(
char** lineptr,
size_t* size, FILE* stream);
562#if !defined(WINPR_HAVE_STRNDUP)
563 WINPR_ATTR_MALLOC(free, 1)
564 WINPR_API
char* strndup(const
char* s,
size_t n);
577 WINPR_ATTR_MALLOC(free, 1)
578 WINPR_API WCHAR* wcsndup(const WCHAR* s,
size_t n);