windows-nt/Source/XPSP1/NT/base/win32/lz32/winlza/utilsnls.c
2020-09-26 16:20:57 +08:00

161 lines
4.6 KiB
C

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#define FE_SB
#define IS_DBCS_ENABLED() (!!NLS_MB_CODE_PAGE_TAG)
/***************************************************************************\
* IsCharLowerA (API)
*
* History:
* 14-Jan-1991 mikeke from win 3.0
* 22-Jun-1991 GregoryW Modified to support code page 1252 (Windows ANSI
* code page). This is for the PDK only. After the
* PDK this routine will be rewritten to use the
* NLSAPI.
* 02-Feb-1992 GregoryW Modified to use NLS API.
\***************************************************************************/
BOOL LZIsCharLowerA(
char cChar)
{
WORD ctype1info = 0;
WCHAR wChar = 0;
#ifdef FE_SB // IsCharLowerA()
/*
* if only DBCS Leadbyte was passed, just return FALSE.
* Same behavior as Windows 3.1J and Windows 95 FarEast version.
*/
if (IS_DBCS_ENABLED() && IsDBCSLeadByte(cChar)) {
return FALSE;
}
#endif // FE_SB
/*
* The following 2 calls cannot fail here
*/
RtlMultiByteToUnicodeN(&wChar, sizeof(WCHAR), NULL, &cChar, sizeof(CHAR));
GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
return (ctype1info & C1_LOWER) == C1_LOWER;
}
/***************************************************************************\
* IsCharUpperA (API)
*
* History:
* 22-Jun-1991 GregoryW Created to support code page 1252 (Windows ANSI
* code page). This is for the PDK only. After the
* PDK this routine will be rewritten to use the
* NLSAPI.
* 02-Feb-1992 GregoryW Modified to use NLS API.
\***************************************************************************/
BOOL LZIsCharUpperA(
char cChar)
{
WORD ctype1info = 0;
WCHAR wChar = 0;
#ifdef FE_SB // IsCharUpperA()
/*
* if only DBCS Leadbyte was passed, just return FALSE.
* Same behavior as Windows 3.1J and Windows 95 FarEast version.
*/
if (IS_DBCS_ENABLED() && IsDBCSLeadByte(cChar)) {
return FALSE;
}
#endif // FE_SB
/*
* The following 2 calls cannot fail here
*/
RtlMultiByteToUnicodeN(&wChar, sizeof(WCHAR), NULL, &cChar, sizeof(CHAR));
GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
return (ctype1info & C1_UPPER) == C1_UPPER;
}
/***************************************************************************\
* CharNextA (API)
*
* Move to next character in string unless already at '\0' terminator
* DOES NOT WORK CORRECTLY FOR DBCS (eg: Japanese)
*
* History:
* 12-03-90 IanJa Created non-NLS version.
* 06-22-91 GregoryW Renamed API to conform to new naming conventions.
* AnsiNext is now a #define which resolves to this
* routine. This routine is only intended to support
* code page 1252 for the PDK release.
\***************************************************************************/
LPSTR LZCharNextA(
LPCSTR lpCurrentChar)
{
#ifdef FE_SB // CharNextA(): dbcs enabling
if (IS_DBCS_ENABLED() && IsDBCSLeadByte(*lpCurrentChar)) {
lpCurrentChar++;
}
/*
* if we have only DBCS LeadingByte, we will point string-terminaler.
*/
#endif // FE_SB
if (*lpCurrentChar) {
lpCurrentChar++;
}
return (LPSTR)lpCurrentChar;
}
/***************************************************************************\
* CharPrevA (API)
*
* Move to previous character in string, unless already at start
* DOES NOT WORK CORRECTLY FOR DBCS (eg: Japanese)
*
* History:
* 12-03-90 IanJa Created non-NLS version.
* 06-22-91 GregoryW Renamed API to conform to new naming conventions.
* AnsiPrev is now a #define which resolves to this
* routine. This routine is only intended to support
* code page 1252 for the PDK release.
\***************************************************************************/
LPSTR LZCharPrevA(
LPCSTR lpStart,
LPCSTR lpCurrentChar)
{
#ifdef FE_SB // CharPrevA : dbcs enabling
if (lpCurrentChar > lpStart) {
if (IS_DBCS_ENABLED()) {
LPCSTR lpChar;
BOOL bDBC = FALSE;
for (lpChar = --lpCurrentChar - 1 ; lpChar >= lpStart ; lpChar--) {
if (!IsDBCSLeadByte(*lpChar))
break;
bDBC = !bDBC;
}
if (bDBC)
lpCurrentChar--;
}
else
lpCurrentChar--;
}
return (LPSTR)lpCurrentChar;
#else
if (lpCurrentChar > lpStart) {
lpCurrentChar--;
}
return (LPSTR)lpCurrentChar;
#endif // FE_SB
}