X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Text%2FASCIIEncoding.cs;h=a7bfed19f47e50309153552c37d79834130a556d;hb=7e18ed47c9606f3981e7b18cbc238d6781843153;hp=89201ae2cc31b4fe4ac1e3e4a34032f679a66d03;hpb=e0cfa4925e036038f7be27e1b9208aa90b27b441;p=mono.git diff --git a/mcs/class/corlib/System.Text/ASCIIEncoding.cs b/mcs/class/corlib/System.Text/ASCIIEncoding.cs index 89201ae2cc3..a7bfed19f47 100644 --- a/mcs/class/corlib/System.Text/ASCIIEncoding.cs +++ b/mcs/class/corlib/System.Text/ASCIIEncoding.cs @@ -72,6 +72,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 +111,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 +176,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,27 +215,22 @@ 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 (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++]); @@ -218,13 +274,73 @@ 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); } } } + +#if NET_2_0 + [CLSCompliantAttribute (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)] + 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)] + public unsafe override int GetCharCount (byte *bytes, int count) + { + return count; + } + + [CLSCompliantAttribute(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) { @@ -239,7 +355,8 @@ public class ASCIIEncoding : Encoding } } } - +#endif + }; // class ASCIIEncoding }; // namespace System.Text