windows-nt/Source/XPSP1/NT/com/rpc/midl/front/mbcs.cxx
2020-09-26 16:20:57 +08:00

156 lines
4.1 KiB
C++

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Copyright (c) 1995-1999 Microsoft Corporation
Module Name:
mbcs.cxx
Abstract:
MBCS support related code used by the lexer.
Notes:
History:
RyszardK Sep-1996 Created.
----------------------------------------------------------------------------*/
#pragma warning ( disable : 4514 )
#include <windows.h>
#include <stdlib.h>
#include "mbcs.hxx"
CharacterSet CurrentCharSet;
int
CharacterSet::DBCSDefaultToCaseSensitive()
{
// these languages do not distinguish cases
return (
PRIMARYLANGID(LANGIDFROMLCID(CurrentLCID)) == LANG_JAPANESE ||
PRIMARYLANGID(LANGIDFROMLCID(CurrentLCID)) == LANG_CHINESE ||
PRIMARYLANGID(LANGIDFROMLCID(CurrentLCID)) == LANG_KOREAN
);
}
CharacterSet::CharacterSet()
{
memset( DbcsLeadByteTable, 0, 128 );
SetDbcsLeadByteTable( GetSystemDefaultLCID() );
}
CharacterSet::DBCS_ERRORS
CharacterSet::SetDbcsLeadByteTable(
unsigned long ulLocale )
{
DBCS_ERRORS dbcsRet = dbcs_Failure;
if (CurrentLCID != ulLocale)
{
dbcsRet = dbcs_Success;
char szCodePage[6];
if ( GetLocaleInfo( ulLocale,
LOCALE_NOUSEROVERRIDE | LOCALE_IDEFAULTANSICODEPAGE,
szCodePage,
sizeof(szCodePage) ) )
{
unsigned int CodePage = atoi( szCodePage );
for (int i = 128; i < 256; i++ )
{
DbcsLeadByteTable[i] = (char) IsDBCSLeadByteEx( CodePage,
(char) i );
}
}
else
{
unsigned char i = 0;
switch (PRIMARYLANGID(ulLocale))
{
case LANG_CHINESE:
if (SUBLANGID(ulLocale) == SUBLANG_CHINESE_SIMPLIFIED)
{
for (i=0xA1; i <= 0xFE; i++)
{
DbcsLeadByteTable[i] = 1;
}
}
break;
case LANG_KOREAN:
for (i = 0x81; i <= 0xFE; i++)
{
DbcsLeadByteTable[i] = 1;
}
break;
case LANG_JAPANESE:
for (i = 0x81; i <= 0x9F; i++)
{
DbcsLeadByteTable[i] = 1;
}
for (i = 0xE0; i <= 0xFC; i++)
{
DbcsLeadByteTable[i] = 1;
}
break;
default:
dbcsRet = dbcs_BadLCID;
break;
}
}
}
else
{
dbcsRet = dbcs_Success;
}
if (CurrentLCID != (unsigned long)-1 &&
CurrentLCID != ulLocale &&
ulLocale != 0)
{
dbcsRet = dbcs_LCIDConflict;
}
CurrentLCID = ulLocale;
return dbcsRet;
}
int
CharacterSet::CompareDBCSString(
char* szLHStr,
char* szRHStr,
unsigned long ulFlags
)
{
int nRet = CompareStringA( CurrentLCID,
NORM_IGNOREWIDTH | NORM_IGNOREKANATYPE | ulFlags,
szLHStr,
-1,
szRHStr,
-1) - 2;
if (nRet == -2)
{
nRet = strcmp(szLHStr, szRHStr);
}
return nRet;
}
unsigned int
GetConsoleMaxLineCount()
{
CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
HANDLE hOutput = GetStdHandle( STD_OUTPUT_HANDLE );
ZeroMemory( &ConsoleInfo, sizeof( ConsoleInfo ) );
BOOL fResult = GetConsoleScreenBufferInfo( hOutput, &ConsoleInfo );
if ( fResult )
{
return ConsoleInfo.srWindow.Bottom - 1;
}
else
{
return 23;
}
}