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/CP949.cs')
-rw-r--r--mcs/class/I18N/CJK/CP949.cs228
1 files changed, 71 insertions, 157 deletions
diff --git a/mcs/class/I18N/CJK/CP949.cs b/mcs/class/I18N/CJK/CP949.cs
index de4628c77fe..4bba03c1012 100644
--- a/mcs/class/I18N/CJK/CP949.cs
+++ b/mcs/class/I18N/CJK/CP949.cs
@@ -3,7 +3,6 @@
//
// Author:
// Hye-Shik Chang (perky@FreeBSD.org)
-// Atsushi Enomoto <atsushi@ximian.com>
//
using System;
@@ -105,52 +104,18 @@ namespace I18N.CJK
internal class KoreanEncoding : DbcsEncoding
{
// Constructor.
- public KoreanEncoding (int codepage, bool useUHC)
- : base (codepage, 949) {
+ public KoreanEncoding (int codepage, bool useUHC) : base (codepage) {
this.useUHC = useUHC;
}
internal override DbcsConvert GetConvert ()
{
- return DbcsConvert.KS;
+ return KSConvert.Convert;
}
bool useUHC;
// Get the bytes that result from encoding a character buffer.
- public unsafe override int GetByteCountImpl (char* chars, int count)
- {
- int index = 0;
- int length = 0;
- DbcsConvert convert = GetConvert ();
-#if NET_2_0
- EncoderFallbackBuffer buffer = null;
-#endif
-
- // 00 00 - FF FF
- while (count-- > 0) {
- char c = chars[index++];
- if (c <= 0x80 || c == 0xFF) { // ASCII
- length++;
- continue;
- }
- byte b1 = convert.u2n[((int)c) * 2];
- byte b2 = convert.u2n[((int)c) * 2 + 1];
- if (b1 == 0 && b2 == 0) {
-#if NET_2_0
- // FIXME: handle fallback for GetByteCountImpl().
- length++;
-#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)
{
@@ -187,16 +152,77 @@ 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);
- }
-
- // 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 convert = GetConvert ();
+ 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;
+ }
+ }
+
+ char c1;
+ if (useUHC && lastByte < 0xa1) { // UHC Level 1
+ int ord = 8836 + (lastByte - 0x81) * 178;
+
+ if (b >= 0x41 && b <= 0x5A)
+ ord += b - 0x41;
+ else if (b >= 0x61 && b <= 0x7A)
+ ord += b - 0x61 + 26;
+ else if (b >= 0x81 && b <= 0xFE)
+ ord += b - 0x81 + 52;
+ else
+ ord = -1;
+
+ if (ord >= 0 && ord * 2 <= convert.n2u.Length)
+ c1 = (char)(convert.n2u[ord*2] +
+ convert.n2u[ord*2 + 1] * 256);
+ else
+ c1 = (char)0;
+ } else if (useUHC && lastByte <= 0xC6 && b < 0xa1) { // UHC Level 2
+ int ord = 14532 + (lastByte - 0xA1) * 84;
+
+ if (b >= 0x41 && b <= 0x5A)
+ ord += b - 0x41;
+ else if (b >= 0x61 && b <= 0x7A)
+ ord += b - 0x61 + 26;
+ else if (b >= 0x81 && b <= 0xA0)
+ ord += b - 0x81 + 52;
+ else
+ ord = -1;
+
+ if (ord >= 0 && ord * 2 < convert.n2u.Length)
+ c1 = (char)(convert.n2u[ord*2] +
+ convert.n2u[ord*2 + 1] * 256);
+ else
+ c1 = (char)0;
+ } else if (b >= 0xA1 && b <= 0xFE) { // KS X 1001
+ int ord = ((lastByte - 0xA1) * 94 + b - 0xA1) * 2;
+
+ c1 = ord < 0 || ord >= convert.n2u.Length ?
+ '\0' : (char)(convert.n2u[ord] +
+ convert.n2u[ord + 1] * 256);
+ } else
+ c1 = (char)0;
+
+ if (c1 == 0)
+ chars[charIndex++] = '?';
+ else
+ chars[charIndex++] = c1;
+ lastByte = 0;
+ }
+ return charIndex - origIndex;
}
// Get a decoder that handles a rolling UHC state.
@@ -215,115 +241,12 @@ namespace I18N.CJK
this.useUHC = useUHC;
}
bool useUHC;
- int last_byte_count, last_byte_conv;
-
- 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;
- }
- }
-
- char c1;
- if (useUHC && lastByte < 0xa1) { // UHC Level 1
- int ord = 8836 + (lastByte - 0x81) * 178;
-
- if (b >= 0x41 && b <= 0x5A)
- ord += b - 0x41;
- else if (b >= 0x61 && b <= 0x7A)
- ord += b - 0x61 + 26;
- else if (b >= 0x81 && b <= 0xFE)
- ord += b - 0x81 + 52;
- else
- ord = -1;
-
- if (ord >= 0 && ord * 2 <= convert.n2u.Length)
- c1 = (char)(convert.n2u[ord*2] +
- convert.n2u[ord*2 + 1] * 256);
- else
- c1 = (char)0;
- } else if (useUHC && lastByte <= 0xC6 && b < 0xA1) { // UHC Level 2
- int ord = 14532 + (lastByte - 0xA1) * 84;
-
- if (b >= 0x41 && b <= 0x5A)
- ord += b - 0x41;
- else if (b >= 0x61 && b <= 0x7A)
- ord += b - 0x61 + 26;
- else if (b >= 0x81 && b <= 0xA0)
- ord += b - 0x81 + 52;
- else
- ord = -1;
-
- if (ord >= 0 && ord * 2 <= convert.n2u.Length)
- c1 = (char)(convert.n2u[ord*2] +
- convert.n2u[ord*2 + 1] * 256);
- else
- c1 = (char)0;
- } else if (b >= 0xA1 && b <= 0xFE) { // KS X 1001
- int ord = ((lastByte - 0xA1) * 94 + b - 0xA1) * 2;
-
- c1 = ord < 0 || ord >= convert.n2u.Length ?
- '\0' : (char)(convert.n2u[ord] +
- convert.n2u[ord + 1] * 256);
- } else
- c1 = (char)0;
-
- if (c1 == 0)
- // FIXME: fallback
- length++;
- else
- length++;
- lastByte = 0;
- }
-
- if (lastByte != 0) {
- if (refresh) {
- // FIXME: fallback
- 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);
+ base.GetChars(bytes, byteIndex, byteCount, chars, charIndex);
int origIndex = charIndex;
- int lastByte = last_byte_conv;
- last_byte_conv = 0;
while (byteCount-- > 0) {
int b = bytes[byteIndex++];
if (lastByte == 0) {
@@ -386,15 +309,6 @@ namespace I18N.CJK
chars[charIndex++] = c1;
lastByte = 0;
}
-
- if (lastByte != 0) {
- if (refresh) {
- chars[charIndex++] = '?';
- last_byte_conv = 0;
- }
- else
- last_byte_conv = lastByte;
- }
return charIndex - origIndex;
}
}