diff options
Diffstat (limited to 'mcs/class/I18N/CJK/CP932.cs')
-rw-r--r-- | mcs/class/I18N/CJK/CP932.cs | 1027 |
1 files changed, 556 insertions, 471 deletions
diff --git a/mcs/class/I18N/CJK/CP932.cs b/mcs/class/I18N/CJK/CP932.cs index e5f81aa7ca8..0e85296279a 100644 --- a/mcs/class/I18N/CJK/CP932.cs +++ b/mcs/class/I18N/CJK/CP932.cs @@ -29,423 +29,471 @@ namespace I18N.CJK { - using System; - using System.Text; - using I18N.Common; +using System; +using System.Text; +using I18N.Common; - [Serializable] - public unsafe class CP932 : MonoEncoding - { - // Magic number used by Windows for the Shift-JIS code page. - private const int SHIFTJIS_CODE_PAGE = 932; - - // Constructor. - public CP932() : base(SHIFTJIS_CODE_PAGE) - { - } +[Serializable] +public unsafe class CP932 : MonoEncoding +{ + // Magic number used by Windows for the Shift-JIS code page. + private const int SHIFTJIS_CODE_PAGE = 932; - // Get the number of bytes needed to encode a character buffer. - public unsafe override int GetByteCountImpl (char* chars, int count) - { - int index = 0; + // Constructor. + public CP932() : base(SHIFTJIS_CODE_PAGE) + { + } - // Determine the length of the final output. - int length = 0; - int ch, value; -#if __PNET__ - byte *cjkToJis = JISConvert.Convert.cjkToJis; - byte *extraToJis = JISConvert.Convert.extraToJis; -#else - byte[] cjkToJis = JISConvert.Convert.cjkToJis; - byte[] extraToJis = JISConvert.Convert.extraToJis; -#endif - while(count > 0) + // Get the number of bytes needed to encode a character buffer. + public override int GetByteCount(char[] chars, int index, int count) { - ch = chars[index++]; - --count; - ++length; - if(ch < 0x0080) + // Validate the parameters. + if(chars == null) { - // Character maps to itself. - continue; + throw new ArgumentNullException("chars"); } - else if(ch < 0x0100) + if(index < 0 || index > chars.Length) { - // Check for special Latin 1 characters that - // can be mapped to double-byte code points. - if(ch == 0x00A2 || ch == 0x00A3 || ch == 0x00A7 || - ch == 0x00A8 || ch == 0x00AC || ch == 0x00B0 || - ch == 0x00B1 || ch == 0x00B4 || ch == 0x00B6 || - ch == 0x00D7 || ch == 0x00F7) - { - ++length; - } + throw new ArgumentOutOfRangeException + ("index", Strings.GetString("ArgRange_Array")); } - else if(ch >= 0x0391 && ch <= 0x0451) + if(count < 0 || count > (chars.Length - index)) { - // Greek subset characters. - ++length; + throw new ArgumentOutOfRangeException + ("count", Strings.GetString("ArgRange_Array")); } - else if(ch >= 0x2010 && ch <= 0x9FA5) + + // Determine the length of the final output. + int length = 0; + int ch, value; +#if __PNET__ + byte *cjkToJis = JISConvert.Convert.cjkToJis; + byte *extraToJis = JISConvert.Convert.extraToJis; +#else + byte[] cjkToJis = JISConvert.Convert.cjkToJis; + byte[] extraToJis = JISConvert.Convert.extraToJis; +#endif + while(count > 0) { - // This range contains the bulk of the CJK set. - value = (ch - 0x2010) * 2; - value = ((int)(cjkToJis[value])) | - (((int)(cjkToJis[value + 1])) << 8); - if(value >= 0x0100) + ch = chars[index++]; + --count; + ++length; + if(ch < 0x0080) + { + // Character maps to itself. + continue; + } + else if(ch < 0x0100) + { + // Check for special Latin 1 characters that + // can be mapped to double-byte code points. + if(ch == 0x00A2 || ch == 0x00A3 || ch == 0x00A7 || + ch == 0x00A8 || ch == 0x00AC || ch == 0x00B0 || + ch == 0x00B1 || ch == 0x00B4 || ch == 0x00B6 || + ch == 0x00D7 || ch == 0x00F7) + { + ++length; + } + } + else if(ch >= 0x0391 && ch <= 0x0451) { + // Greek subset characters. ++length; } - } - else if(ch >= 0xE000 && ch <= 0xE757) - // PrivateUse - ++length; - else if(ch >= 0xFF01 && ch <= 0xFFEF) - { - // This range contains extra characters, - // including half-width katakana. - value = (ch - 0xFF01) * 2; - value = ((int)(extraToJis[value])) | - (((int)(extraToJis[value + 1])) << 8); - if(value >= 0x0100) + else if(ch >= 0x2010 && ch <= 0x9FA5) { + // This range contains the bulk of the CJK set. + value = (ch - 0x2010) * 2; + value = ((int)(cjkToJis[value])) | + (((int)(cjkToJis[value + 1])) << 8); + if(value >= 0x0100) + { + ++length; + } + } + else if(ch >= 0xE000 && ch <= 0xE757) + // PrivateUse ++length; + else if(ch >= 0xFF01 && ch <= 0xFFEF) + { + // This range contains extra characters, + // including half-width katakana. + value = (ch - 0xFF01) * 2; + value = ((int)(extraToJis[value])) | + (((int)(extraToJis[value + 1])) << 8); + if(value >= 0x0100) + { + ++length; + } } } - } - // Return the length to the caller. - return length; - } + // Return the length to the caller. + return length; + } - // Get the bytes that result from encoding a character buffer. - public unsafe override int GetBytesImpl ( - char* chars, int charCount, byte* bytes, int byteCount) - { - int charIndex = 0; - int byteIndex = 0; + // Get the bytes that result from encoding a character buffer. + public unsafe override int GetBytesImpl ( + char* chars, int charCount, byte* bytes, int byteCount) + { + int charIndex = 0; + int byteIndex = 0; #if NET_2_0 - EncoderFallbackBuffer buffer = null; + EncoderFallbackBuffer buffer = null; #endif - // Convert the characters into their byte form. - int posn = byteIndex; - int byteLength = byteCount; - int ch, value; + // Convert the characters into their byte form. + int posn = byteIndex; + int byteLength = byteCount; + int ch, value; #if __PNET__ - byte *cjkToJis = JISConvert.Convert.cjkToJis; - byte *greekToJis = JISConvert.Convert.greekToJis; - byte *extraToJis = JISConvert.Convert.extraToJis; + byte *cjkToJis = JISConvert.Convert.cjkToJis; + byte *greekToJis = JISConvert.Convert.greekToJis; + byte *extraToJis = JISConvert.Convert.extraToJis; #else - byte[] cjkToJis = JISConvert.Convert.cjkToJis; - byte[] greekToJis = JISConvert.Convert.greekToJis; - byte[] extraToJis = JISConvert.Convert.extraToJis; + byte[] cjkToJis = JISConvert.Convert.cjkToJis; + byte[] greekToJis = JISConvert.Convert.greekToJis; + byte[] extraToJis = JISConvert.Convert.extraToJis; #endif - while(charCount > 0) - { - ch = chars[charIndex++]; - --charCount; - if(posn >= byteLength) - { - throw new ArgumentException - (Strings.GetString("Arg_InsufficientSpace"), - "bytes"); - } - if(ch < 0x0080) - { - // Character maps to itself. - bytes[posn++] = (byte)ch; - continue; - } - else if(ch < 0x0100) + while(charCount > 0) { - // Check for special Latin 1 characters that - // can be mapped to double-byte code points. - if(ch == 0x00A2 || ch == 0x00A3 || ch == 0x00A7 || - ch == 0x00A8 || ch == 0x00AC || ch == 0x00B0 || - ch == 0x00B1 || ch == 0x00B4 || ch == 0x00B6 || - ch == 0x00D7 || ch == 0x00F7) + ch = chars[charIndex++]; + --charCount; + if(posn >= byteLength) + { + throw new ArgumentException + (Strings.GetString("Arg_InsufficientSpace"), + "bytes"); + } + if(ch < 0x0080) + { + // Character maps to itself. + bytes[posn++] = (byte)ch; + continue; + } + else if(ch < 0x0100) { - if((posn + 1) >= byteLength) + // Check for special Latin 1 characters that + // can be mapped to double-byte code points. + if(ch == 0x00A2 || ch == 0x00A3 || ch == 0x00A7 || + ch == 0x00A8 || ch == 0x00AC || ch == 0x00B0 || + ch == 0x00B1 || ch == 0x00B4 || ch == 0x00B6 || + ch == 0x00D7 || ch == 0x00F7) + { + if((posn + 1) >= byteLength) + { + throw new ArgumentException + (Strings.GetString + ("Arg_InsufficientSpace"), "bytes"); + } + switch(ch) + { + case 0x00A2: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x91; + break; + + case 0x00A3: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x92; + break; + + case 0x00A7: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x98; + break; + + case 0x00A8: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x4E; + break; + + case 0x00AC: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0xCA; + break; + + case 0x00B0: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x8B; + break; + + case 0x00B1: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x7D; + break; + + case 0x00B4: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x4C; + break; + + case 0x00B6: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0xF7; + break; + + case 0x00D7: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x7E; + break; + + case 0x00F7: + bytes[posn++] = (byte)0x81; + bytes[posn++] = (byte)0x80; + break; + } + } + else if(ch == 0x00A5) { - throw new ArgumentException - (Strings.GetString - ("Arg_InsufficientSpace"), "bytes"); + // Yen sign. + bytes[posn++] = (byte)0x5C; } - switch(ch) + else { - case 0x00A2: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x91; - break; - - case 0x00A3: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x92; - break; - - case 0x00A7: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x98; - break; - - case 0x00A8: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x4E; - break; - - case 0x00AC: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0xCA; - break; - - case 0x00B0: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x8B; - break; - - case 0x00B1: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x7D; - break; - - case 0x00B4: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x4C; - break; - - case 0x00B6: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0xF7; - break; - - case 0x00D7: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x7E; - break; - - case 0x00F7: - bytes[posn++] = (byte)0x81; - bytes[posn++] = (byte)0x80; - break; +#if NET_2_0 + HandleFallback (ref buffer, + chars, ref charIndex, ref charCount, + bytes, ref posn, ref byteCount); +#else + // Invalid character. + bytes[posn++] = (byte)'?'; +#endif } + continue; + } + else if(ch >= 0x0391 && ch <= 0x0451) + { + // Greek subset characters. + value = (ch - 0x0391) * 2; + value = ((int)(greekToJis[value])) | + (((int)(greekToJis[value + 1])) << 8); + } + else if(ch >= 0x2010 && ch <= 0x9FA5) + { + // This range contains the bulk of the CJK set. + value = (ch - 0x2010) * 2; + value = ((int)(cjkToJis[value])) | + (((int)(cjkToJis[value + 1])) << 8); } - else if(ch == 0x00A5) + else if(ch >= 0xE000 && ch <= 0xE757) { - // Yen sign. - bytes[posn++] = (byte)0x5C; + // PrivateUse + int diff = ch - 0xE000; + value = ((int) (diff / 0xBC) << 8) + + (diff % 0xBC) + + 0xF040; + if (value % 0x100 >= 0x7F) + value++; + } + else if(ch >= 0xFF01 && ch <= 0xFF60) + { + value = (ch - 0xFF01) * 2; + value = ((int)(extraToJis[value])) | + (((int)(extraToJis[value + 1])) << 8); + } + else if(ch >= 0xFF60 && ch <= 0xFFA0) + { + value = ch - 0xFF60 + 0xA0; } else { + // Invalid character. + value = 0; + } + if(value == 0) + { #if NET_2_0 HandleFallback (ref buffer, chars, ref charIndex, ref charCount, bytes, ref posn, ref byteCount); #else - // Invalid character. bytes[posn++] = (byte)'?'; #endif } - continue; - } - else if(ch >= 0x0391 && ch <= 0x0451) - { - // Greek subset characters. - value = (ch - 0x0391) * 2; - value = ((int)(greekToJis[value])) | - (((int)(greekToJis[value + 1])) << 8); - } - else if(ch >= 0x2010 && ch <= 0x9FA5) - { - // This range contains the bulk of the CJK set. - value = (ch - 0x2010) * 2; - value = ((int)(cjkToJis[value])) | - (((int)(cjkToJis[value + 1])) << 8); - } - else if(ch >= 0xE000 && ch <= 0xE757) - { - // PrivateUse - int diff = ch - 0xE000; - value = ((int) (diff / 0xBC) << 8) - + (diff % 0xBC) - + 0xF040; - if (value % 0x100 >= 0x7F) - value++; - } - else if(ch >= 0xFF01 && ch <= 0xFF60) - { - value = (ch - 0xFF01) * 2; - value = ((int)(extraToJis[value])) | - (((int)(extraToJis[value + 1])) << 8); - } - else if(ch >= 0xFF60 && ch <= 0xFFA0) - { - value = ch - 0xFF60 + 0xA0; - } - else - { - // Invalid character. - value = 0; - } - if(value == 0) - { -#if NET_2_0 - HandleFallback (ref buffer, - chars, ref charIndex, ref charCount, - bytes, ref posn, ref byteCount); -#else - bytes[posn++] = (byte)'?'; -#endif - } - else if(value < 0x0100) - { - bytes[posn++] = (byte)value; - } - else if((posn + 1) >= byteLength) - { - throw new ArgumentException - (Strings.GetString("Arg_InsufficientSpace"), - "bytes"); - } - else if(value < 0x8000) - { - // JIS X 0208 character. - value -= 0x0100; - ch = (value / 0xBC); - value = (value % 0xBC) + 0x40; - if(value >= 0x7F) + else if(value < 0x0100) { - ++value; + bytes[posn++] = (byte)value; } - if(ch < (0x9F - 0x80)) + else if((posn + 1) >= byteLength) { - bytes[posn++] = (byte)(ch + 0x81); + throw new ArgumentException + (Strings.GetString("Arg_InsufficientSpace"), + "bytes"); + } + else if(value < 0x8000) + { + // JIS X 0208 character. + value -= 0x0100; + ch = (value / 0xBC); + value = (value % 0xBC) + 0x40; + if(value >= 0x7F) + { + ++value; + } + if(ch < (0x9F - 0x80)) + { + bytes[posn++] = (byte)(ch + 0x81); + } + else + { + bytes[posn++] = (byte)(ch - (0x9F - 0x80) + 0xE0); + } + bytes[posn++] = (byte)value; + } + else if (value >= 0xF040 && value <= 0xF9FC) + { + // PrivateUse + bytes[posn++] = (byte) (value / 0x100); + bytes[posn++] = (byte) (value % 0x100); } else { - bytes[posn++] = (byte)(ch - (0x9F - 0x80) + 0xE0); + // JIS X 0212 character, which Shift-JIS doesn't + // support, but we've already allocated two slots. + bytes[posn++] = (byte)'?'; + bytes[posn++] = (byte)'?'; } - bytes[posn++] = (byte)value; - } - else if (value >= 0xF040 && value <= 0xF9FC) - { - // PrivateUse - bytes[posn++] = (byte) (value / 0x100); - bytes[posn++] = (byte) (value % 0x100); } - else - { - // JIS X 0212 character, which Shift-JIS doesn't - // support, but we've already allocated two slots. - bytes[posn++] = (byte)'?'; - bytes[posn++] = (byte)'?'; - } - } - // Return the final length to the caller. - return posn - byteIndex; - } + // Return the final length to the caller. + return posn - byteIndex; + } - public override int GetCharCount (byte [] bytes, int index, int count) - { - return new CP932Decoder (JISConvert.Convert).GetCharCount ( - bytes, index, count, true); - } + public override int GetCharCount (byte [] bytes, int index, int count) + { + return new CP932Decoder (JISConvert.Convert).GetCharCount ( + bytes, index, count, true); + } - public override int GetChars ( - byte [] bytes, int byteIndex, int byteCount, - char [] chars, int charIndex) - { - return new CP932Decoder (JISConvert.Convert).GetChars (bytes, - byteIndex, byteCount, chars, charIndex, - true); - } + public override int GetChars ( + byte [] bytes, int byteIndex, int byteCount, + char [] chars, int charIndex) + { + return new CP932Decoder (JISConvert.Convert).GetChars (bytes, + byteIndex, byteCount, chars, charIndex, + true); + } - // Get the maximum number of bytes needed to encode a - // specified number of characters. - public override int GetMaxByteCount(int charCount) - { - if(charCount < 0) + // Get the maximum number of bytes needed to encode a + // specified number of characters. + public override int GetMaxByteCount(int charCount) { - throw new ArgumentOutOfRangeException - ("charCount", - Strings.GetString("ArgRange_NonNegative")); + if(charCount < 0) + { + throw new ArgumentOutOfRangeException + ("charCount", + Strings.GetString("ArgRange_NonNegative")); + } + return charCount * 2; } - return charCount * 2; - } - // Get the maximum number of characters needed to decode a - // specified number of bytes. - public override int GetMaxCharCount(int byteCount) - { - if(byteCount < 0) + // Get the maximum number of characters needed to decode a + // specified number of bytes. + public override int GetMaxCharCount(int byteCount) { - throw new ArgumentOutOfRangeException - ("byteCount", - Strings.GetString("ArgRange_NonNegative")); + if(byteCount < 0) + { + throw new ArgumentOutOfRangeException + ("byteCount", + Strings.GetString("ArgRange_NonNegative")); + } + return byteCount; } - return byteCount; - } - // Get a decoder that handles a rolling Shift-JIS state. - public override Decoder GetDecoder() - { - return new CP932Decoder(JISConvert.Convert); - } + // Get a decoder that handles a rolling Shift-JIS state. + public override Decoder GetDecoder() + { + return new CP932Decoder(JISConvert.Convert); + } #if !ECMA_COMPAT - // Get the mail body name for this encoding. - public override String BodyName { - get { return "iso-2022-jp"; } - } - - // Get the human-readable name for this encoding. - public override String EncodingName { - get { return "Japanese (Shift-JIS)"; } - } + // Get the mail body name for this encoding. + public override String BodyName + { + get + { + return "iso-2022-jp"; + } + } - // Get the mail agent header name for this encoding. - public override String HeaderName { - get { return "iso-2022-jp"; } - } + // Get the human-readable name for this encoding. + public override String EncodingName + { + get + { + return "Japanese (Shift-JIS)"; + } + } - // Determine if this encoding can be displayed in a Web browser. - public override bool IsBrowserDisplay { - get { return true; } - } + // Get the mail agent header name for this encoding. + public override String HeaderName + { + get + { + return "iso-2022-jp"; + } + } - // Determine if this encoding can be saved from a Web browser. - public override bool IsBrowserSave { - get { return true; } - } + // Determine if this encoding can be displayed in a Web browser. + public override bool IsBrowserDisplay + { + get + { + return true; + } + } - // Determine if this encoding can be displayed in a mail/news agent. - public override bool IsMailNewsDisplay { - get { return true; } - } + // Determine if this encoding can be saved from a Web browser. + public override bool IsBrowserSave + { + get + { + return true; + } + } - // Determine if this encoding can be saved from a mail/news agent. - public override bool IsMailNewsSave { - get { return true; } - } + // Determine if this encoding can be displayed in a mail/news agent. + public override bool IsMailNewsDisplay + { + get + { + return true; + } + } - // Get the IANA-preferred Web name for this encoding. - public override String WebName { - get { return "shift_jis"; } - } + // Determine if this encoding can be saved from a mail/news agent. + public override bool IsMailNewsSave + { + get + { + return true; + } + } - // Get the Windows code page represented by this object. - public override int WindowsCodePage { - get { return SHIFTJIS_CODE_PAGE; } - } + // Get the IANA-preferred Web name for this encoding. + public override String WebName + { + get + { + return "shift_jis"; + } + } - }; // class CP932 + // Get the Windows code page represented by this object. + public override int WindowsCodePage + { + get + { + return SHIFTJIS_CODE_PAGE; + } + } #endif // !ECMA_COMPAT // Decoder that handles a rolling Shift-JIS state. - sealed class CP932Decoder : DbcsEncoding.DbcsDecoder + private sealed class CP932Decoder : Decoder { private JISConvert convert; private int last_byte_count; @@ -453,10 +501,9 @@ namespace I18N.CJK // Constructor. public CP932Decoder(JISConvert convert) - : base (null) - { - this.convert = convert; - } + { + this.convert = convert; + } // Override inherited methods. @@ -471,44 +518,58 @@ namespace I18N.CJK override #endif int GetCharCount (byte [] bytes, int index, int count, bool refresh) - { - CheckRange (bytes, index, count); - - // Determine the total length of the converted string. - int length = 0; - int byteval; - int last = last_byte_count; - while(count > 0) - { - byteval = bytes[index++]; - --count; - if(last == 0) { - if((byteval >= 0x81 && byteval <= 0x9F) || - (byteval >= 0xE0 && byteval <= 0xEF)) + // Validate the parameters. + if(bytes == null) { - // First byte in a double-byte sequence. - last = byteval; + throw new ArgumentNullException("bytes"); + } + if(index < 0 || index > bytes.Length) + { + throw new ArgumentOutOfRangeException + ("index", Strings.GetString("ArgRange_Array")); + } + if(count < 0 || count > (bytes.Length - index)) + { + throw new ArgumentOutOfRangeException + ("count", Strings.GetString("ArgRange_Array")); } - ++length; - } - else - { - // Second byte in a double-byte sequence. - last = 0; - } - } - if (refresh) { - if (last != 0) - length++; - last_byte_count = '\0'; - } - else - last_byte_count = last; - // Return the total length. - return length; - } + // Determine the total length of the converted string. + int length = 0; + int byteval; + int last = last_byte_count; + while(count > 0) + { + byteval = bytes[index++]; + --count; + if(last == 0) + { + if((byteval >= 0x81 && byteval <= 0x9F) || + (byteval >= 0xE0 && byteval <= 0xEF)) + { + // First byte in a double-byte sequence. + last = byteval; + } + ++length; + } + else + { + // Second byte in a double-byte sequence. + last = 0; + } + } + if (refresh) { + if (last != 0) + length++; + last_byte_count = '\0'; + } + else + last_byte_count = last; + + // Return the total length. + return length; + } public override int GetChars ( byte [] bytes, int byteIndex, int byteCount, @@ -525,119 +586,143 @@ namespace I18N.CJK int GetChars ( byte [] bytes, int byteIndex, int byteCount, char [] chars, int charIndex, bool refresh) - { - CheckRange (bytes, byteIndex, byteCount, - chars, charIndex); - - // Decode the bytes in the buffer. - int posn = charIndex; - int charLength = chars.Length; - int byteval, value; - int last = last_byte_chars; -#if __PNET__ - byte *table = convert.jisx0208ToUnicode; -#else - byte[] table = convert.jisx0208ToUnicode; -#endif - while(byteCount > 0) - { - byteval = bytes[byteIndex++]; - --byteCount; - if(last == 0) { - if(posn >= charLength) - { - throw new ArgumentException - (Strings.GetString - ("Arg_InsufficientSpace"), "chars"); - } - if((byteval >= 0x81 && byteval <= 0x9F) || - (byteval >= 0xE0 && byteval <= 0xEF)) + // Validate the parameters. + if(bytes == null) { - // First byte in a double-byte sequence. - last = byteval; + throw new ArgumentNullException("bytes"); } - else if(byteval < 0x80) + if(chars == null) { - // Ordinary ASCII/Latin1 character. - chars[posn++] = (char)byteval; + throw new ArgumentNullException("chars"); } - else if(byteval >= 0xA1 && byteval <= 0xDF) + if(byteIndex < 0 || byteIndex > bytes.Length) { - // Half-width katakana character. - chars[posn++] = (char)(byteval - 0xA1 + 0xFF61); + throw new ArgumentOutOfRangeException + ("byteIndex", Strings.GetString("ArgRange_Array")); } - else + if(byteCount < 0 || byteCount > (bytes.Length - byteIndex)) { - // Invalid first byte. - chars[posn++] = '?'; + throw new ArgumentOutOfRangeException + ("byteCount", Strings.GetString("ArgRange_Array")); } - } - else - { - // Second byte in a double-byte sequence. - if(last >= 0x81 && last <= 0x9F) + if(charIndex < 0 || charIndex > chars.Length) { - value = (last - 0x81) * 0xBC; + throw new ArgumentOutOfRangeException + ("charIndex", Strings.GetString("ArgRange_Array")); } - else if (last >= 0xF0 && last <= 0xFC && byteval <= 0xFC) - { - // PrivateUse - value = 0xE000 + (last - 0xF0) * 0xBC + byteval; - if (byteval > 0x7F) - value--; - } - else - { - value = (last - 0xE0 + (0xA0 - 0x81)) * 0xBC; - } - last = 0; - if(byteval >= 0x40 && byteval <= 0x7E) - { - value += (byteval - 0x40); - } - else if(byteval >= 0x80 && byteval <= 0xFC) - { - value += (byteval - 0x80 + 0x3F); - } - else + + // Decode the bytes in the buffer. + int posn = charIndex; + int charLength = chars.Length; + int byteval, value; + int last = last_byte_chars; +#if __PNET__ + byte *table = convert.jisx0208ToUnicode; +#else + byte[] table = convert.jisx0208ToUnicode; +#endif + while(byteCount > 0) { - // Invalid second byte. - chars[posn++] = '?'; - continue; + byteval = bytes[byteIndex++]; + --byteCount; + if(last == 0) + { + if(posn >= charLength) + { + throw new ArgumentException + (Strings.GetString + ("Arg_InsufficientSpace"), "chars"); + } + if((byteval >= 0x81 && byteval <= 0x9F) || + (byteval >= 0xE0 && byteval <= 0xEF)) + { + // First byte in a double-byte sequence. + last = byteval; + } + else if(byteval < 0x80) + { + // Ordinary ASCII/Latin1 character. + chars[posn++] = (char)byteval; + } + else if(byteval >= 0xA1 && byteval <= 0xDF) + { + // Half-width katakana character. + chars[posn++] = (char)(byteval - 0xA1 + 0xFF61); + } + else + { + // Invalid first byte. + chars[posn++] = '?'; + } + } + else + { + // Second byte in a double-byte sequence. + if(last >= 0x81 && last <= 0x9F) + { + value = (last - 0x81) * 0xBC; + } + else if (last >= 0xF0 && last <= 0xFC && byteval <= 0xFC) + { + // PrivateUse + value = 0xE000 + (last - 0xF0) * 0xBC + byteval; + if (byteval > 0x7F) + value--; + } + else + { + value = (last - 0xE0 + (0xA0 - 0x81)) * 0xBC; + } + last = 0; + if(byteval >= 0x40 && byteval <= 0x7E) + { + value += (byteval - 0x40); + } + else if(byteval >= 0x80 && byteval <= 0xFC) + { + value += (byteval - 0x80 + 0x3F); + } + else + { + // Invalid second byte. + chars[posn++] = '?'; + continue; + } + value *= 2; + value = ((int)(table[value])) | + (((int)(table[value + 1])) << 8); + if(value != 0) + { + chars[posn++] = (char)value; + } + else + { + chars[posn++] = '?'; + } + } } - value *= 2; - value = ((int)(table[value])) | - (((int)(table[value + 1])) << 8); - if(value != 0) - { - chars[posn++] = (char)value; + if (refresh) { + if (last != 0) + chars[posn++] = '\u30FB'; + last_byte_chars = '\0'; } else - { - chars[posn++] = '?'; - } - } - } - if (refresh) { - if (last != 0) - chars[posn++] = '\u30FB'; - last_byte_chars = '\0'; - } - else - last_byte_chars = last; + last_byte_chars = last; - // Return the final length to the caller. - return posn - charIndex; - } + // Return the final length to the caller. + return posn - charIndex; + } } // class CP932Decoder - [Serializable] - public class ENCshift_jis : CP932 - { - public ENCshift_jis() : base() {} +}; // class CP932 + +[Serializable] +public class ENCshift_jis : CP932 +{ + public ENCshift_jis() : base() {} - }; // class ENCshift_jis +}; // class ENCshift_jis }; // namespace I18N.CJK |