126 lines
2.8 KiB
C++
126 lines
2.8 KiB
C++
|
//
|
||
|
// Copyright (c) 1997-1999 Microsoft Corporation.
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "eudcedit.h"
|
||
|
#ifdef BUILD_ON_WINNT
|
||
|
#include "extfunc.h"
|
||
|
#endif // BUILD_ON_WINNT
|
||
|
#pragma pack(2)
|
||
|
|
||
|
|
||
|
#define SEGMAX 256
|
||
|
#define EUDCCODEBASE ((unsigned short)0xe000)
|
||
|
|
||
|
|
||
|
static int init = 0;
|
||
|
static unsigned short segStart[SEGMAX];
|
||
|
static unsigned short segEnd[SEGMAX];
|
||
|
static unsigned short segUni[SEGMAX];
|
||
|
static int segCnt = 0;
|
||
|
static int recCnt = 0;
|
||
|
static void
|
||
|
setseg( unsigned short segH, unsigned short segLS, unsigned short segLE)
|
||
|
{
|
||
|
unsigned short cCnt;
|
||
|
|
||
|
if ( segCnt >= SEGMAX)
|
||
|
return;
|
||
|
cCnt = segLE - segLS + 1;
|
||
|
segStart[segCnt] = (segH<<8)+segLS;
|
||
|
segEnd[segCnt] = (segH<<8)+segLE;
|
||
|
segUni[segCnt] = EUDCCODEBASE +recCnt;
|
||
|
recCnt += cCnt;
|
||
|
segCnt++;
|
||
|
}
|
||
|
void
|
||
|
makeUniCodeTbl ( )
|
||
|
{
|
||
|
int base;
|
||
|
unsigned short slow, elow;
|
||
|
int n;
|
||
|
int nlow;
|
||
|
unsigned short high;
|
||
|
COUNTRYINFO *cInfo;
|
||
|
|
||
|
//we don't need an unicode table if we only have unicode
|
||
|
if (CountryInfo.bOnlyUnicode)
|
||
|
return;
|
||
|
|
||
|
if ( init) return ;
|
||
|
cInfo = &CountryInfo;
|
||
|
base = 0;
|
||
|
segCnt = recCnt = 0;
|
||
|
for ( n=0; n < cInfo->nRange - 1; n++) {
|
||
|
|
||
|
#ifdef BUILD_ON_WINNT
|
||
|
/* CHS needs to dynamically calculate trailbyte range for each
|
||
|
* EUDC select range.
|
||
|
*/
|
||
|
if (cInfo->LangID == EUDC_CHS)
|
||
|
CorrectTrailByteRange(n);
|
||
|
#endif // BUILD_ON_WINNT
|
||
|
|
||
|
for ( high = cInfo->sLeadByte[n]; high <=cInfo->eLeadByte[n];
|
||
|
high++){
|
||
|
if ( high == cInfo->sLeadByte[n])
|
||
|
slow = cInfo->sRange[n] & 0xff;
|
||
|
else
|
||
|
slow = cInfo->sTralByte[0];
|
||
|
if ( high ==cInfo->eLeadByte[n])
|
||
|
elow = cInfo->eRange[n] & 0xff;
|
||
|
else
|
||
|
elow = cInfo->eTralByte[cInfo->nTralByte-1];
|
||
|
|
||
|
for ( nlow = 0; nlow < cInfo->nTralByte; nlow++) {
|
||
|
if ( slow >= cInfo->sTralByte[nlow]
|
||
|
&& slow <= cInfo->eTralByte[nlow]) {
|
||
|
if ( elow <= cInfo->eTralByte[nlow] )
|
||
|
setseg( high, slow, elow);
|
||
|
else
|
||
|
setseg( high, slow, cInfo->eTralByte[nlow]);
|
||
|
}
|
||
|
else if ( slow < cInfo->sTralByte[nlow]
|
||
|
&& elow >= cInfo->sTralByte[nlow]) {
|
||
|
if ( elow <= cInfo->eTralByte[nlow] )
|
||
|
setseg( high, cInfo->sTralByte[nlow], elow);
|
||
|
else
|
||
|
setseg( high, cInfo->sTralByte[nlow],
|
||
|
cInfo->sTralByte[nlow]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
init = 1;
|
||
|
}
|
||
|
unsigned short
|
||
|
sjisToUniEUDC( unsigned short code)
|
||
|
{
|
||
|
int seg;
|
||
|
unsigned short ofs;
|
||
|
|
||
|
for ( seg = 0; seg < segCnt; seg++) {
|
||
|
if ( code <= segEnd[seg]) {
|
||
|
if ( segStart[seg] <= code) {
|
||
|
ofs = code - segStart[seg];
|
||
|
return segUni[seg]+ofs;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return (unsigned short)0xffff;
|
||
|
}
|
||
|
unsigned short
|
||
|
getMaxUniCode( )
|
||
|
{
|
||
|
USHORT ansiMax;
|
||
|
if (CountryInfo.bOnlyUnicode)
|
||
|
ansiMax = 0;
|
||
|
else
|
||
|
ansiMax = segUni[segCnt-1] + (segEnd[segCnt-1] - segStart[segCnt-1]);
|
||
|
return max(ansiMax, CountryInfo.eRange[CountryInfo.nRange-1]);
|
||
|
}
|
||
|
|
||
|
|
||
|
/* EOF */
|