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
51 WINPR_API
char* winpr_strnstr(
char* haystack,
const char* needle,
size_t hlen);
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);
63 WINPR_API BOOL winpr_str_is_valid_url(const
char* str);
73 WINPR_API BOOL winpr_str_is_valid_urlN(const
char* str,
size_t len);
82 WINPR_API BOOL winpr_str_has_newlines(const
char* str);
84 WINPR_API BOOL winpr_str_append(const
char* what,
char* buffer,
size_t size,
85 const
char* separator);
87 WINPR_API
int winpr_asprintf(
char** s,
size_t* slen, const
char* templ, ...);
89 WINPR_API
int winpr_vasprintf(
char** s,
size_t* slen, const
char* templ, va_list ap);
93#define CSTR_LESS_THAN 1
95#define CSTR_GREATER_THAN 3
100#define CP_THREAD_ACP 3
105#define MB_PRECOMPOSED 0x00000001
106#define MB_COMPOSITE 0x00000002
107#define MB_USEGLYPHCHARS 0x00000004
108#define MB_ERR_INVALID_CHARS 0x00000008
110 WINPR_ATTR_MALLOC(free, 1)
111 WINPR_API
char* _strdup(const
char* strSource);
113 WINPR_ATTR_MALLOC(free, 1)
114 WINPR_API WCHAR* _wcsdup(const WCHAR* strSource);
117 WINPR_API
int _stricmp(const
char* string1, const
char* string2);
120 WINPR_API
int _strnicmp(const
char* string1, const
char* string2,
size_t count);
123 WINPR_API
int _wcscmp(const WCHAR* string1, const WCHAR* string2);
126 WINPR_API
int _wcsncmp(const WCHAR* string1, const WCHAR* string2,
size_t count);
129 WINPR_API
size_t _wcslen(const WCHAR* str);
132 WINPR_API
size_t _wcsnlen(const WCHAR* str,
size_t maxNumberOfElements);
135 WINPR_API WCHAR* _wcsstr(const WCHAR* str, const WCHAR* strSearch);
138 WINPR_API WCHAR* _wcschr(const WCHAR* str, WCHAR c);
141 WINPR_API WCHAR* _wcsrchr(const WCHAR* str, WCHAR c);
144 WINPR_API
char* strtok_s(
char* strToken, const
char* strDelimit,
char** context);
147 WINPR_API WCHAR* wcstok_s(WCHAR* strToken, const WCHAR* strDelimit, WCHAR** context);
149 WINPR_API WCHAR* _wcsncat(WCHAR* dst, const WCHAR* src,
size_t sz);
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
164#if !defined(_WIN32) || defined(_UWP)
166 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
167 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
170#define CharUpper CharUpperW
172#define CharUpper CharUpperA
175 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
176 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
179#define CharUpperBuff CharUpperBuffW
181#define CharUpperBuff CharUpperBuffA
184 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
185 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
188#define CharLower CharLowerW
190#define CharLower CharLowerA
193 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
194 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
197#define CharLowerBuff CharLowerBuffW
199#define CharLowerBuff CharLowerBuffA
203 WINPR_API BOOL IsCharAlphaA(CHAR ch);
205 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
208#define IsCharAlpha IsCharAlphaW
210#define IsCharAlpha IsCharAlphaA
214 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
216 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
219#define IsCharAlphaNumeric IsCharAlphaNumericW
221#define IsCharAlphaNumeric IsCharAlphaNumericA
225 WINPR_API BOOL IsCharUpperA(CHAR ch);
227 WINPR_API BOOL IsCharUpperW(WCHAR ch);
230#define IsCharUpper IsCharUpperW
232#define IsCharUpper IsCharUpperA
236 WINPR_API BOOL IsCharLowerA(CHAR ch);
238 WINPR_API BOOL IsCharLowerW(WCHAR ch);
241#define IsCharLower IsCharLowerW
243#define IsCharLower IsCharLowerA
250#define sprintf_s snprintf
251#define _snprintf snprintf
252#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
254#define _scprintf(...) snprintf(nullptr, 0, __VA_ARGS__)
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));
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));
289 WINPR_API SSIZE_T ConvertWCharToUtf8(
const WCHAR* wstr,
char* str,
size_t len);
308 WINPR_API SSIZE_T ConvertWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
328 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
345 WINPR_API SSIZE_T ConvertUtf8ToWChar(
const char* str, WCHAR* wstr,
size_t wlen);
364 WINPR_API SSIZE_T ConvertUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
384 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
396 WINPR_ATTR_MALLOC(free, 1)
397 WINPR_API
char* ConvertWCharToUtf8Alloc(const WCHAR* wstr,
size_t* pUtfCharLength);
411 WINPR_ATTR_MALLOC(free, 1)
412 WINPR_API
char* ConvertWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
413 size_t* pUtfCharLength);
427 WINPR_ATTR_MALLOC(free, 1)
428 WINPR_API
char* ConvertMszWCharNToUtf8Alloc(const WCHAR* wstr,
size_t wlen,
429 size_t* pUtfCharLength);
441 WINPR_ATTR_MALLOC(free, 1)
442 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(const
char* str,
size_t* pSize);
456 WINPR_ATTR_MALLOC(free, 1)
457 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
471 WINPR_ATTR_MALLOC(free, 1)
472 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(const
char* str,
size_t len,
size_t* pSize);
482 WINPR_API const WCHAR* InitializeConstWCharFromUtf8(const
char* str, WCHAR* buffer,
size_t len);
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));
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));
498 WINPR_API
const WCHAR* ByteSwapUnicode(WCHAR* wstr,
size_t length);
501 WINPR_API
size_t ConvertLineEndingToLF(
char* str,
size_t size);
504 WINPR_API
char* ConvertLineEndingToCRLF(
const char* str,
size_t* size);
507 WINPR_API
char* StrSep(
char** stringp,
const char* delim);
510 WINPR_API INT64 GetLine(
char** lineptr,
size_t* size, FILE* stream);
512#if !defined(WINPR_HAVE_STRNDUP)
513 WINPR_ATTR_MALLOC(free, 1)
514 WINPR_API
char* strndup(const
char* s,
size_t n);
527 WINPR_ATTR_MALLOC(free, 1)
528 WINPR_API WCHAR* wcsndup(const WCHAR* s,
size_t n);