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
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);
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, ...);
47 WINPR_API
int winpr_vasprintf(
char** s,
size_t* slen,
const char* templ, va_list ap);
51#define CSTR_LESS_THAN 1
53#define CSTR_GREATER_THAN 3
58#define CP_THREAD_ACP 3
63#define MB_PRECOMPOSED 0x00000001
64#define MB_COMPOSITE 0x00000002
65#define MB_USEGLYPHCHARS 0x00000004
66#define MB_ERR_INVALID_CHARS 0x00000008
68 WINPR_API
char* _strdup(
const char* strSource);
69 WINPR_API WCHAR* _wcsdup(
const WCHAR* strSource);
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);
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);
77 WINPR_API
size_t _wcslen(
const WCHAR* str);
78 WINPR_API
size_t _wcsnlen(
const WCHAR* str,
size_t maxNumberOfElements);
80 WINPR_API WCHAR* _wcsstr(
const WCHAR* str,
const WCHAR* strSearch);
82 WINPR_API WCHAR* _wcschr(
const WCHAR* str, WCHAR c);
83 WINPR_API WCHAR* _wcsrchr(
const WCHAR* str, WCHAR c);
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);
88 WINPR_API WCHAR* _wcsncat(WCHAR* dst,
const WCHAR* src,
size_t sz);
93#define _wcsncmp wcsncmp
95#define _wcsnlen wcsnlen
98#define _wcsrchr wcsrchr
99#define _wcsncat wcsncat
103#if !defined(_WIN32) || defined(_UWP)
105 WINPR_API LPSTR CharUpperA(LPSTR lpsz);
106 WINPR_API LPWSTR CharUpperW(LPWSTR lpsz);
109#define CharUpper CharUpperW
111#define CharUpper CharUpperA
114 WINPR_API DWORD CharUpperBuffA(LPSTR lpsz, DWORD cchLength);
115 WINPR_API DWORD CharUpperBuffW(LPWSTR lpsz, DWORD cchLength);
118#define CharUpperBuff CharUpperBuffW
120#define CharUpperBuff CharUpperBuffA
123 WINPR_API LPSTR CharLowerA(LPSTR lpsz);
124 WINPR_API LPWSTR CharLowerW(LPWSTR lpsz);
127#define CharLower CharLowerW
129#define CharLower CharLowerA
132 WINPR_API DWORD CharLowerBuffA(LPSTR lpsz, DWORD cchLength);
133 WINPR_API DWORD CharLowerBuffW(LPWSTR lpsz, DWORD cchLength);
136#define CharLowerBuff CharLowerBuffW
138#define CharLowerBuff CharLowerBuffA
141 WINPR_API BOOL IsCharAlphaA(CHAR ch);
142 WINPR_API BOOL IsCharAlphaW(WCHAR ch);
145#define IsCharAlpha IsCharAlphaW
147#define IsCharAlpha IsCharAlphaA
150 WINPR_API BOOL IsCharAlphaNumericA(CHAR ch);
151 WINPR_API BOOL IsCharAlphaNumericW(WCHAR ch);
154#define IsCharAlphaNumeric IsCharAlphaNumericW
156#define IsCharAlphaNumeric IsCharAlphaNumericA
159 WINPR_API BOOL IsCharUpperA(CHAR ch);
160 WINPR_API BOOL IsCharUpperW(WCHAR ch);
163#define IsCharUpper IsCharUpperW
165#define IsCharUpper IsCharUpperA
168 WINPR_API BOOL IsCharLowerA(CHAR ch);
169 WINPR_API BOOL IsCharLowerW(WCHAR ch);
172#define IsCharLower IsCharLowerW
174#define IsCharLower IsCharLowerA
181#define sprintf_s snprintf
182#define _snprintf snprintf
183#define _scprintf(...) snprintf(NULL, 0, __VA_ARGS__)
185#define _scprintf(...) snprintf(NULL, 0, __VA_ARGS__)
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));
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));
221 WINPR_API SSIZE_T ConvertWCharToUtf8(
const WCHAR* wstr,
char* str,
size_t len);
240 WINPR_API SSIZE_T ConvertWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
260 WINPR_API SSIZE_T ConvertMszWCharNToUtf8(
const WCHAR* wstr,
size_t wlen,
char* str,
size_t len);
277 WINPR_API SSIZE_T ConvertUtf8ToWChar(
const char* str, WCHAR* wstr,
size_t wlen);
296 WINPR_API SSIZE_T ConvertUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
316 WINPR_API SSIZE_T ConvertMszUtf8NToWChar(
const char* str,
size_t len, WCHAR* wstr,
size_t wlen);
328 WINPR_API
char* ConvertWCharToUtf8Alloc(
const WCHAR* wstr,
size_t* pUtfCharLength);
342 WINPR_API
char* ConvertWCharNToUtf8Alloc(
const WCHAR* wstr,
size_t wlen,
343 size_t* pUtfCharLength);
357 WINPR_API
char* ConvertMszWCharNToUtf8Alloc(
const WCHAR* wstr,
size_t wlen,
358 size_t* pUtfCharLength);
370 WINPR_API WCHAR* ConvertUtf8ToWCharAlloc(
const char* str,
size_t* pSize);
384 WINPR_API WCHAR* ConvertUtf8NToWCharAlloc(
const char* str,
size_t len,
size_t* pSize);
398 WINPR_API WCHAR* ConvertMszUtf8NToWCharAlloc(
const char* str,
size_t len,
size_t* pSize);
408 WINPR_API
const WCHAR* InitializeConstWCharFromUtf8(
const char* str, WCHAR* buffer,
size_t len);
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));
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));
424 WINPR_API
const WCHAR* ByteSwapUnicode(WCHAR* wstr,
size_t length);
426 WINPR_API
size_t ConvertLineEndingToLF(
char* str,
size_t size);
427 WINPR_API
char* ConvertLineEndingToCRLF(
const char* str,
size_t* size);
429 WINPR_API
char* StrSep(
char** stringp,
const char* delim);
431 WINPR_API INT64 GetLine(
char** lineptr,
size_t* size, FILE* stream);
433#if !defined(WINPR_HAVE_STRNDUP)
434 WINPR_ATTR_MALLOC(free, 1)
435 WINPR_API
char* strndup(const
char* s,
size_t n);
448 WINPR_ATTR_MALLOC(free, 1)
449 WINPR_API WCHAR* wcsndup(const WCHAR* s,
size_t n);