Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

313 lines
5.9 KiB

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: sconv.cxx
//
// Contents: Ansi to Unicode conversions
//
// History: KrishnaG Jan 22 1996
//----------------------------------------------------------------------------
#include "ldapc.hxx"
#pragma hdrstop
#define NULL_TERMINATED 0
int
AnsiToUnicodeString(
LPSTR pAnsi,
LPWSTR pUnicode,
DWORD StringLength
)
{
int iReturn;
if( StringLength == NULL_TERMINATED )
StringLength = strlen( pAnsi );
iReturn = MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
pAnsi,
StringLength + 1,
pUnicode,
StringLength + 1 );
//
// Ensure NULL termination.
//
pUnicode[StringLength] = 0;
return iReturn;
}
int
UnicodeToAnsiString(
LPWSTR pUnicode,
LPSTR pAnsi,
DWORD StringLength
)
{
LPSTR pTempBuf = NULL;
INT rc = 0;
if( StringLength == NULL_TERMINATED ) {
//
// StringLength is just the
// number of characters in the string
//
StringLength = wcslen( pUnicode );
}
//
// WideCharToMultiByte doesn't NULL terminate if we're copying
// just part of the string, so terminate here.
//
pUnicode[StringLength] = 0;
//
// Include one for the NULL
//
StringLength++;
//
// Unfortunately, WideCharToMultiByte doesn't do conversion in place,
// so allocate a temporary buffer, which we can then copy:
//
if( pAnsi == (LPSTR)pUnicode )
{
pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength );
pAnsi = pTempBuf;
}
if( pAnsi )
{
rc = WideCharToMultiByte( CP_ACP,
0,
pUnicode,
StringLength,
pAnsi,
StringLength,
NULL,
NULL );
}
/* If pTempBuf is non-null, we must copy the resulting string
* so that it looks as if we did it in place:
*/
if( pTempBuf && ( rc > 0 ) )
{
pAnsi = (LPSTR)pUnicode;
strcpy( pAnsi, pTempBuf );
LocalFree( pTempBuf );
}
return rc;
}
LPWSTR
AllocateUnicodeString(
LPSTR pAnsiString
)
{
LPWSTR pUnicodeString = NULL;
if (!pAnsiString)
return NULL;
pUnicodeString = (LPWSTR)LocalAlloc(
LPTR,
strlen(pAnsiString)*sizeof(WCHAR) +sizeof(WCHAR)
);
if (pUnicodeString) {
AnsiToUnicodeString(
pAnsiString,
pUnicodeString,
NULL_TERMINATED
);
}
return pUnicodeString;
}
void
FreeUnicodeString(
LPWSTR pUnicodeString
)
{
if (!pUnicodeString)
return;
LocalFree(pUnicodeString);
return;
}
DWORD
ComputeMaxStrlenW(
LPWSTR pString,
DWORD cchBufMax
)
{
DWORD cchLen;
//
// Include space for the NULL.
//
cchBufMax--;
cchLen = wcslen(pString);
if (cchLen > cchBufMax)
return cchBufMax;
return cchLen;
}
DWORD
ComputeMaxStrlenA(
LPSTR pString,
DWORD cchBufMax
)
{
DWORD cchLen;
//
// Include space for the NULL.
//
cchBufMax--;
cchLen = lstrlenA(pString);
if (cchLen > cchBufMax)
return cchBufMax;
return cchLen;
}
HRESULT
UnicodeToUTF8String(
LPCWSTR pUnicode,
LPSTR *ppUTF8
)
{
HRESULT hr = S_OK;
int UnicodeLength = 0;
LPSTR pUTF8Temp = NULL;
int UTF8TempLength = 0;
LPSTR pUTF8 = NULL;
int UTF8Length = 0;
if (!pUnicode || !ppUTF8)
BAIL_ON_FAILURE(hr = E_INVALIDARG)
UnicodeLength = wcslen(pUnicode);
UTF8TempLength = (UnicodeLength+1) * 4;
pUTF8Temp = (char*) AllocADsMem(UTF8TempLength);
if (!pUTF8Temp)
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
UTF8Length = LdapUnicodeToUTF8(pUnicode,
UnicodeLength+1,
pUTF8Temp,
UTF8TempLength);
if (UTF8Length == 0)
BAIL_ON_FAILURE(hr = E_FAIL);
pUTF8 = (char*) AllocADsMem(UTF8Length);
if (!pUTF8)
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
memcpy(pUTF8, pUTF8Temp, UTF8Length);
*ppUTF8 = pUTF8;
FreeADsMem(pUTF8Temp);
return(hr);
error:
if (pUTF8)
FreeADsMem(pUTF8);
if (pUTF8Temp)
FreeADsMem(pUTF8Temp);
return (hr);
}
HRESULT
UTF8ToUnicodeString(
LPCSTR pUTF8,
LPWSTR *ppUnicode
)
{
HRESULT hr = S_OK;
int UTF8Length = 0;
LPWSTR pUnicodeTemp = NULL;
int UnicodeTempLength = 0;
LPWSTR pUnicode = NULL;
int UnicodeLength = 0;
if (!pUTF8 || !ppUnicode)
BAIL_ON_FAILURE(hr = E_INVALIDARG)
UTF8Length = strlen(pUTF8);
UnicodeTempLength = (UTF8Length+1) * 4;
pUnicodeTemp = (PWCHAR) AllocADsMem(UnicodeTempLength);
if (!pUnicodeTemp)
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
UnicodeLength = LdapUTF8ToUnicode(pUTF8,
UTF8Length+1,
pUnicodeTemp,
UnicodeTempLength);
if (UnicodeLength == 0)
BAIL_ON_FAILURE(hr = E_FAIL);
pUnicode = (PWCHAR) AllocADsMem(UnicodeLength);
if (!pUnicode)
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
memcpy(pUnicode, pUnicodeTemp, UnicodeLength);
*ppUnicode = pUnicode;
FreeADsMem(pUnicodeTemp);
return(hr);
error:
if (pUnicode)
FreeADsMem(pUnicode);
if (pUnicodeTemp)
FreeADsMem(pUnicodeTemp);
return (hr);
}