/**************************************************/ /* */ /* */ /* Setting code range */ /* */ /* */ /* Copyright (c) 1997-1999 Microsoft Corporation. */ /**************************************************/ #include "stdafx.h" #include "eudcedit.h" #include "registry.h" #ifdef BUILD_ON_WINNT #include "extfunc.h" #endif // BUILD_ON_WINNT #include "util.h" #define S_UNICODE 0xE000 #define E_UNICODE 0xE0ff BOOL SetCountryInfo( UINT LocalCP); int SetLeadByteRange(TCHAR * CodeRange,int nCode); void SetTrailByteRange(); #ifdef BUILD_ON_WINNT void CorrectTrailByteRange(int nIndex); #endif // BUILD_ON_WINNT /****************************************/ /* */ /* Set Country Infomation */ /* */ /****************************************/ BOOL SetCountryInfo( UINT LocalCP) { TCHAR CodePage[10], szUnicode[] = TEXT("Unicode"); TCHAR Coderange[50]; int nCode = 0; SetTrailByteRange(LocalCP); if (!CountryInfo.bOnlyUnicode){ /* Read EUDC Coderange from Registry */ #ifndef NEWREG /* Old Version */ TCHAR CodeTmp[10]; wsprintf( CodeTmp, TEXT("%d"), LocalCP); if( lstrlen( CodeTmp) == 3){ lstrcpy(CodePage, TEXT("CP00")); }else{ lstrcpy(CodePage, TEXT("CP0")); } lstrcat(CodePage, CodeTmp); #else /* New Version */ wsprintf( CodePage, TEXT("%d"), LocalCP); #endif if( !InqCodeRange(CodePage, (BYTE *)Coderange, 50)) return FALSE; if ((nCode = SetLeadByteRange ( Coderange, 0)) == -1) return FALSE; } //!CountryInfo.bOnlyUnicode #ifdef UNICODE // unicode range will always be the last one. lstrcpy(CodePage, szUnicode); if( !InqCodeRange(CodePage, (BYTE *)Coderange, 50)) return FALSE; if (SetLeadByteRange (Coderange, nCode) == -1) return FALSE; #else // // Ansi version, we have to set end Unicode // code point to the last ansi range. // WCHAR RangeTmp[2]; CHAR AnsiRange[2]; CountryInfo.nRange = nCode+1; CountryInfo.nLeadByte = nCode+1; CountryInfo.sRange[nCode] = S_UNICODE; AnsiRange[0] = HIBYTE(CountryInfo.eRange[nCode-1]); AnsiRange[1] = LOBYTE(CountryInfo.eRange[nCode-1]); MultiByteToWideChar(CP_ACP, 0, AnsiRange,2,RangeTmp, 1); CountryInfo.eRange[nCode] = RangeTmp[0]; CountryInfo.sLeadByte[nCode] = HIBYTE(CountryInfo.sRange[nCode]); CountryInfo.eLeadByte[nCode] = HIBYTE(CountryInfo.eRange[nCode]); #endif return TRUE; } void SetTrailByteRange( UINT LocalCP) { WORD UCode[MAX_CODE]; BYTE SCode[MAX_CODE], sTral, cTral; int nTral = 0; if (!CountryInfo.bUnicodeMode){ // calculate trailbyte range. UCode[0] = S_UNICODE; UCode[1] = '\0'; WideCharToMultiByte( LocalCP, 0L, (const unsigned short *)UCode, -1, (char *)SCode, sizeof(SCode), NULL, NULL); sTral = cTral = SCode[1]; CountryInfo.sTralByte[nTral] = sTral; for( WORD Cnt = S_UNICODE + 1; Cnt <= E_UNICODE; Cnt++){ UCode[0] = Cnt; UCode[1] = '\0'; WideCharToMultiByte( LocalCP, 0L, (const unsigned short *)UCode, -1, (char *)SCode, sizeof(SCode), NULL, NULL); if( cTral + 1 != SCode[1]){ CountryInfo.eTralByte[nTral] = cTral; nTral++; if( sTral != SCode[1]){ CountryInfo.sTralByte[nTral] = SCode[1]; } } cTral = SCode[1]; if( sTral == cTral) break; } CountryInfo.nTralByte = nTral; /* For Extend Wansung (test) */ if( CountryInfo.LangID == EUDC_KRW){ CountryInfo.nTralByte = 3; CountryInfo.sTralByte[0] = 0x41; CountryInfo.eTralByte[0] = 0x5a; CountryInfo.sTralByte[1] = 0x61; CountryInfo.eTralByte[1] = 0x7a; CountryInfo.sTralByte[2] = 0x81; CountryInfo.eTralByte[2] = 0xfe; } /* For CHS we have to remember the original trail byte range and calculate trail byte range dynamically */ if( CountryInfo.LangID == EUDC_CHS){ CountryInfo.nOrigTralByte = 2; CountryInfo.sOrigTralByte[0] = 0x40; CountryInfo.eOrigTralByte[0] = 0x7e; CountryInfo.sOrigTralByte[1] = 0x80; CountryInfo.eOrigTralByte[1] = 0xfe; //To start with, calculate trailbyte range for the default EUDC selection range. CorrectTrailByteRange(0); }else{ CountryInfo.nOrigTralByte = 0; } }else { //!CountryInfo.bUnicodeMode CountryInfo.nTralByte = 1; CountryInfo.sTralByte[0] = 0x00; CountryInfo.eTralByte[0] = 0xff; } //!CountryInfo.bUnicodeMode } int SetLeadByteRange( TCHAR * Coderange, int nCode) { // Calculate LeadByte Range TCHAR *pStr1, *pStr2; WORD wLow, wHigh; pStr1 = pStr2 = Coderange; while(1){ if(( pStr2 = Mytcschr( pStr1, '-')) != NULL){ *pStr2 = '\0'; wLow = (WORD)Mytcstol( pStr1, (TCHAR **)0, 16); CountryInfo.sRange[nCode] = wLow; CountryInfo.sLeadByte[nCode] = HIBYTE( wLow); pStr2++; pStr1 = pStr2; }else return -1; if(( pStr2 = Mytcschr( pStr1, ',')) != NULL){ *pStr2 = '\0'; wHigh = (WORD)Mytcstol( pStr1, (TCHAR **)0, 16); CountryInfo.eRange[nCode] = (unsigned short)wHigh; CountryInfo.eLeadByte[nCode] = HIBYTE( wHigh); pStr2++; pStr1 = pStr2; }else{ wHigh = (WORD)Mytcstol( pStr1, (TCHAR **)0, 16); CountryInfo.eRange[nCode] = (unsigned short)wHigh; CountryInfo.eLeadByte[nCode] = HIBYTE( wHigh); break; } nCode++; } CountryInfo.nLeadByte = ++nCode; CountryInfo.nRange = nCode; return nCode; } #ifdef BUILD_ON_WINNT /**************************************************************************\ * CorrectTralByteRange * * Correct trailbyte range of EUDC range with each of original trail byte * * ranges. It is used by countries where EUDC trail byte range changes * * with selection of different EUDC range, for example CHS. * \**************************************************************************/ void CorrectTrailByteRange( int nIndex) { COUNTRYINFO *Info; int i, Unique=0; if (CountryInfo.bUnicodeMode) return; Info=&CountryInfo; for (i=0; i< Info->nOrigTralByte; i++){ //take the smaller of the two ranges. Info->sTralByte[Unique] = max(LOBYTE(Info->sRange[nIndex]), Info->sOrigTralByte[i]); Info->eTralByte[Unique] = min(LOBYTE(Info->eRange[nIndex]), Info->eOrigTralByte[i]); //we keep valid ranges and overwrite invalid one with next loop if (Info->eTralByte[Unique] >= Info->sTralByte[Unique]) Unique +=1; } Info->nTralByte=Unique; } #endif // BUILD_ON_WINNT