diff options
Diffstat (limited to 'mcs/class/I18N/CJK/CP936.cs')
-rw-r--r-- | mcs/class/I18N/CJK/CP936.cs | 223 |
1 files changed, 87 insertions, 136 deletions
diff --git a/mcs/class/I18N/CJK/CP936.cs b/mcs/class/I18N/CJK/CP936.cs index 2c754393627..454e1b5c3f2 100644 --- a/mcs/class/I18N/CJK/CP936.cs +++ b/mcs/class/I18N/CJK/CP936.cs @@ -29,37 +29,6 @@ namespace I18N.CJK } // Get the bytes that result from encoding a character buffer. - public unsafe override int GetByteCountImpl ( - char* chars, int count) - { - DbcsConvert gb2312 = GetConvert (); - int index = 0; -#if NET_2_0 - EncoderFallbackBuffer buffer = null; -#endif - int length = 0; - while (count-- > 0) { - char c = chars[index++]; - if (c <= 0x80 || c == 0xFF) { // ASCII - length++; - continue; - } - byte b1 = gb2312.u2n[((int)c) * 2 + 1]; - byte b2 = gb2312.u2n[((int)c) * 2]; - if (b1 == 0 && b2 == 0) { -#if NET_2_0 - // FIXME: handle fallback for GetByteCount(). -#else - length++; -#endif - } - else - length += 2; - } - 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) { @@ -98,15 +67,68 @@ namespace I18N.CJK // Get the characters that result from decoding a byte buffer. public override int GetCharCount (byte [] bytes, int index, int count) { - return GetDecoder ().GetCharCount (bytes, index, count); + if (bytes == null) + throw new ArgumentNullException("bytes"); + if (index < 0 || index > bytes.Length) + throw new ArgumentOutOfRangeException("index", Strings.GetString("ArgRange_Array")); + if (count < 0 || index + count > bytes.Length) + throw new ArgumentOutOfRangeException("count", Strings.GetString("ArgRange_Array")); + + int lastByte = 0; + int length = 0; + while (count-- > 0) { + int b = bytes [index++]; + if (lastByte == 0) { + if (b <= 0x80 || b == 0xFF) { // ASCII + length++; + continue; + } else { + lastByte = b; + continue; + } + } + length++; + lastByte = 0; + } + +#if NET_2_0 + if (lastByte != 0) + length++; +#endif + + return length; } // Get the characters that result from decoding a byte buffer. public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { - return GetDecoder ().GetChars ( - bytes, byteIndex, byteCount, chars, charIndex); + DbcsConvert gb2312 = GetConvert (); + // A1 40 - FA FF + base.GetChars(bytes, byteIndex, byteCount, chars, charIndex); + int origIndex = charIndex; + int lastByte = 0; + while (byteCount-- > 0) { + int b = bytes[byteIndex++]; + if (lastByte == 0) { + if (b <= 0x80 || b == 0xFF) { // ASCII + chars[charIndex++] = (char)b; + continue; + } else { + lastByte = b; + continue; + } + } + int ord = ((lastByte - 0x81) * 191 + b - 0x40) * 2; + char c1 = (ord < 0 || ord + 1 >= gb2312.n2u.Length) ? + '\0' : (char)(gb2312.n2u[ord] + gb2312.n2u[ord + 1] * 256); + if (c1 == 0) + chars[charIndex++] = '?'; + else + chars[charIndex++] = c1; + lastByte = 0; + } + return charIndex - origIndex; } // Get a decoder that handles a rolling Gb2312 state. @@ -162,113 +184,42 @@ namespace I18N.CJK { get { return("gb2312"); } } - } - - // Decoder that handles a rolling Gb2312 state. - sealed class CP936Decoder : DbcsEncoding.DbcsDecoder - { - // Constructor. - public CP936Decoder (DbcsConvert convert) - : base (convert) - { - } - - int last_byte_count, last_byte_bytes; - - // Get the characters that result from decoding a byte buffer. - public override int GetCharCount (byte [] bytes, int index, int count) - { - return GetCharCount (bytes, index, count, false); - } - -#if NET_2_0 - public override -#endif - int GetCharCount (byte [] bytes, int index, int count, bool refresh) - { - CheckRange (bytes, index, count); - - int lastByte = last_byte_count; - last_byte_count = 0; - int length = 0; - while (count-- > 0) { - int b = bytes [index++]; - if (lastByte == 0) { - if (b <= 0x80 || b == 0xFF) { // ASCII - length++; - continue; - } else { - lastByte = b; - continue; + + // Decoder that handles a rolling Gb2312 state. + private sealed class CP936Decoder : DbcsDecoder + { + // Constructor. + public CP936Decoder(DbcsConvert convert) : base(convert) {} + + public override int GetChars(byte[] bytes, int byteIndex, int byteCount, + char[] chars, int charIndex) + { + base.GetChars(bytes, byteIndex, byteCount, chars, charIndex); + int origIndex = charIndex; + while (byteCount-- > 0) { + int b = bytes[byteIndex++]; + if (lastByte == 0) { + if (b <= 0x80 || b == 0xFF) { // ASCII + chars[charIndex++] = (char)b; + continue; + } else if (b < 0x81 || b >= 0xFF) { + continue; + } else { + lastByte = b; + continue; + } } - } - length++; - lastByte = 0; - } - - if (lastByte != 0) { - if (refresh) { - length++; - last_byte_count = 0; - } - else - last_byte_count = lastByte; - } - - return length; - } - - public override int GetChars (byte[] bytes, int byteIndex, int byteCount, - char[] chars, int charIndex) - { - return GetChars (bytes, byteIndex, byteCount, chars, charIndex, false); - } - -#if NET_2_0 - public override -#endif - int GetChars (byte [] bytes, int byteIndex, int byteCount, - char [] chars, int charIndex, bool refresh) - { - CheckRange (bytes, byteIndex, byteCount, chars, charIndex); - - int origIndex = charIndex; - int lastByte = last_byte_bytes; - last_byte_bytes = 0; - while (byteCount-- > 0) { - int b = bytes[byteIndex++]; - if (lastByte == 0) { - if (b <= 0x80 || b == 0xFF) { // ASCII - chars[charIndex++] = (char)b; - continue; - } else if (b < 0x81 || b >= 0xFF) { - continue; + int ord = ((lastByte - 0x81) * 191 + b - 0x40) * 2; + char c1 = (char)(convert.n2u[ord] + convert.n2u[ord + 1] * 256); + if (c1 == 0) { + chars[charIndex++] = '?'; } else { - lastByte = b; - continue; + chars[charIndex++] = c1; } + lastByte = 0; } - int ord = ((lastByte - 0x81) * 191 + b - 0x40) * 2; - char c1 = ord < 0 || ord >= convert.n2u.Length ? - '\0' : (char) (convert.n2u[ord] + convert.n2u[ord + 1] * 256); - if (c1 == 0) - chars[charIndex++] = '?'; - else - chars[charIndex++] = c1; - lastByte = 0; - } - - if (lastByte != 0) { - if (refresh) { - // FIXME: handle fallback - chars [charIndex++] = '?'; - last_byte_bytes = 0; - } - else - last_byte_bytes = lastByte; + return charIndex - origIndex; } - - return charIndex - origIndex; } } |