Leaked source code of windows server 2003
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.
 
 
 
 
 
 

109 lines
3.3 KiB

//
// xstring.cpp
//
// Unicode/ansi conversion.
//
#include "private.h"
#include "xstring.h"
//+------------------------------------------------------------------------
//
// Function: UnicodeToAnsi
//
// Synopsis: Converts unicode to mbcs. If the supplied ansi buffer
// is not large enough to accomodate the converted text a new
// buffer is allocated.
//
// uLenW -> the length in unicode chars of pchW, not including a '\0' if present.
// pchW is not assumed to be null terminated.
// uSizeA -> the size in ansi chars of the pchAIn array.
// Pass in uSizeA == 0 to force memory allocation.
// Use BufferAllocFree to free any allocated memory.
//
//-------------------------------------------------------------------------
char *UnicodeToAnsi(UINT uCodePage, const WCHAR *pchW, UINT uLenW, char *pchAIn, UINT uSizeA)
{
char *pchA;
UINT uLenA;
BOOL fUsedDefault;
Assert(uSizeA == 0 || (uSizeA && pchAIn));
uLenA = WideCharToMultiByte(uCodePage, 0, pchW, uLenW, NULL, 0, NULL, NULL);
pchA = (uLenA >= uSizeA) ? (char *)cicMemAlloc(uLenA + 1) : pchAIn;
if (pchA == NULL)
return NULL;
if ((!WideCharToMultiByte(uCodePage, 0, pchW, uLenW, pchA, uLenA, NULL, &fUsedDefault) && uLenW) ||
fUsedDefault)
{
BufferAllocFree(pchAIn, pchA);
pchA = NULL;
}
else
{
pchA[uLenA] = '\0';
}
return pchA;
}
//+------------------------------------------------------------------------
//
// Function: AnsiToUnicode
//
// Synopsis: Converts mbcs to unicode. If the supplied unicode buffer
// is not large enough to accomodate the converted text a new
// buffer is allocated.
//
// uLenA -> the length in ansi chars of pchA, not including a '\0' if present.
// pchA is not assumed to be null terminated.
// uSizeW -> the size in unicode chars of the pchWIn array.
// Pass in uSizeW == 0 to force memory allocation.
// Use BufferAllocFree to free any allocated memory.
//
// Copied from dimm.dll/util.cpp
//-------------------------------------------------------------------------
WCHAR *AnsiToUnicode(UINT uCodePage, const char *pchA, UINT uLenA, WCHAR *pchWIn, UINT uSizeW)
{
WCHAR *pchW;
UINT uLenW;
Assert(uSizeW == 0 || (uSizeW && pchWIn));
uLenW = MultiByteToWideChar(uCodePage, 0, pchA, uLenA, NULL, 0);
pchW = (uLenW >= uSizeW) ? (WCHAR *)cicMemAlloc((uLenW + 1) * sizeof(WCHAR)) : pchWIn;
if (pchW == NULL)
return NULL;
if (!MultiByteToWideChar(uCodePage, MB_ERR_INVALID_CHARS, pchA, uLenA, pchW, uLenW) && uLenA)
{
BufferAllocFree(pchWIn, pchW);
pchW = NULL;
}
else
{
pchW[uLenW] = '\0';
}
return pchW;
}
//+------------------------------------------------------------------------
//
// Function: BufferAllocFree
//
// Synopsis: Frees any memory allocated in a previous call to UnicodeToAnsi.
//
//-------------------------------------------------------------------------
void BufferAllocFree(void *pBuffer, void *pAllocMem)
{
if (pAllocMem && pAllocMem != pBuffer)
{
cicMemFree(pAllocMem);
}
}