72 lines
1.5 KiB
C++
72 lines
1.5 KiB
C++
|
#include "StdAfx.h"
|
||
|
#include "Japanese.h"
|
||
|
|
||
|
//
|
||
|
// CP932: Shift-JIS (Japan Industry Standard)
|
||
|
//
|
||
|
|
||
|
#define MACRO_IsLeadByte(c) ((0x81 <= (c) && (c) <= 0x9f) || ((0xe0 <= (c)) && (c) <= 0xfc))
|
||
|
#define MACRO_IsTailByte(c) ((0x40 <= (c) && (c) <= 0x7e) || (0x80 <= (c) && (c) <= 0xfc))
|
||
|
|
||
|
BOOL ShiftJIS_IsLeadByte( const char chByte )
|
||
|
{
|
||
|
const unsigned char byByte = (const unsigned char) chByte;
|
||
|
|
||
|
return MACRO_IsLeadByte( byByte );
|
||
|
}
|
||
|
|
||
|
BOOL ShiftJIS_IsTrailByte( const char chByte )
|
||
|
{
|
||
|
const unsigned char byByte = (const unsigned char) chByte;
|
||
|
|
||
|
return MACRO_IsTailByte( byByte );
|
||
|
}
|
||
|
|
||
|
int ShiftJIS_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, size_t sizeLength )
|
||
|
{
|
||
|
const unsigned char* uszString1 = (const unsigned char*) szStringLeft;
|
||
|
const unsigned char* uszString2 = (const unsigned char*) szStringRight;
|
||
|
unsigned short c1, c2;
|
||
|
|
||
|
if( sizeLength == 0 )
|
||
|
return 0;
|
||
|
while( sizeLength-- ) {
|
||
|
c1 = *uszString1++;
|
||
|
if( MACRO_IsLeadByte(c1) ) {
|
||
|
if( sizeLength == 0 ) {
|
||
|
c1 = 0;
|
||
|
c2 = MACRO_IsLeadByte( *uszString2 ) ? 0 : *uszString2;
|
||
|
goto test;
|
||
|
}
|
||
|
if( *uszString1 == '\0' )
|
||
|
c1 = 0;
|
||
|
else {
|
||
|
c1 = ((c1 << 8) | *uszString1++);
|
||
|
}
|
||
|
} else
|
||
|
c1 = tolower(c1);
|
||
|
|
||
|
c2 = *uszString2++;
|
||
|
if( MACRO_IsLeadByte(c2) ) {
|
||
|
if( sizeLength == 0 ) {
|
||
|
c2 = 0;
|
||
|
goto test;
|
||
|
}
|
||
|
sizeLength--;
|
||
|
if( *uszString2 == '\0' )
|
||
|
c2 = 0;
|
||
|
else {
|
||
|
c2 = ((c2 << 8) | *uszString2++);
|
||
|
}
|
||
|
} else
|
||
|
c2 = tolower(c2);
|
||
|
test:
|
||
|
if (c1 != c2)
|
||
|
return( (c1 > c2) ? 1 : -1);
|
||
|
|
||
|
if (c1 == 0)
|
||
|
return(0);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|