X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Text%2FUTF8Encoding.cs;h=2c00c72eeaf43682588adfc19c1a40b9b3c86417;hb=7e18ed47c9606f3981e7b18cbc238d6781843153;hp=6e165e5ba22d846547ce00498e03daa9f374f299;hpb=a64ccb6ec117d3a8d79f6af72771ac3721fc0dad;p=mono.git diff --git a/mcs/class/corlib/System.Text/UTF8Encoding.cs b/mcs/class/corlib/System.Text/UTF8Encoding.cs index 6e165e5ba22..2c00c72eeaf 100644 --- a/mcs/class/corlib/System.Text/UTF8Encoding.cs +++ b/mcs/class/corlib/System.Text/UTF8Encoding.cs @@ -375,8 +375,7 @@ public class UTF8Encoding : Encoding // state between multiple calls to this method. private static int InternalGetCharCount ( byte[] bytes, int index, int count, uint leftOverBits, - uint leftOverCount, object provider, - ref DecoderFallbackBuffer fallbackBuffer, bool flush) + uint leftOverCount, DecoderFallbackBuffer fallbackBuffer, bool flush) #else private static int InternalGetCharCount ( byte[] bytes, int index, int count, uint leftOverBits, @@ -436,7 +435,7 @@ public class UTF8Encoding : Encoding } else { // Invalid UTF-8 start character. #if NET_2_0 - length += Fallback (provider, ref fallbackBuffer, bytes, index - 1); + length += Fallback (fallbackBuffer, bytes, index - 1); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -470,7 +469,7 @@ public class UTF8Encoding : Encoding } if (overlong) { #if NET_2_0 - length += Fallback (provider, ref fallbackBuffer, bytes, index - 1); + length += Fallback (fallbackBuffer, bytes, index - 1); #else if (throwOnInvalid) throw new ArgumentException (_("Overlong"), leftBits.ToString ()); @@ -482,7 +481,7 @@ public class UTF8Encoding : Encoding length += 2; } else { #if NET_2_0 - length += Fallback (provider, ref fallbackBuffer, bytes, index - 1); + length += Fallback (fallbackBuffer, bytes, index - 1); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -493,7 +492,7 @@ public class UTF8Encoding : Encoding } else { // Invalid UTF-8 sequence: clear and restart. #if NET_2_0 - length += Fallback (provider, ref fallbackBuffer, bytes, index - 1); + length += Fallback (fallbackBuffer, bytes, index - 1); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -508,7 +507,7 @@ public class UTF8Encoding : Encoding // We had left-over bytes that didn't make up // a complete UTF-8 character sequence. #if NET_2_0 - length += Fallback (provider, ref fallbackBuffer, bytes, index - 1); + length += Fallback (fallbackBuffer, bytes, index - 1); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -521,30 +520,16 @@ public class UTF8Encoding : Encoding #if NET_2_0 // for GetCharCount() - static int Fallback (object provider, ref DecoderFallbackBuffer buffer, byte [] bytes, int index) + static int Fallback (DecoderFallbackBuffer buffer, byte [] bytes, int index) { - if (buffer == null) { - DecoderFallback fb = provider as DecoderFallback; - if (fb != null) - buffer = fb.CreateFallbackBuffer (); - else - buffer = ((Decoder) provider).FallbackBuffer; - } buffer.Fallback (bytes, index - 1); return buffer.Remaining; } // for GetChars() - static void Fallback (object provider, ref DecoderFallbackBuffer buffer, byte [] bytes, int byteIndex, + static void Fallback (DecoderFallbackBuffer buffer, byte [] bytes, int byteIndex, char [] chars, ref int charIndex) { - if (buffer == null) { - DecoderFallback fb = provider as DecoderFallback; - if (fb != null) - buffer = fb.CreateFallbackBuffer (); - else - buffer = ((Decoder) provider).FallbackBuffer; - } buffer.Fallback (bytes, byteIndex - 1); while (buffer.Remaining > 0) chars [charIndex++] = buffer.GetNextChar (); @@ -555,8 +540,7 @@ public class UTF8Encoding : Encoding public override int GetCharCount (byte[] bytes, int index, int count) { #if NET_2_0 - DecoderFallbackBuffer buf = null; - return InternalGetCharCount (bytes, index, count, 0, 0, DecoderFallback, ref buf, true); + return InternalGetCharCount (bytes, index, count, 0, 0, DecoderFallback.CreateFallbackBuffer (), true); #else return InternalGetCharCount (bytes, index, count, 0, 0, throwOnInvalid, true); #endif @@ -567,8 +551,7 @@ public class UTF8Encoding : Encoding private static int InternalGetChars ( byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex, ref uint leftOverBits, ref uint leftOverCount, - object provider, - ref DecoderFallbackBuffer fallbackBuffer, bool flush) + DecoderFallbackBuffer fallbackBuffer, bool flush) #else private static int InternalGetChars ( byte[] bytes, int byteIndex, int byteCount, char[] chars, @@ -603,14 +586,10 @@ public class UTF8Encoding : Encoding uint leftBits = leftOverBits; uint leftSoFar = (leftOverCount & (uint)0x0F); uint leftSize = ((leftOverCount >> 4) & (uint)0x0F); - - int byteEnd = byteIndex + byteCount; - if (byteEnd < 0 || byteEnd > bytes.Length) - throw new SystemException (String.Format ("INTERNAL ERROR: should not happen: {0} {1} {2}", byteIndex, byteCount, byteEnd)); - - for(; byteIndex < byteEnd; byteIndex++) { + while (byteCount > 0) { // Fetch the next character from the byte buffer. - ch = (uint)(bytes[byteIndex]); + ch = (uint)(bytes[byteIndex++]); + --byteCount; if (leftSize == 0) { // Process a UTF-8 start character. if (ch < (uint)0x0080) { @@ -647,7 +626,7 @@ public class UTF8Encoding : Encoding } else { // Invalid UTF-8 start character. #if NET_2_0 - Fallback (provider, ref fallbackBuffer, bytes, byteIndex, chars, ref posn); + Fallback (fallbackBuffer, bytes, byteIndex, chars, ref posn); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -681,7 +660,7 @@ public class UTF8Encoding : Encoding } if (overlong) { #if NET_2_0 - Fallback (provider, ref fallbackBuffer, bytes, byteIndex, chars, ref posn); + Fallback (fallbackBuffer, bytes, byteIndex, chars, ref posn); #else if (throwOnInvalid) throw new ArgumentException (_("Overlong"), leftBits.ToString ()); @@ -706,7 +685,7 @@ public class UTF8Encoding : Encoding (char)((leftBits & (uint)0x3FF) + (uint)0xDC00); } else { #if NET_2_0 - Fallback (provider, ref fallbackBuffer, bytes, byteIndex, chars, ref posn); + Fallback (fallbackBuffer, bytes, byteIndex, chars, ref posn); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -717,13 +696,14 @@ public class UTF8Encoding : Encoding } else { // Invalid UTF-8 sequence: clear and restart. #if NET_2_0 - Fallback (provider, ref fallbackBuffer, bytes, byteIndex, chars, ref posn); + Fallback (fallbackBuffer, bytes, byteIndex, chars, ref posn); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); #endif leftSize = 0; --byteIndex; + ++byteCount; } } } @@ -731,7 +711,7 @@ public class UTF8Encoding : Encoding // We had left-over bytes that didn't make up // a complete UTF-8 character sequence. #if NET_2_0 - Fallback (provider, ref fallbackBuffer, bytes, byteIndex, chars, ref posn); + Fallback (fallbackBuffer, bytes, byteIndex, chars, ref posn); #else if (throwOnInvalid) throw new ArgumentException (_("Arg_InvalidUTF8"), "bytes"); @@ -751,9 +731,8 @@ public class UTF8Encoding : Encoding uint leftOverBits = 0; uint leftOverCount = 0; #if NET_2_0 - DecoderFallbackBuffer buf = null; return InternalGetChars (bytes, byteIndex, byteCount, chars, - charIndex, ref leftOverBits, ref leftOverCount, DecoderFallback, ref buf, true); + charIndex, ref leftOverBits, ref leftOverCount, DecoderFallback.CreateFallbackBuffer (), true); #else return InternalGetChars (bytes, byteIndex, byteCount, chars, charIndex, ref leftOverBits, ref leftOverCount, throwOnInvalid, true); @@ -877,9 +856,8 @@ public class UTF8Encoding : Encoding public override int GetCharCount (byte[] bytes, int index, int count) { #if NET_2_0 - DecoderFallbackBuffer buf = null; return InternalGetCharCount (bytes, index, count, - leftOverBits, leftOverCount, this, ref buf, false); + leftOverBits, leftOverCount, FallbackBuffer, false); #else return InternalGetCharCount (bytes, index, count, leftOverBits, leftOverCount, throwOnInvalid, false); @@ -889,9 +867,8 @@ public class UTF8Encoding : Encoding int byteCount, char[] chars, int charIndex) { #if NET_2_0 - DecoderFallbackBuffer buf = null; return InternalGetChars (bytes, byteIndex, byteCount, - chars, charIndex, ref leftOverBits, ref leftOverCount, this, ref buf, false); + chars, charIndex, ref leftOverBits, ref leftOverCount, FallbackBuffer, false); #else return InternalGetChars (bytes, byteIndex, byteCount, chars, charIndex, ref leftOverBits, ref leftOverCount, throwOnInvalid, false);