ASCIIEncoding.cs: Fixed GetString () methods to use ASCII rather than new string...
authorKornél Pál <kornelpal@gmail.com>
Tue, 18 Jul 2006 14:30:38 +0000 (14:30 -0000)
committerKornél Pál <kornelpal@gmail.com>
Tue, 18 Jul 2006 14:30:38 +0000 (14:30 -0000)
svn path=/trunk/mcs/; revision=62703

mcs/class/corlib/System.Text/ASCIIEncoding.cs
mcs/class/corlib/System.Text/ChangeLog
mcs/class/corlib/System.Text/Latin1Encoding.cs

index 6d394217aa22508878f0a49473e2d55081c056e6..bf66099e87a22fbeb457ea86469c2601a3f1951d 100644 (file)
@@ -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
 
index 2b36a3d94ddff18493e42cc5e19d021381efdfd7..700c5acf4181ebada750611db8fd41129ad96ce3 100644 (file)
@@ -1,3 +1,10 @@
+2006-07-18  Kornél Pál  <kornelpal@gmail.com>
+
+       * 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  <kornelpal@gmail.com>
 
        * StringBuilder.cs: Pad the string with NULL characters when setting
index 4d48d8783d1e6597f609ebedbb225bf81601f877..77429f53ef645103f7fef027f0da1c41e7a2395e 100644 (file)
@@ -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