X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Text%2FASCIIEncoding.cs;h=bb2ff31ac09816ee0ea7d13bb54102082c90998b;hb=8e98d66d5f2943115bbb8625eef4270f1ab66a44;hp=d795c7937a8ad7ba305e7a3e51cfd443fbc9281e;hpb=c4aef31eeea309e6a795c84c098ac8e1a2490340;p=mono.git diff --git a/mcs/class/corlib/System.Text/ASCIIEncoding.cs b/mcs/class/corlib/System.Text/ASCIIEncoding.cs index d795c7937a8..bb2ff31ac09 100644 --- a/mcs/class/corlib/System.Text/ASCIIEncoding.cs +++ b/mcs/class/corlib/System.Text/ASCIIEncoding.cs @@ -28,9 +28,13 @@ namespace System.Text { using System; +using System.Runtime.InteropServices; [Serializable] -[MonoTODO ("Fix serialization compatibility with MS.NET")] +#if NET_2_0 +[ComVisible (true)] +#endif +[MonoTODO ("Serialization format not compatible with .NET")] public class ASCIIEncoding : Encoding { // Magic number used by Windows for "ASCII". @@ -45,6 +49,7 @@ public class ASCIIEncoding : Encoding } #if NET_2_0 + [ComVisible (false)] public override bool IsSingleByte { get { return true; } } @@ -223,6 +228,18 @@ public class ASCIIEncoding : Encoding // Get the characters that result from decoding a byte buffer. public override int GetChars (byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { +#if NET_2_0 +// well, yes, I know this #if is ugly, but I think it is the simplest switch. + DecoderFallbackBuffer buffer = null; + return GetChars (bytes, byteIndex, byteCount, chars, + charIndex, ref buffer); + } + + int GetChars (byte[] bytes, int byteIndex, int byteCount, + char[] chars, int charIndex, + ref DecoderFallbackBuffer buffer) + { +#endif if (bytes == null) throw new ArgumentNullException ("bytes"); if (chars == null) @@ -239,10 +256,20 @@ public class ASCIIEncoding : Encoding int count = byteCount; while (count-- > 0) { - char c = (char)(bytes [byteIndex++]); - if (c > 127) - c = '?'; - chars [charIndex++] = c; + char c = (char) bytes [byteIndex++]; + if (c < '\x80') + chars [charIndex++] = c; + else { +#if NET_2_0 + if (buffer == null) + buffer = DecoderFallback.CreateFallbackBuffer (); + buffer.Fallback (bytes, byteIndex); + while (buffer.Remaining > 0) + chars [charIndex++] = buffer.GetNextChar (); +#else + chars [charIndex++] = '?'; +#endif + } } return byteCount; } @@ -283,14 +310,33 @@ public class ASCIIEncoding : Encoding return String.Empty; unsafe { - fixed (byte *ss = &bytes [0]) { - return new String ((sbyte*)ss, index, count); + fixed (byte* bytePtr = bytes) { + string s = string.InternalAllocateStr (count); + + fixed (char* charPtr = s) { + byte* currByte = bytePtr + index; + byte* lastByte = currByte + count; + char* currChar = charPtr; + + while (currByte < lastByte) { +#if NET_2_0 + byte b = currByte++ [0]; + currChar++ [0] = b <= 0x7F ? (char) b : (char) '?'; +#else + // GetString is incompatible with GetChars + currChar++ [0] = (char) (currByte++ [0] & 0x7F); +#endif + } + } + + return s; } } } #if NET_2_0 [CLSCompliantAttribute (false)] + [ComVisible (false)] public unsafe override int GetBytes (char *chars, int charCount, byte *bytes, int byteCount) { if (chars == null) @@ -313,6 +359,7 @@ public class ASCIIEncoding : Encoding } [CLSCompliantAttribute(false)] + [ComVisible (false)] public unsafe override int GetChars (byte *bytes, int byteCount, char *chars, int charCount) { if (bytes == null) @@ -335,12 +382,14 @@ public class ASCIIEncoding : Encoding } [CLSCompliantAttribute(false)] + [ComVisible (false)] public unsafe override int GetCharCount (byte *bytes, int count) { return count; } [CLSCompliantAttribute(false)] + [ComVisible (false)] public unsafe override int GetByteCount (char *chars, int count) { return count; @@ -352,17 +401,26 @@ public class ASCIIEncoding : Encoding if (bytes == null) { throw new ArgumentNullException ("bytes"); } - int count = bytes.Length; - if (count == 0) - return String.Empty; - unsafe { - fixed (byte *ss = &bytes [0]) { - return new String ((sbyte*)ss, 0, count); - } - } + + return GetString (bytes, 0, bytes.Length); + } +#endif + +#if NET_2_0 + [MonoTODO ("we have simple override to match method signature.")] + [ComVisible (false)] + public override Decoder GetDecoder () + { + return base.GetDecoder (); + } + + [MonoTODO ("we have simple override to match method signature.")] + [ComVisible (false)] + public override Encoder GetEncoder () + { + return base.GetEncoder (); } #endif - }; // class ASCIIEncoding }; // namespace System.Text