/*--------------------------------------------------------------------
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);
}