From 82009b471bb03fb2ccfe5a3dbcaa3293a62a7c3e Mon Sep 17 00:00:00 2001 From: "ftang%netscape.com" Date: Sat, 12 Jun 1999 01:37:46 +0000 Subject: [PATCH] fix bug 5893 --- intl/uconv/ucvja2/nsISO2022JPToUnicode.cpp | 47 +++++++++++++++++----- intl/uconv/ucvja2/nsISO2022JPToUnicode.h | 8 +++- intl/uconv/ucvja2/nsUnicodeToISO2022JP.cpp | 4 +- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/intl/uconv/ucvja2/nsISO2022JPToUnicode.cpp b/intl/uconv/ucvja2/nsISO2022JPToUnicode.cpp index a89d182c8ff5..6ff76f58c087 100644 --- a/intl/uconv/ucvja2/nsISO2022JPToUnicode.cpp +++ b/intl/uconv/ucvja2/nsISO2022JPToUnicode.cpp @@ -24,14 +24,17 @@ //---------------------------------------------------------------------- // Global functions and data [declaration] -// XXX renames -static PRInt16 cs0201ShiftTable[] = { - 2, u1ByteCharset , - ShiftCell(u1ByteChar, 1, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F), - ShiftCell(u1ByteChar, 1, 0xA1, 0xDF, 0x00, 0xA1, 0x00, 0xDF), +static PRInt16 cs1ByteShiftTable[] = { + 0, u1ByteCharset , + ShiftCell(0,0,0,0,0,0,0,0) }; -static PRInt16 cs0208ShiftTable[] = { +static PRInt16 cs1ByteGLShiftTable[] = { + 0, u1ByteGLCharset , + ShiftCell(0,0,0,0,0,0,0,0) +}; + +static PRInt16 cs2ByteShiftTable[] = { 0, u2BytesCharset, ShiftCell(0,0,0,0,0,0,0,0) }; @@ -89,7 +92,7 @@ nsresult nsISO2022JPToUnicode::ConvertBuffer(const char ** aSrc, val = ((PRUint8)*src++); *dest++ = (val < 0x80)?val:0xfffd; } - } else if (mCharset == kJISX0201_1976) { + } else if ((mCharset == kJISX0201_1976) || (mCharset == kJISX0201_1976Kana)){ // single byte if (srcLen > destLen) { aSrcEnd = src + destLen; @@ -97,7 +100,12 @@ nsresult nsISO2022JPToUnicode::ConvertBuffer(const char ** aSrc, } else res = NS_OK; res = mHelper->ConvertByTable(src, &srcLen, dest, &destLen, - (uShiftTable*) &cs0201ShiftTable, (uMappingTable*)&g_ut0201Mapping); + ( (mCharset == kJISX0201_1976) ? + (uShiftTable*) &cs1ByteShiftTable : + (uShiftTable*) &cs1ByteGLShiftTable), + (uMappingTable*)&g_ut0201Mapping); + + *aSrc = src + srcLen; *aDest = dest + destLen; return res; @@ -113,7 +121,10 @@ nsresult nsISO2022JPToUnicode::ConvertBuffer(const char ** aSrc, } else res = NS_OK; res = mHelper->ConvertByTable(src, &srcLen, dest, &destLen, - (uShiftTable*) &cs0208ShiftTable, (uMappingTable*)&g_ut0208Mapping); + (uShiftTable*) &cs2ByteShiftTable, + ( (mCharset == kJISX0212_1990) ? + (uMappingTable*)&g_ut0212Mapping : + (uMappingTable*)&g_ut0208Mapping)); *aSrc = src + srcLen; *aDest = dest + destLen; return res; @@ -180,6 +191,10 @@ NS_IMETHODIMP nsISO2022JPToUnicode::ConvertNoBuff(const char * aSrc, mState = 0; mCharset = kJISX0201_1976; break; + case 'I': + mState = 0; + mCharset = kJISX0201_1976Kana; + break; default: res = NS_ERROR_ILLEGAL_INPUT; } @@ -195,6 +210,20 @@ NS_IMETHODIMP nsISO2022JPToUnicode::ConvertNoBuff(const char * aSrc, mState = 0; mCharset = kJISX0208_1983; break; + case '(': + mState = 4; + break; + default: + res = NS_ERROR_ILLEGAL_INPUT; + } + break; + + case 4: + switch (*src) { + case 'D': + mState = 0; + mCharset = kJISX0212_1990; + break; default: res = NS_ERROR_ILLEGAL_INPUT; } diff --git a/intl/uconv/ucvja2/nsISO2022JPToUnicode.h b/intl/uconv/ucvja2/nsISO2022JPToUnicode.h index ce153c028a74..4b4f83457fea 100644 --- a/intl/uconv/ucvja2/nsISO2022JPToUnicode.h +++ b/intl/uconv/ucvja2/nsISO2022JPToUnicode.h @@ -36,10 +36,14 @@ * S1 + * -> ERR * S2 + 'B' -> S0; mCharset = kASCII * S2 + 'J' -> S0; mCharset = kJISX0201_1976 + * S2 + 'I' -> S0; mCharset = kJISX0201_1976Kana [Not Std ISO-2022-JP] * S2 + * -> ERR * S3 + '@' -> S0; mCharset = kJISX0208_1978 * S3 + 'B' -> S0; mCharset = kJISX0208_1983 + * S3 + '(' -> S4; [Not Std ISO-2022-JP] * S3 + * -> ERR + * S4 + 'D' -> S0; mCharset = kJISX0212_1990 [Not Std ISO-2022-JP] + * S4 + * -> ERR [Not Std ISO-2022-JP] * ERR + * -> ERR * * @created 09/Feb/1998 @@ -70,7 +74,9 @@ protected: kASCII, kJISX0201_1976, kJISX0208_1978, - kJISX0208_1983 + kJISX0208_1983, + kJISX0201_1976Kana, // [Not Std ISO-2022-JP] + kJISX0212_1990 // [Not Std ISO-2022-JP] }; PRInt32 mState; // current state of the state machine diff --git a/intl/uconv/ucvja2/nsUnicodeToISO2022JP.cpp b/intl/uconv/ucvja2/nsUnicodeToISO2022JP.cpp index 2494e1fd92ff..ab424bc89bb8 100644 --- a/intl/uconv/ucvja2/nsUnicodeToISO2022JP.cpp +++ b/intl/uconv/ucvja2/nsUnicodeToISO2022JP.cpp @@ -111,12 +111,12 @@ nsresult nsUnicodeToISO2022JP::ChangeCharset(PRInt32 aCharset, case 2: aDest[0] = 0x1b; aDest[1] = '$'; - aDest[2] = '@'; + aDest[2] = 'B'; break; case 3: aDest[0] = 0x1b; aDest[1] = '$'; - aDest[2] = 'B'; + aDest[2] = '@'; break; }