2004-04-24 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
authorAndreas N <andreas@mono-cvs.ximian.com>
Sat, 24 Apr 2004 22:19:06 +0000 (22:19 -0000)
committerAndreas N <andreas@mono-cvs.ximian.com>
Sat, 24 Apr 2004 22:19:06 +0000 (22:19 -0000)
* String.cs: Managed impl. of Invariant parts of ToLower, ToUpper
* Char.cs: Managed impl. of Invariant parts of ToLower, ToUpper

svn path=/trunk/mcs/; revision=25943

mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/Char.cs
mcs/class/corlib/System/String.cs

index 0627e544eac226c35e6a7881d14e4d2aa9634cd5..e9777c6b974dca680d553f3bef1c5bb279e9035e 100644 (file)
@@ -1,3 +1,8 @@
+2004-04-24  Andreas Nahr <ClassDevelopment@A-SoftTech.com>
+
+       * String.cs: Managed impl. of Invariant parts of ToLower, ToUpper
+       * Char.cs: Managed impl. of Invariant parts of ToLower, ToUpper
+
 2004-04-24  Andreas Nahr <ClassDevelopment@A-SoftTech.com>
 
        * String.cs: Check for null values
index 0fb0d020f6aded5e1a020eb57f4f00ce13ccce01..38380f0528cf3019862fb7c61e217d3a58d0d95f 100644 (file)
@@ -445,7 +445,15 @@ namespace System
                        return str [0];
                }
 
+               [MonoTODO ("Fix FIXME")]
                public static char ToLower (char c)
+               {
+                       // FIXME: needs to call line below, but that would probably break a lot of things right now
+                       // return InternalToLower (c, CultureInfo.CurrentCulture);
+                       return ToLowerInvariant (c);
+               }
+
+               internal static char ToLowerInvariant (char c)
                {
                        unsafe {
                                if (c <= ((char)0x24cf))
@@ -456,10 +464,28 @@ namespace System
                        return c;
                }
 
+               public static char ToLower (char c, CultureInfo culture)
+               {
+                       if (culture == null)
+                               throw new ArgumentNullException ("culture");
+                       if (culture.LCID == 0x007F) // Invariant
+                               return ToLowerInvariant (c);
+
+                       return InternalToLower (c, culture);
+               }
+
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               public static extern char ToLower (char c, CultureInfo culture);
+               private static extern char InternalToLower (char c, CultureInfo culture);
 
+               [MonoTODO ("Fix FIXME")]
                public static char ToUpper (char c)
+               {
+                       // FIXME: needs to call line below, but that would probably break a lot of things right now
+                       // return InternalToUpper (c, CultureInfo.CurrentCulture);
+                       return ToUpperInvariant (c);
+               }
+
+               internal static char ToUpperInvariant (char c)
                {
                        unsafe {
                                if (c <= ((char)0x24cf))
@@ -470,8 +496,18 @@ namespace System
                        return c;
                }
 
+               public static char ToUpper (char c, CultureInfo culture)
+               {
+                       if (culture == null)
+                               throw new ArgumentNullException ("culture");
+                       if (culture.LCID == 0x007F) // Invariant
+                               return ToUpperInvariant (c);
+
+                       return InternalToUpper (c, culture);
+               }
+
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               public static extern char ToUpper (char c, CultureInfo culture);
+               private static extern char InternalToUpper (char c, CultureInfo culture);
                
                public override string ToString ()
                {
index f85a442ce92143284b7c0781edf2aa8fb35a0293..0c5681c2bcdb89fcb66a838d3e80527ca5484f30 100644 (file)
@@ -676,27 +676,59 @@ namespace System
 
                public String ToLower ()
                {
+                       // CurrentCulture can never be invariant or null
                        return InternalToLower (CultureInfo.CurrentCulture);
                }
 
-               public String ToLower (CultureInfo culture)
+               public unsafe String ToLower (CultureInfo culture)
                {
                        if (culture == null)
                                throw new ArgumentNullException ("culture");
 
+                       if (culture.LCID == 0x007F) { // Invariant
+                               string tmp = InternalAllocateStr (length);
+                               fixed (char* source = &start_char, dest = tmp) {
+
+                                       char* destPtr = (char*)dest;
+                                       char* sourcePtr = (char*)source;
+
+                                       for (int n = 0; n < length; n++) {
+                                               *destPtr = Char.ToLower (*sourcePtr);
+                                               sourcePtr++;
+                                               destPtr++;
+                                       }
+                               }
+                               return tmp;
+                       }
                        return InternalToLower (culture);
                }
 
                public String ToUpper ()
                {
+                       // CurrentCulture can never be invariant or null
                        return InternalToUpper (CultureInfo.CurrentCulture);
                }
 
-               public String ToUpper (CultureInfo culture)
+               public unsafe String ToUpper (CultureInfo culture)
                {
                        if (culture == null)
                                throw new ArgumentNullException ("culture");
 
+                       if (culture.LCID == 0x007F) { // Invariant
+                               string tmp = InternalAllocateStr (length);
+                               fixed (char* source = &start_char, dest = tmp) {
+
+                                       char* destPtr = (char*)dest;
+                                       char* sourcePtr = (char*)source;
+
+                                       for (int n = 0; n < length; n++) {
+                                               *destPtr = Char.ToUpper (*sourcePtr);
+                                               sourcePtr++;
+                                               destPtr++;
+                                       }
+                               }
+                               return tmp;
+                       }
                        return InternalToUpper (culture);
                }