From 04ba68bae5e0891c983484a64f36059f4cf7dd59 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Korn=C3=A9l=20P=C3=A1l?= Date: Tue, 18 Jul 2006 14:30:38 +0000 Subject: [PATCH] ASCIIEncoding.cs: Fixed GetString () methods to use ASCII rather than new string (sbyte*, int, int) that uses Encoding.Default.; Latin1Encoding.cs: Fixed GetString () methods to use Latin 1 rather than new string (sbyte*, int, int) that uses Encoding.Default. svn path=/trunk/mcs/; revision=62703 --- mcs/class/corlib/System.Text/ASCIIEncoding.cs | 32 +++++++++++++------ mcs/class/corlib/System.Text/ChangeLog | 7 ++++ .../corlib/System.Text/Latin1Encoding.cs | 25 +++++++++------ 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/mcs/class/corlib/System.Text/ASCIIEncoding.cs b/mcs/class/corlib/System.Text/ASCIIEncoding.cs index 6d394217aa2..bf66099e87a 100644 --- a/mcs/class/corlib/System.Text/ASCIIEncoding.cs +++ b/mcs/class/corlib/System.Text/ASCIIEncoding.cs @@ -310,8 +310,26 @@ 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; } } } @@ -383,14 +401,8 @@ 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 diff --git a/mcs/class/corlib/System.Text/ChangeLog b/mcs/class/corlib/System.Text/ChangeLog index 2b36a3d94dd..700c5acf418 100644 --- a/mcs/class/corlib/System.Text/ChangeLog +++ b/mcs/class/corlib/System.Text/ChangeLog @@ -1,3 +1,10 @@ +2006-07-18 Kornél Pál + + * ASCIIEncoding.cs: Fixed GetString () methods to use ASCII rather + than new string (sbyte*, int, int) that uses Encoding.Default. + * Latin1Encoding.cs: Fixed GetString () methods to use Latin 1 rather + than new string (sbyte*, int, int) that uses Encoding.Default. + 2006-07-11 Kornél Pál * StringBuilder.cs: Pad the string with NULL characters when setting diff --git a/mcs/class/corlib/System.Text/Latin1Encoding.cs b/mcs/class/corlib/System.Text/Latin1Encoding.cs index 4d48d8783d1..77429f53ef6 100644 --- a/mcs/class/corlib/System.Text/Latin1Encoding.cs +++ b/mcs/class/corlib/System.Text/Latin1Encoding.cs @@ -286,8 +286,19 @@ internal class Latin1Encoding : Encoding if (count == 0) 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) + currChar++ [0] = (char) currByte++ [0]; + } + + return s; } } } @@ -296,14 +307,8 @@ internal class Latin1Encoding : 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); } #if !ECMA_COMPAT -- 2.25.1