X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Text%2FASCIIEncoding.cs;h=bb2ff31ac09816ee0ea7d13bb54102082c90998b;hb=8e98d66d5f2943115bbb8625eef4270f1ab66a44;hp=89201ae2cc31b4fe4ac1e3e4a34032f679a66d03;hpb=a8dea00dfb9bf386c75c32be9c5279d0e4ed62c4;p=mono.git diff --git a/mcs/class/corlib/System.Text/ASCIIEncoding.cs b/mcs/class/corlib/System.Text/ASCIIEncoding.cs old mode 100755 new mode 100644 index 89201ae2cc3..bb2ff31ac09 --- 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". @@ -44,6 +48,13 @@ public class ASCIIEncoding : Encoding is_mail_news_save = true; } +#if NET_2_0 + [ComVisible (false)] + public override bool IsSingleByte { + get { return true; } + } +#endif + // Get the number of bytes needed to encode a character buffer. public override int GetByteCount (char[] chars, int index, int count) { @@ -72,6 +83,20 @@ public class ASCIIEncoding : Encoding public override int GetBytes (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { +#if NET_2_0 +// well, yes, I know this #if is ugly, but I think it is the simplest switch. + EncoderFallbackBuffer buffer = null; + char [] fallback_chars = null; + return GetBytes (chars, charIndex, charCount, bytes, + byteIndex, ref buffer, ref fallback_chars); + } + + int GetBytes (char[] chars, int charIndex, int charCount, + byte[] bytes, int byteIndex, + ref EncoderFallbackBuffer buffer, + ref char [] fallback_chars) + { +#endif if (chars == null) { throw new ArgumentNullException ("chars"); } @@ -97,16 +122,46 @@ public class ASCIIEncoding : Encoding if (ch < (char)0x80) { bytes [byteIndex++] = (byte)ch; } else { +#if NET_2_0 + if (buffer == null) + buffer = EncoderFallback.CreateFallbackBuffer (); + if (Char.IsSurrogate (ch) && count > 1 && + Char.IsSurrogate (chars [charIndex])) + buffer.Fallback (ch, chars [charIndex], charIndex++ - 1); + else + buffer.Fallback (ch, charIndex - 1); + if (fallback_chars == null || fallback_chars.Length < buffer.Remaining) + fallback_chars = new char [buffer.Remaining]; + for (int i = 0; i < fallback_chars.Length; i++) + fallback_chars [i] = buffer.GetNextChar (); + byteIndex += GetBytes (fallback_chars, 0, + fallback_chars.Length, bytes, byteIndex, + ref buffer, ref fallback_chars); +#else bytes [byteIndex++] = (byte)'?'; +#endif } } return charCount; } // Convenience wrappers for "GetBytes". - public override int GetBytes (String s, int charIndex, int charCount, - byte[] bytes, int byteIndex) + public override int GetBytes (String s, int charIndex, int charCount, byte[] bytes, int byteIndex) + { +#if NET_2_0 +// I know this #if is ugly, but I think it is the simplest switch. + EncoderFallbackBuffer buffer = null; + char [] fallback_chars = null; + return GetBytes (s, charIndex, charCount, bytes, byteIndex, + ref buffer, ref fallback_chars); + } + + int GetBytes (String s, int charIndex, int charCount, + byte[] bytes, int byteIndex, + ref EncoderFallbackBuffer buffer, + ref char [] fallback_chars) { +#endif if (s == null) { throw new ArgumentNullException ("s"); } @@ -132,7 +187,24 @@ public class ASCIIEncoding : Encoding if (ch < (char)0x80) { bytes [byteIndex++] = (byte)ch; } else { +#if NET_2_0 + if (buffer == null) + buffer = EncoderFallback.CreateFallbackBuffer (); + if (Char.IsSurrogate (ch) && count > 1 && + Char.IsSurrogate (s [charIndex])) + buffer.Fallback (ch, s [charIndex], charIndex++ - 1); + else + buffer.Fallback (ch, charIndex - 1); + if (fallback_chars == null || fallback_chars.Length < buffer.Remaining) + fallback_chars = new char [buffer.Remaining]; + for (int i = 0; i < fallback_chars.Length; i++) + fallback_chars [i] = buffer.GetNextChar (); + byteIndex += GetBytes (fallback_chars, 0, + fallback_chars.Length, bytes, byteIndex, + ref buffer, ref fallback_chars); +#else bytes [byteIndex++] = (byte)'?'; +#endif } } return charCount; @@ -154,33 +226,50 @@ 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) + public override int GetChars (byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { - if (bytes == null) { +#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) { + if (chars == null) throw new ArgumentNullException ("chars"); - } - if (byteIndex < 0 || byteIndex > bytes.Length) { + if (byteIndex < 0 || byteIndex > bytes.Length) throw new ArgumentOutOfRangeException ("byteIndex", _("ArgRange_Array")); - } - if (byteCount < 0 || byteCount > (bytes.Length - byteIndex)) { + if (byteCount < 0 || byteCount > (bytes.Length - byteIndex)) throw new ArgumentOutOfRangeException ("byteCount", _("ArgRange_Array")); - } - if (charIndex < 0 || charIndex > chars.Length) { + if (charIndex < 0 || charIndex > chars.Length) throw new ArgumentOutOfRangeException ("charIndex", _("ArgRange_Array")); - } - if ((chars.Length - charIndex) < byteCount) { + + if ((chars.Length - charIndex) < byteCount) throw new ArgumentException (_("Arg_InsufficientSpace")); - } + 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; } @@ -218,28 +307,120 @@ public class ASCIIEncoding : Encoding throw new ArgumentOutOfRangeException ("count", _("ArgRange_Array")); } if (count == 0) - return String.Empty; + 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) + throw new ArgumentNullException ("chars"); + if (bytes == null) + throw new ArgumentNullException ("bytes"); + if (charCount < 0) + throw new ArgumentOutOfRangeException ("charCount"); + if (byteCount < 0) + throw new ArgumentOutOfRangeException ("byteCount"); + + if (byteCount < charCount) + throw new ArgumentException ("bytecount is less than the number of bytes required", "byteCount"); + + for (int i = 0; i < charCount; i++){ + char c = chars [i]; + bytes [i] = (byte) ((c < (char) 0x80) ? c : '?'); + } + return charCount; + } + + [CLSCompliantAttribute(false)] + [ComVisible (false)] + public unsafe override int GetChars (byte *bytes, int byteCount, char *chars, int charCount) + { + if (bytes == null) + throw new ArgumentNullException ("bytes"); + if (chars == null) + throw new ArgumentNullException ("chars"); + if (charCount < 0) + throw new ArgumentOutOfRangeException ("charCount"); + if (byteCount < 0) + throw new ArgumentOutOfRangeException ("byteCount"); + if (charCount < byteCount) + throw new ArgumentException ("charcount is less than the number of bytes required", "charCount"); + + for (int i = 0; i < byteCount; i++){ + byte b = bytes [i]; + chars [i] = b > 127 ? '?' : (char) b; + } + return byteCount; + + } + + [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; + } +#else + // This routine is gone in 2.x public override String GetString (byte[] bytes) { 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