windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/iisrtl/aucommon.cxx

104 lines
3.3 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1997 **/
/**********************************************************************/
/*
aucommon.cxx
Common routines for ANSI/UNICODE classes.
FILE HISTORY:
5/21/97 michth created
*/
#include "precomp.hxx"
#include "aucommon.hxx"
int
ConvertMultiByteToUnicode(LPSTR pszSrcAnsiString,
BUFFER *pbufDstUnicodeString,
DWORD dwStringLen)
{
DBG_ASSERT(pszSrcAnsiString != NULL);
int iStrLen = -1;
BOOL bTemp;
bTemp = pbufDstUnicodeString->Resize((dwStringLen + 1) * sizeof(WCHAR));
if (bTemp) {
iStrLen = MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
pszSrcAnsiString,
dwStringLen + 1,
(LPWSTR)pbufDstUnicodeString->QueryPtr(),
(int)pbufDstUnicodeString->QuerySize());
if (iStrLen == 0) {
DBG_ASSERT(GetLastError() != ERROR_INSUFFICIENT_BUFFER);
iStrLen = -1;
}
else {
//
// Don't count '\0'
//
iStrLen--;
}
}
return iStrLen;
}
int
ConvertUnicodeToMultiByte(LPWSTR pszSrcUnicodeString,
BUFFER *pbufDstAnsiString,
DWORD dwStringLen)
{
DBG_ASSERT(pszSrcUnicodeString != NULL);
BOOL bTemp;
int iStrLen = 0;
iStrLen = WideCharToMultiByte(CP_ACP,
0,
pszSrcUnicodeString,
dwStringLen + 1,
(LPSTR)pbufDstAnsiString->QueryPtr(),
(int)pbufDstAnsiString->QuerySize(),
NULL,
NULL);
if ((iStrLen == 0) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
iStrLen = WideCharToMultiByte(CP_ACP,
0,
pszSrcUnicodeString,
dwStringLen + 1,
NULL,
0,
NULL,
NULL);
if (iStrLen != 0) {
bTemp = pbufDstAnsiString->Resize(iStrLen);
if (!bTemp) {
iStrLen = 0;
}
else {
iStrLen = WideCharToMultiByte(CP_ACP,
0,
pszSrcUnicodeString,
dwStringLen + 1,
(LPSTR)pbufDstAnsiString->QueryPtr(),
(int)pbufDstAnsiString->QuerySize(),
NULL,
NULL);
}
}
}
//
// Don't count '\0'
// and convert 0 to -1 for errors
//
iStrLen--;
return iStrLen;
}