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.
417 lines
8.8 KiB
417 lines
8.8 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dllnls16.c
|
|
|
|
Abstract:
|
|
|
|
This module implements 32 equivalents of NLS OS/2 V1.21
|
|
API Calls and 16b implementation service routines.
|
|
The APIs are called from 16->32 thunks (i386\doscalls.asm).
|
|
|
|
Author:
|
|
|
|
Michael Jarus (mjarus) 15-Apr-1992
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define INCL_OS2V20_TASKING
|
|
#define INCL_OS2V20_NLS
|
|
#define INCL_OS2V20_ERRORS
|
|
#include "os2dll.h"
|
|
#include "os2dll16.h"
|
|
#include "conrqust.h"
|
|
#include "os2nls.h"
|
|
|
|
|
|
|
|
APIRET
|
|
DosSetCp(
|
|
IN ULONG ulCodePage,
|
|
IN ULONG ulReserved
|
|
)
|
|
{
|
|
APIRET rc;
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosSetCp";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: CP %lu, Reserved %lu, (current %lu)\n",
|
|
FuncName, ulCodePage, ulReserved, SesGrp->DosCP);
|
|
}
|
|
#endif
|
|
|
|
if ( rc = DosSetProcessCp(ulCodePage, ulReserved) )
|
|
{
|
|
return (rc);
|
|
}
|
|
|
|
if ( rc = VioSetCp(0, ulCodePage, 0) )
|
|
{
|
|
return (rc);
|
|
}
|
|
|
|
if( rc = KbdSetCp(0, ulCodePage, 0))
|
|
{
|
|
return (rc);
|
|
}
|
|
|
|
rc = KbdFlushBuffer(0);
|
|
return (rc);
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosSetProcCp(
|
|
IN ULONG ulCodePage,
|
|
IN ULONG ulReserved
|
|
)
|
|
{
|
|
APIRET rc;
|
|
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosSetProcCp";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: CP %lu, Reserved %lu, (current %lu)\n",
|
|
FuncName, ulCodePage, ulReserved, SesGrp->DosCP);
|
|
}
|
|
#endif
|
|
|
|
rc = DosSetProcessCp(ulCodePage, ulReserved);
|
|
return (rc);
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosGetCp(
|
|
IN ULONG MaxLengthCodePageList,
|
|
OUT USHORT CodePages[],
|
|
OUT PUSHORT CountCodePages
|
|
)
|
|
{
|
|
ULONG Count, TotalCount, *pUl;
|
|
APIRET rc = NO_ERROR;
|
|
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosGetCp";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Length %lu (current CP %lu)\n",
|
|
FuncName, MaxLengthCodePageList, SesGrp->DosCP);
|
|
}
|
|
#endif
|
|
|
|
try
|
|
{
|
|
Od2ProbeForWrite( CountCodePages, sizeof( USHORT ), 1);
|
|
Od2ProbeForWrite( CodePages, MaxLengthCodePageList * sizeof( USHORT ), 1);
|
|
} except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Od2ExitGP();
|
|
}
|
|
|
|
if ( MaxLengthCodePageList < sizeof(USHORT) )
|
|
{
|
|
*CountCodePages = 0;
|
|
return (ERROR_CPLIST_TOO_SMALL);
|
|
}
|
|
|
|
//
|
|
// Determine the number of code pages to return. This is at least one
|
|
// for the code page associated with the current process, plus N for the
|
|
// N installed code pages.
|
|
//
|
|
|
|
Count = (SesGrp->SecondaryCP) ? 2 : 1;
|
|
|
|
//
|
|
// Determine the maximum number of code pages the caller can accept in
|
|
// their buffer. This is just the buffer length divided by sizeof( USHORT )
|
|
//
|
|
|
|
TotalCount = MaxLengthCodePageList / sizeof( USHORT ) - 1;
|
|
|
|
//
|
|
// Determine how many we will actually return and setup to return
|
|
// an error status if the list will be truncated.
|
|
//
|
|
|
|
if (Count > TotalCount)
|
|
{
|
|
Count = TotalCount;
|
|
rc = ERROR_CPLIST_TOO_SMALL;
|
|
}
|
|
|
|
//
|
|
// Return the actual length of code page information returned in the
|
|
// caller's buffer.
|
|
//
|
|
|
|
*CountCodePages = (USHORT)((Count + 1) * sizeof( USHORT ));
|
|
|
|
//
|
|
// Return the code page for the process always.
|
|
//
|
|
|
|
*CodePages++ = (USHORT)Od2ProcessCodePage;
|
|
|
|
//
|
|
// Return the installed code pages.
|
|
//
|
|
|
|
pUl = &SesGrp->PrimaryCP;
|
|
|
|
while (Count--)
|
|
{
|
|
*CodePages++ = (USHORT)*pUl++;
|
|
}
|
|
|
|
//
|
|
// Return success or error code.
|
|
//
|
|
|
|
return( rc );
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosCaseMap(
|
|
IN ULONG cbLength,
|
|
IN PCOUNTRYCODE16 CountryCode,
|
|
IN OUT PUCHAR pchString)
|
|
{
|
|
COUNTRYCODE ctryc;
|
|
APIRET RetCode;
|
|
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosCaseMap";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Country %u, CP %u, (current Ctry %lu, CP %lu), Length %lu, String %c...\n",
|
|
FuncName, CountryCode->country, CountryCode->codepage,
|
|
SesGrp->CountryCode, SesGrp->DosCP, cbLength, *pchString );
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// probe parms.
|
|
//
|
|
|
|
try
|
|
{
|
|
ctryc.country = CountryCode->country;
|
|
ctryc.codepage = CountryCode->codepage;
|
|
} except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Od2ExitGP();
|
|
}
|
|
|
|
RetCode = DosMapCase(cbLength, &ctryc, pchString);
|
|
|
|
if ( !CountryCode->country && CountryCode->codepage)
|
|
{
|
|
CountryCode->country = (USHORT)SesGrp->CountryCode;
|
|
}
|
|
|
|
return (RetCode);
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosGetDBCSEv(
|
|
IN ULONG cbBuf,
|
|
IN PCOUNTRYCODE16 CountryCode,
|
|
IN OUT PCHAR pchString)
|
|
{
|
|
COUNTRYCODE ctryc;
|
|
APIRET RetCode;
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosGetDBCSEv";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Country %u, CP %u, (current Ctry %lu, CP %lu), Length %lu\n",
|
|
FuncName, CountryCode->country, CountryCode->codepage,
|
|
SesGrp->CountryCode, SesGrp->DosCP, cbBuf );
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// probe parms.
|
|
//
|
|
|
|
try
|
|
{
|
|
ctryc.country = CountryCode->country;
|
|
ctryc.codepage = CountryCode->codepage;
|
|
} except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Od2ExitGP();
|
|
}
|
|
|
|
RetCode = DosQueryDBCSEnv(cbBuf, &ctryc, pchString);
|
|
|
|
if ( !CountryCode->country && CountryCode->codepage)
|
|
{
|
|
CountryCode->country = (USHORT)SesGrp->CountryCode;
|
|
}
|
|
|
|
return (RetCode);
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosGetCtryInfo(
|
|
IN ULONG MaxCountryInfoLength,
|
|
IN PCOUNTRYCODE16 CountryCode,
|
|
OUT PCOUNTRYINFO16 CountryInfo,
|
|
OUT PUSHORT ActualCountryInfoLength
|
|
)
|
|
{
|
|
COUNTRYINFO CountryInfo32;
|
|
COUNTRYINFO16 DefaultInformation;
|
|
APIRET RetCode;
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosGetCtryInfo";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Country %lu, CP %u, (current Ctry %u, CP %lu), Length %lu\n",
|
|
FuncName, CountryCode->country, CountryCode->codepage,
|
|
SesGrp->CountryCode, SesGrp->DosCP, MaxCountryInfoLength );
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// zero buffer. probe parms.
|
|
//
|
|
|
|
try
|
|
{
|
|
RtlZeroMemory( (PVOID)CountryInfo, MaxCountryInfoLength );
|
|
Od2ProbeForRead (CountryCode, sizeof(COUNTRYCODE16),1);
|
|
*ActualCountryInfoLength = 0;
|
|
} except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Od2ExitGP();
|
|
}
|
|
|
|
RetCode = Od2GetCtryInfo((ULONG)CountryCode->country,
|
|
(ULONG)CountryCode->codepage,
|
|
&CountryInfo32);
|
|
|
|
if ( !CountryCode->country && CountryCode->codepage)
|
|
{
|
|
CountryCode->country = (USHORT)SesGrp->CountryCode;
|
|
}
|
|
|
|
if ( RetCode )
|
|
{
|
|
return (RetCode);
|
|
}
|
|
|
|
DefaultInformation.country = (USHORT)CountryInfo32.country;
|
|
DefaultInformation.codepage = (USHORT)CountryInfo32.codepage;
|
|
DefaultInformation.fsDateFmt = (USHORT)CountryInfo32.fsDateFmt;
|
|
|
|
RtlMoveMemory( (PVOID)&DefaultInformation.szCurrency[0],
|
|
(PVOID)&CountryInfo32.szCurrency[0],
|
|
sizeof( COUNTRYINFO16 ) - 3 * sizeof(USHORT));
|
|
|
|
if (MaxCountryInfoLength < sizeof( COUNTRYINFO16 ))
|
|
{
|
|
RtlMoveMemory( (PVOID)CountryInfo,
|
|
(PVOID)&DefaultInformation,
|
|
MaxCountryInfoLength
|
|
);
|
|
*ActualCountryInfoLength = (USHORT)MaxCountryInfoLength;
|
|
#if DBG
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Table trunc (%lu instead of %lu)\n",
|
|
FuncName, MaxCountryInfoLength, sizeof( COUNTRYINFO16 ));
|
|
}
|
|
#endif
|
|
return( ERROR_NLS_TABLE_TRUNCATED );
|
|
} else
|
|
{
|
|
RtlMoveMemory( (PVOID)CountryInfo,
|
|
(PVOID)&DefaultInformation,
|
|
sizeof( COUNTRYINFO16 )
|
|
);
|
|
*ActualCountryInfoLength = sizeof( COUNTRYINFO16 );
|
|
return( NO_ERROR );
|
|
}
|
|
}
|
|
|
|
|
|
APIRET
|
|
DosGetCollate(
|
|
IN ULONG cbLength,
|
|
IN PCOUNTRYCODE16 CountryCode,
|
|
IN OUT PUCHAR pchBuf,
|
|
OUT PUSHORT pcbTable
|
|
)
|
|
{
|
|
COUNTRYCODE ctryc;
|
|
ULONG Count = 0;
|
|
APIRET RetCode;
|
|
|
|
#if DBG
|
|
PSZ FuncName;
|
|
|
|
FuncName = "DosGetCollate";
|
|
IF_OD2_DEBUG(NLS)
|
|
{
|
|
DbgPrint("%s: Country %u, CP %u, (current Ctry %lu, CP %lu), Length %lu\n",
|
|
FuncName, CountryCode->country, CountryCode->codepage,
|
|
SesGrp->CountryCode, SesGrp->DosCP, cbLength );
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// probe parms.
|
|
//
|
|
|
|
try
|
|
{
|
|
ctryc.country = CountryCode->country;
|
|
ctryc.codepage = CountryCode->codepage;
|
|
*pcbTable = 0;
|
|
} except( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Od2ExitGP();
|
|
}
|
|
|
|
RetCode = DosQueryCollate(cbLength,
|
|
&ctryc,
|
|
pchBuf,
|
|
&Count);
|
|
|
|
*pcbTable = (USHORT)Count;
|
|
|
|
if ( !CountryCode->country && CountryCode->codepage)
|
|
{
|
|
CountryCode->country = (USHORT)SesGrp->CountryCode;
|
|
}
|
|
|
|
return (RetCode);
|
|
}
|
|
|
|
|