Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/I18N/CJK/CP936.cs')
-rw-r--r--mcs/class/I18N/CJK/CP936.cs223
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;
}
}