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.
 
 
 
 
 
 

91 lines
3.1 KiB

/*--------------------------------------------------------------------
Copyright (c) Microsoft Corporation. All rights reserved.
--------------------------------------------------------------------*/
#include "windows.h"
#include "locresman.h"
#define SIZE_OF_TEMP_BUFFER 2048 // something reasonable.
int WINAPI LoadStringCodepage_A(HINSTANCE hInstance, // handle to module containing string resource
UINT uID, // resource identifier
char *lpBuffer, // pointer to buffer for resource
int nBufferMax, // size of buffer
UINT uCodepage // desired codepage
)
{
int iRetVal = 0;
WCHAR wzBuffer[SIZE_OF_TEMP_BUFFER];
WCHAR *pwchBuffer;
// use the buffer-on-stack if possible
if (nBufferMax > SIZE_OF_TEMP_BUFFER)
{
pwchBuffer = (WCHAR *) GlobalAlloc(GPTR, nBufferMax * sizeof(WCHAR));
if (NULL == pwchBuffer)
goto L_Return;
}
else
pwchBuffer = wzBuffer;
iRetVal = LoadStringW(hInstance, uID, pwchBuffer, nBufferMax);
if (0 == iRetVal)
goto L_Return;
iRetVal = WideCharToMultiByte(uCodepage, 0, pwchBuffer, iRetVal, lpBuffer, nBufferMax, NULL, NULL);
lpBuffer[iRetVal] = 0;
L_Return :;
if ((NULL != pwchBuffer) && (pwchBuffer != wzBuffer))
GlobalFree(pwchBuffer);
return (iRetVal);
}
HRESULT WINAPI HrConvertStringCodepageEx(UINT uCodepageSrc, char *pchSrc, int cchSrc,
UINT uUcodepageTgt, char *pchTgt, int cchTgtMax, int *pcchTgt,
void *pbScratchBuffer, int iSizeScratchBuffer,
char *pchDefaultChar, BOOL *pfUsedDefaultChar)
{
HRESULT hr = S_OK;
WCHAR *pbBuffer;
int cch;
pbBuffer = (WCHAR *) pbScratchBuffer;
if ((NULL == pbBuffer) || (iSizeScratchBuffer < (int) (cchSrc * sizeof(WCHAR))))
{
pbBuffer = GlobalAlloc(GPTR, (cchSrc + 1)* sizeof(WCHAR));
if (NULL == pbBuffer)
{
hr = E_OUTOFMEMORY;
goto L_Return;
}
ZeroMemory((PVOID)pbBuffer,(cchSrc + 1)* sizeof(WCHAR));
}
// convert to unicode using the source codepage
cch = MultiByteToWideChar(uCodepageSrc, 0, pchSrc, cchSrc, (WCHAR *)pbBuffer, cchSrc);
if (cch <= 0)
{
hr = E_FAIL;
goto L_Return;
}
*pcchTgt = cch = WideCharToMultiByte(uUcodepageTgt, 0, (WCHAR *) pbBuffer, cch, pchTgt, cchTgtMax, pchDefaultChar, pfUsedDefaultChar);
if (cch <= 0)
hr = E_FAIL;
L_Return :;
if ((NULL != pbBuffer) && (pbBuffer != pbScratchBuffer))
GlobalFree(pbBuffer);
return (hr);
}
HRESULT WINAPI HrConvertStringCodepage(UINT uCodepageSrc, char *pchSrc, int cchSrc,
UINT uUcodepageTgt, char *pchTgt, int cchTgtMax, int *pcchTgt,
void *pbScratchBuffer, int iSizeScratchBuffer)
{
return HrConvertStringCodepageEx(uCodepageSrc, pchSrc, cchSrc, uUcodepageTgt,
pchTgt, cchTgtMax, pcchTgt,
pbScratchBuffer, iSizeScratchBuffer,
NULL, NULL);
}