302 lines
6.1 KiB
C
302 lines
6.1 KiB
C
|
||
#include <windows.h>
|
||
#include <stdlib.h>
|
||
|
||
#include "mplayer.h"
|
||
#include "unicode.h"
|
||
|
||
/* AnsiToUnicodeString
|
||
*
|
||
* Parameters:
|
||
*
|
||
* pAnsi - A valid source ANSI string.
|
||
*
|
||
* pUnicode - A pointer to a buffer large enough to accommodate
|
||
* the converted string.
|
||
*
|
||
* StringLength - The length of the source ANSI string
|
||
* excluding the null terminator. This value may be
|
||
* UNKNOWN_LENGTH (-1).
|
||
*
|
||
*
|
||
* Return:
|
||
*
|
||
* The return value from MultiByteToWideChar, the number of
|
||
* wide characters returned.
|
||
*
|
||
*
|
||
* andrewbe, 11 Jan 1993
|
||
*
|
||
* andrewbe, 01 Feb 1994: Added support for in-place conversion
|
||
*/
|
||
INT AnsiToUnicodeString( LPCSTR pAnsi, LPWSTR pUnicode, INT StringLength )
|
||
{
|
||
#ifdef IN_PLACE
|
||
/* #def'ed out, 'cos it turned out I didn't need it.
|
||
* It might be useful sometime, however.
|
||
* BUT NOTE: COMPLETELY UNTESTED
|
||
*/
|
||
LPWSTR pTemp
|
||
LPWSTR pSave;
|
||
#endif
|
||
INT rc;
|
||
|
||
if( !pAnsi )
|
||
{
|
||
DPF( "NULL pointer passed to AnsiToUnicodeString\n" );
|
||
return 0;
|
||
}
|
||
|
||
if( StringLength == UNKNOWN_LENGTH )
|
||
StringLength = strlen( pAnsi );
|
||
|
||
#ifdef IN_PLACE
|
||
/* Allow in-place conversion. We assume that the buffer is big enough.
|
||
* MultiByteToWideChar doesn't support this.
|
||
*/
|
||
if( pAnsi == (LPCSTR)pUnicode )
|
||
{
|
||
pTemp = AllocMem( StringLength * sizeof( WCHAR ) + sizeof( WCHAR ) );
|
||
|
||
if( !pTemp )
|
||
return 0;
|
||
|
||
pSave = pUnicode;
|
||
pUnicode = pTemp;
|
||
}
|
||
#endif
|
||
|
||
rc = MultiByteToWideChar( CP_ACP,
|
||
MB_PRECOMPOSED,
|
||
pAnsi,
|
||
StringLength + 1,
|
||
pUnicode,
|
||
StringLength + 1 );
|
||
|
||
#ifdef IN_PLACE
|
||
if( pAnsi == (LPCSTR)pUnicode )
|
||
{
|
||
pTemp = pUnicode;
|
||
pUnicode = pSave;
|
||
|
||
lstrcpyW( pUnicode, pTemp );
|
||
|
||
FreeMem( pTemp, StringLength * sizeof( WCHAR ) + sizeof( WCHAR ) );
|
||
}
|
||
#endif
|
||
|
||
return rc;
|
||
}
|
||
|
||
|
||
/* AllocateUnicodeString
|
||
*
|
||
* Parameter:
|
||
*
|
||
* pAnsi - A valid source ANSI string.
|
||
*
|
||
* Return:
|
||
*
|
||
* A Unicode copy of the supplied ANSI string.
|
||
* NULL if pAnsi is NULL or the allocation or conversion fails.
|
||
*
|
||
* andrewbe, 27 Jan 1994
|
||
*/
|
||
LPWSTR AllocateUnicodeString( LPCSTR pAnsi )
|
||
{
|
||
LPWSTR pUnicode;
|
||
INT Length;
|
||
|
||
if( !pAnsi )
|
||
{
|
||
DPF( "NULL pointer passed to AllocateUnicodeString\n" );
|
||
return NULL;
|
||
}
|
||
|
||
Length = strlen( pAnsi );
|
||
|
||
pUnicode = AllocMem( Length * sizeof( WCHAR ) + sizeof( WCHAR ) );
|
||
|
||
if( pUnicode )
|
||
{
|
||
if( 0 == AnsiToUnicodeString( pAnsi, pUnicode, Length ) )
|
||
{
|
||
FreeMem( pUnicode, Length * sizeof( WCHAR ) + sizeof( WCHAR ) );
|
||
pUnicode = NULL;
|
||
}
|
||
}
|
||
|
||
return pUnicode;
|
||
}
|
||
|
||
|
||
/* FreeUnicodeString
|
||
*
|
||
* Parameter:
|
||
*
|
||
* pString - A valid source Unicode string.
|
||
*
|
||
* Return:
|
||
*
|
||
* TRUE if the string was successfully freed, FALSE otherwise.
|
||
*
|
||
* andrewbe, 27 Jan 1994
|
||
*/
|
||
VOID FreeUnicodeString( LPWSTR pString )
|
||
{
|
||
if( !pString )
|
||
{
|
||
DPF( "NULL pointer passed to FreeUnicodeString\n" );
|
||
return;
|
||
}
|
||
|
||
FreeMem( pString, wcslen( pString ) * sizeof( WCHAR ) + sizeof( WCHAR ) );
|
||
}
|
||
|
||
|
||
|
||
/* UnicodeStringToNumber
|
||
*
|
||
* Parameter:
|
||
*
|
||
* pString - A valid source Unicode string.
|
||
*
|
||
* Return:
|
||
*
|
||
* The integer value represented by the string.
|
||
*
|
||
* andrewbe, 27 Jan 1994
|
||
*/
|
||
#define BUF_LEN 265
|
||
int UnicodeStringToNumber( LPCWSTR pString )
|
||
{
|
||
CHAR strAnsi[BUF_LEN];
|
||
|
||
#ifdef DEBUG
|
||
if( ( wcslen( pString ) + 1 ) > BUF_LEN )
|
||
{
|
||
DPF( "Buffer cannot accommodate string passed to UnicodeStringToNumber\n" );
|
||
}
|
||
#endif
|
||
|
||
WideCharToMultiByte( CP_ACP, 0, pString, -1, strAnsi,
|
||
sizeof strAnsi, NULL, NULL );
|
||
|
||
return atoi( strAnsi );
|
||
}
|
||
|
||
|
||
#ifndef UNICODE
|
||
|
||
|
||
/* UnicodeToAnsiString
|
||
*
|
||
* Parameters:
|
||
*
|
||
* pUnicode - A valid source Unicode string.
|
||
*
|
||
* pANSI - A pointer to a buffer large enough to accommodate
|
||
* the converted string.
|
||
*
|
||
* StringLength - The length of the source Unicode string.
|
||
* If 0 (NULL_TERMINATED), the string is assumed to be
|
||
* null-terminated.
|
||
*
|
||
* Return:
|
||
*
|
||
* The return value from WideCharToMultiByte, the number of
|
||
* multi-byte characters returned.
|
||
*
|
||
*
|
||
* andrewbe, 11 Jan 1993
|
||
*/
|
||
INT UnicodeToAnsiString( LPCWSTR pUnicode, LPSTR pAnsi, INT StringLength )
|
||
{
|
||
INT rc = 0;
|
||
|
||
if( StringLength == UNKNOWN_LENGTH )
|
||
StringLength = wcslen( pUnicode );
|
||
|
||
if( pAnsi )
|
||
{
|
||
rc = WideCharToMultiByte( CP_ACP,
|
||
0,
|
||
pUnicode,
|
||
StringLength + 1,
|
||
pAnsi,
|
||
StringLength + 1,
|
||
NULL,
|
||
NULL );
|
||
}
|
||
|
||
return rc;
|
||
|
||
}
|
||
|
||
|
||
/* AllocateAnsiString
|
||
*
|
||
* Parameter:
|
||
*
|
||
* pAnsi - A valid source Unicode string.
|
||
*
|
||
* Return:
|
||
*
|
||
* An ANSI copy of the supplied Unicode string.
|
||
* NULL if pUnicode is NULL or the allocation or conversion fails.
|
||
*
|
||
* andrewbe, 27 Jan 1994
|
||
*/
|
||
LPSTR AllocateAnsiString( LPCWSTR pUnicode )
|
||
{
|
||
LPSTR pAnsi;
|
||
INT Length;
|
||
|
||
if( !pUnicode )
|
||
{
|
||
DPF( "NULL pointer passed to AllocateUnicodeString\n" );
|
||
return NULL;
|
||
}
|
||
|
||
Length = wcslen( pUnicode );
|
||
|
||
pAnsi = AllocMem( Length * sizeof( CHAR ) + sizeof( CHAR ) );
|
||
|
||
if( pAnsi )
|
||
{
|
||
if( 0 == UnicodeToAnsiString( pUnicode, pAnsi, Length ) )
|
||
{
|
||
FreeMem( pAnsi, Length * sizeof( CHAR ) + sizeof( CHAR ) );
|
||
pAnsi = NULL;
|
||
}
|
||
}
|
||
|
||
return pAnsi;
|
||
}
|
||
|
||
|
||
/* FreeUnicodeString
|
||
*
|
||
* Parameter:
|
||
*
|
||
* pString - A valid source Unicode string.
|
||
*
|
||
* Return:
|
||
*
|
||
* TRUE if the string was successfully freed, FALSE otherwise.
|
||
*
|
||
* andrewbe, 27 Jan 1994
|
||
*/
|
||
VOID FreeAnsiString( LPSTR pString )
|
||
{
|
||
if( !pString )
|
||
{
|
||
DPF( "NULL pointer passed to FreeAnsiString\n" );
|
||
return;
|
||
}
|
||
|
||
FreeMem( pString, strlen( pString ) * sizeof( CHAR ) + sizeof( CHAR ) );
|
||
}
|
||
|
||
#endif /* NOT UNICODE */
|
||
|