mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
7.5 KiB
349 lines
7.5 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nls.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the support for NLS
|
|
|
|
Author:
|
|
|
|
Michael Jarus (mjarus) 28-Jul-1992
|
|
|
|
Environment:
|
|
|
|
User Mode Only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#define WIN32_ONLY
|
|
#include "os2ses.h"
|
|
#include "os2nls.h"
|
|
#include "trans.h"
|
|
#include "os2win.h"
|
|
|
|
|
|
|
|
ULONG
|
|
NlsCountryToLoacle(
|
|
IN ULONG NlsCountryCode,
|
|
IN LCID *NlsLocaleID
|
|
);
|
|
|
|
#if DBG
|
|
BYTE NLSInitStr[] = "NLSInit";
|
|
#endif
|
|
|
|
DWORD
|
|
NLSInit()
|
|
{
|
|
ULONG i, Win32LCID, CurrentVioCP, CurrentKbdCP;
|
|
USHORT LocaleLang;
|
|
|
|
/*
|
|
* Get Current Console CP
|
|
*/
|
|
|
|
CurrentVioCP = (ULONG)Or2WinGetConsoleOutputCP(
|
|
#if DBG
|
|
NLSInitStr
|
|
#endif
|
|
);
|
|
|
|
CurrentKbdCP = (ULONG)Or2WinGetConsoleCP(
|
|
#if DBG
|
|
NLSInitStr
|
|
#endif
|
|
);
|
|
|
|
#ifdef DBCS
|
|
// MSKK Jun.16.1993 V-AkihiS
|
|
SesGrp->DosCP = (ULONG)Or2WinGetConsoleCP(
|
|
#if DBG
|
|
NLSInitStr
|
|
#endif
|
|
);
|
|
#endif
|
|
|
|
Win32LCID = (ULONG)Or2WinGetThreadLocale(
|
|
#if DBG
|
|
NLSInitStr
|
|
#endif
|
|
);
|
|
|
|
if ((Win32LCID != SesGrp->Win32LCID) &&
|
|
(SesGrp->Os2srvUseRegisterInfo ||
|
|
(Win32LCID != SesGrp->Os2ssLCID)))
|
|
{
|
|
/*
|
|
* Inherit NLS definitions from Win32
|
|
* We get here if the LOCALE inherit by Os2srv is different
|
|
* from the LOCALE inherit by the os2.exe
|
|
* We handle only COUNTRY and LOCALE parms. (not CP, which are equal)
|
|
*/
|
|
|
|
//SesGrp->Win32OEMCP = GetOEMCP();
|
|
//SesGrp->Win32ACP = GetACP();
|
|
SesGrp->Win32LCID = Win32LCID;
|
|
SesGrp->Win32LANGID = (ULONG)Or2WinGetUserDefaultLangID(
|
|
#if DBG
|
|
NLSInitStr
|
|
#endif
|
|
);
|
|
|
|
Or2NlsGetCountryFromLocale((LCID)SesGrp->Win32LCID, &SesGrp->Win32CountryCode);
|
|
|
|
//SesGrp->PrimaryCP = SesGrp->Win32OEMCP;
|
|
SesGrp->CountryCode = SesGrp->Win32CountryCode;
|
|
SesGrp->Os2ssLCID = SesGrp->Win32LCID;
|
|
#ifdef JAPAN
|
|
// MSKK Nov.04.1992 V-AkihiS
|
|
SesGrp->LanguageID = LANG_JAPANESE;
|
|
#else
|
|
SesGrp->LanguageID = LANG_ENGLISH;
|
|
#endif
|
|
|
|
LocaleLang = PRIMARYLANGID(LANGIDFROMLCID(Win32LCID));
|
|
for ( i = 0 ; Or2NlsLangIdTable[i] ; i++ )
|
|
{
|
|
if (Or2NlsLangIdTable[i] == LocaleLang)
|
|
{
|
|
SesGrp->LanguageID = Or2NlsLangIdTable[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Get CtryInfo, DBCSEv, CollateTable, CaseMapTable for the default
|
|
* (We don't have to update CP-depent parms since CP,s are equal)
|
|
*/
|
|
|
|
Or2NlsGetCtryInfo(
|
|
(LCID)SesGrp->Os2ssLCID,
|
|
(UINT)SesGrp->PrimaryCP,
|
|
(PCOUNTRYINFO)&SesGrp->CountryInfo
|
|
);
|
|
|
|
#if DBG
|
|
/*
|
|
* Dump specail NLS info to the debugger
|
|
*/
|
|
|
|
IF_OD2_DEBUG( NLS )
|
|
{
|
|
KdPrint(("OS2SES(Os2-NLS): "));
|
|
}
|
|
#endif
|
|
|
|
//SesGrp->VioCP = SesGrp->KbdCP = SesGrp->DosCP = SesGrp->PrimaryCP;
|
|
} else
|
|
{
|
|
if (Win32LCID != SesGrp->Win32LCID)
|
|
{
|
|
Or2WinSetThreadLocale(
|
|
#if DBG
|
|
NLSInitStr,
|
|
#endif
|
|
(LCID)SesGrp->Win32LCID
|
|
);
|
|
}
|
|
#if DBG
|
|
/*
|
|
* Dump specail NLS info to the debugger
|
|
*/
|
|
|
|
IF_OD2_DEBUG( NLS )
|
|
{
|
|
KdPrint(("OS2SES(Os2-NLS): using OS2SRV NLS definitions\n "));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#if DBG
|
|
/*
|
|
* Dump all NLS info to the debugger
|
|
*/
|
|
|
|
IF_OD2_DEBUG( NLS )
|
|
{
|
|
KdPrint(("CP %lu (%lu,%lu), Country %lu, LangID %lx ,LCID %lx\n",
|
|
SesGrp->DosCP, SesGrp->PrimaryCP, SesGrp->SecondaryCP,
|
|
SesGrp->CountryCode, SesGrp->LanguageID, SesGrp->Os2ssLCID));
|
|
|
|
KdPrint(("OS2SES(Win32-NLS): OEMCP %lu, ACP %lu, Country %lu, LangID %lx\n",
|
|
SesGrp->Win32OEMCP, SesGrp->Win32ACP, SesGrp->Win32CountryCode,
|
|
SesGrp->Win32LANGID));
|
|
|
|
KdPrint((" LCID %lx, ConCP %lu, ConOutCP %lu\n",
|
|
SesGrp->Win32LCID, CurrentKbdCP, CurrentVioCP));
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Complete the NLS initialization for Vio and KBD
|
|
*/
|
|
|
|
KbdInitForNLS(CurrentKbdCP);
|
|
VioInitForNLS(CurrentVioCP);
|
|
|
|
return (NO_ERROR);
|
|
}
|
|
|
|
|
|
DWORD
|
|
Ow2NlsGetCtryInfo(
|
|
IN ULONG NlsCodePage,
|
|
IN ULONG NlsCountryCode,
|
|
OUT PVOID NlsCountryInfo
|
|
)
|
|
{
|
|
ULONG Rc;
|
|
LCID NlsLocaleID;
|
|
|
|
Rc = NlsCountryToLoacle(
|
|
NlsCountryCode,
|
|
&NlsLocaleID
|
|
);
|
|
|
|
if (Rc)
|
|
{
|
|
#if DBG
|
|
IF_OD2_DEBUG2( NLS, OS2_EXE )
|
|
KdPrint(("OS2SES(NlsRequest-GetCtryInfo): cannot find LocaleID Rc %lu\n",
|
|
Rc));
|
|
#endif
|
|
return(Rc);
|
|
}
|
|
|
|
return (Or2NlsGetCtryInfo(
|
|
NlsLocaleID,
|
|
(UINT)NlsCodePage,
|
|
(PCOUNTRYINFO)NlsCountryInfo
|
|
));
|
|
}
|
|
|
|
|
|
DWORD
|
|
Ow2NlsGetCollateTable(
|
|
IN ULONG NlsCodePage,
|
|
IN ULONG NlsCountryCode,
|
|
OUT PVOID NlsColateTable
|
|
)
|
|
{
|
|
DWORD Rc;
|
|
LCID NlsLocaleID;
|
|
|
|
Rc = NlsCountryToLoacle(
|
|
NlsCountryCode,
|
|
&NlsLocaleID
|
|
);
|
|
|
|
if (Rc)
|
|
{
|
|
#if DBG
|
|
IF_OD2_DEBUG2( NLS, OS2_EXE )
|
|
KdPrint(("OS2SES(NlsRequest-GetCtryInfo): cannot find LocaleID Rc %lu\n",
|
|
Rc));
|
|
#endif
|
|
return(Rc);
|
|
}
|
|
|
|
Rc = Or2NlsGetMapTable(
|
|
NlsLocaleID,
|
|
(UINT)NlsCodePage,
|
|
LCMAP_SORTKEY,
|
|
(PUCHAR)NlsColateTable
|
|
);
|
|
if (Rc)
|
|
{
|
|
Rc = GetLastError();
|
|
#if DBG
|
|
IF_OD2_DEBUG2( NLS, OS2_EXE )
|
|
KdPrint(("OS2SES(NlsRequest-GetColateTable): Rc %lu\n",
|
|
Rc));
|
|
#endif
|
|
}
|
|
return(Rc);
|
|
}
|
|
|
|
|
|
DWORD
|
|
Ow2NlsGetCaseMapTable(
|
|
IN ULONG NlsCodePage,
|
|
IN ULONG NlsCountryCode,
|
|
OUT PVOID NlsColateTable
|
|
)
|
|
{
|
|
DWORD Rc;
|
|
LCID NlsLocaleID;
|
|
|
|
Rc = NlsCountryToLoacle(
|
|
NlsCountryCode,
|
|
&NlsLocaleID
|
|
);
|
|
|
|
if (Rc)
|
|
{
|
|
#if DBG
|
|
IF_OD2_DEBUG2( NLS, OS2_EXE )
|
|
KdPrint(("OS2SES(NlsRequest-GetCtryInfo): cannot find LocaleID Rc %lu\n",
|
|
Rc));
|
|
#endif
|
|
return(Rc);
|
|
}
|
|
|
|
Rc = Or2NlsGetMapTable(
|
|
NlsLocaleID,
|
|
(UINT)NlsCodePage,
|
|
LCMAP_UPPERCASE,
|
|
(PUCHAR)NlsColateTable
|
|
);
|
|
if (Rc)
|
|
{
|
|
Rc = GetLastError();
|
|
#if DBG
|
|
IF_OD2_DEBUG2( NLS, OS2_EXE )
|
|
KdPrint(("OS2SES(NlsRequest-GetCaseMap): Rc %lu\n",
|
|
Rc));
|
|
#endif
|
|
}
|
|
return(Rc);
|
|
}
|
|
|
|
|
|
DWORD
|
|
Ow2NlsGetDBCSEn(
|
|
IN ULONG NlsCodePage,
|
|
OUT PVOID NlsDBCSVec
|
|
)
|
|
{
|
|
POD2_DBCS_VECTOR_ENTRY DBCSVec = (POD2_DBCS_VECTOR_ENTRY) NlsDBCSVec;
|
|
|
|
return(Or2NlsGetCPInfo(
|
|
(UINT)NlsCodePage,
|
|
(POD2_DBCS_VECTOR_ENTRY) NlsDBCSVec
|
|
));
|
|
}
|
|
|
|
|
|
ULONG
|
|
NlsCountryToLoacle(
|
|
IN ULONG NlsCountryCode,
|
|
IN LCID *NlsLocaleID
|
|
)
|
|
{
|
|
// BUGBUG: find LocalId from CountryCode
|
|
|
|
*NlsLocaleID = (LCID) -1;
|
|
|
|
return (ERROR_NLS_NO_CTRY_CODE);
|
|
}
|
|
|