Wed Sep 11 15:26:34 CEST 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mcs / class / corlib / System / UInt32.cs
index 109031ba17838bd0a0d629dc1196af085a8a1255..aa409a9288013e327b3b7ada699ad308d7d04114 100644 (file)
@@ -19,7 +19,7 @@ namespace System {
                public const uint MaxValue = 0xffffffff;
                public const uint MinValue = 0;
                
-               public uint value;
+               internal uint value;
 
                public int CompareTo (object v)
                {
@@ -58,6 +58,7 @@ namespace System {
                        int len;
                        int i;
                        bool digits_seen = false;
+                       bool has_negative_sign = false;
                        
                        if (s == null)
                                throw new ArgumentNullException (Locale.GetText ("s is null"));
@@ -76,6 +77,11 @@ namespace System {
 
                        if (s [i] == '+')
                                i++;
+                       else
+                               if (s[i] == '-'){
+                                       i++;
+                                       has_negative_sign = true;
+                               }
 
                        for (; i < len; i++){
                                c = s [i];
@@ -99,8 +105,10 @@ namespace System {
                        if (!digits_seen)
                                throw new FormatException ();
                        
-                       return val;
+                       if (has_negative_sign)
+                               throw new OverflowException ();
 
+                       return val;
                }
 
                [CLSCompliant(false)]
@@ -115,77 +123,6 @@ namespace System {
                        return Parse (s, style, null);
                }
 
-               private delegate bool IsAnything (Char c);
-
-               private static void CheckStyle (NumberStyles style)
-               {
-                       if ((style & NumberStyles.AllowHexSpecifier) != 0) {
-                               NumberStyles ne = style ^ NumberStyles.AllowHexSpecifier;
-                               if ((ne & NumberStyles.AllowLeadingWhite) != 0)
-                                       ne ^= NumberStyles.AllowLeadingWhite;
-                               if ((ne & NumberStyles.AllowTrailingWhite) != 0)
-                                       ne ^= NumberStyles.AllowTrailingWhite;
-                               if (ne != 0)
-                                       throw new ArgumentException (
-                                               "With AllowHexSpecifier only " + 
-                                               "AllowLeadingWhite and AllowTrailingWhite " + 
-                                               "are permitted.");
-                       }
-               }
-       
-               private static int JumpOverWhite (int pos, string s, bool excp)
-               {
-                       while (pos < s.Length && Char.IsWhiteSpace (s [pos]))
-                               pos++;
-
-                       if (excp && pos >= s.Length)
-                               throw new FormatException ("Input string was not in the correct format.");
-
-                       return pos;
-               }
-
-               private static void FindSign (ref int pos, string s, NumberFormatInfo nfi, 
-                                     ref bool foundSign, ref bool negative)
-               {
-                       if ((pos + nfi.NegativeSign.Length) <= s.Length &&
-                            s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign) {
-                               negative = true;
-                               foundSign = true;
-                               pos += nfi.NegativeSign.Length;
-                       } 
-                       else if ((pos + nfi.PositiveSign.Length) < s.Length &&
-                            s.Substring (pos, nfi.PositiveSign.Length) == nfi.PositiveSign) {
-                               negative = false;
-                               pos += nfi.PositiveSign.Length;
-                               foundSign = true;
-                       } 
-               }
-
-               private static void FindCurrency (ref int pos,
-                                                 string s, 
-                                                 NumberFormatInfo nfi,
-                                                 ref bool foundCurrency)
-               {
-                       if ((pos + nfi.CurrencySymbol.Length) <= s.Length &&
-                            s.Substring (pos, nfi.CurrencySymbol.Length) == nfi.CurrencySymbol) {
-                               foundCurrency = true;
-                               pos += nfi.CurrencySymbol.Length;
-                       } 
-               }
-
-               private static bool FindOther (ref int pos,
-                                              string s, 
-                                              string other)
-               {
-                       if ((pos + other.Length) <= s.Length &&
-                            s.Substring (pos, other.Length) == other) {
-                               pos += other.Length;
-                               return true;
-                       } 
-
-                       return false;
-               }
-
                [CLSCompliant(false)]
                public static uint Parse (string s, NumberStyles style, IFormatProvider fp)
                {
@@ -203,7 +140,7 @@ namespace System {
                        else
                                nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;
 
-                       CheckStyle (style);
+                       Int32.CheckStyle (style);
 
                        bool AllowCurrencySymbol = (style & NumberStyles.AllowCurrencySymbol) != 0;
                        bool AllowExponent = (style & NumberStyles.AllowExponent) != 0;
@@ -219,7 +156,7 @@ namespace System {
                        int pos = 0;
 
                        if (AllowLeadingWhite)
-                               pos = JumpOverWhite (pos, s, true);
+                               pos = Int32.JumpOverWhite (pos, s, true);
 
                        bool foundOpenParentheses = false;
                        bool negative = false;
@@ -234,7 +171,7 @@ namespace System {
                                                 // even when NumberFormatInfo.NumberNegativePattern != 0!!!
                                pos++;
                                if (AllowLeadingWhite)
-                                       pos = JumpOverWhite (pos, s, true);
+                                       pos = Int32.JumpOverWhite (pos, s, true);
 
                                if (s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign)
                                        throw new FormatException ("Input string was not in the correct format.");
@@ -244,42 +181,36 @@ namespace System {
 
                        if (AllowLeadingSign && !foundSign) {
                                // Sign + Currency
-                               FindSign (ref pos, s, nfi, ref foundSign, ref negative);
+                               Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative);
                                if (foundSign) {
                                        if (AllowLeadingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (AllowCurrencySymbol) {
-                                               FindCurrency (ref pos, s, nfi,
-                                                             ref foundCurrency);
+                                               Int32.FindCurrency (ref pos, s, nfi,
+                                                                   ref foundCurrency);
                                                if (foundCurrency && AllowLeadingWhite)
-                                                       pos = JumpOverWhite (pos, s, true);
+                                                       pos = Int32.JumpOverWhite (pos, s, true);
                                        }
                                }
                        }
                        
                        if (AllowCurrencySymbol && !foundCurrency) {
                                // Currency + sign
-                               FindCurrency (ref pos, s, nfi, ref foundCurrency);
+                               Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency);
                                if (foundCurrency) {
                                        if (AllowLeadingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (foundCurrency) {
                                                if (!foundSign && AllowLeadingSign) {
-                                                       FindSign (ref pos, s, nfi, ref foundSign,
-                                                                 ref negative);
+                                                       Int32.FindSign (ref pos, s, nfi, ref foundSign,
+                                                                       ref negative);
                                                        if (foundSign && AllowLeadingWhite)
-                                                               pos = JumpOverWhite (pos, s, true);
+                                                               pos = Int32.JumpOverWhite (pos, s, true);
                                                }
                                        }
                                }
                        }
                        
-                       IsAnything validDigit;
-                       if (AllowHexSpecifier)
-                               validDigit = new IsAnything (Char.IsNumber);
-                       else
-                               validDigit = new IsAnything (Char.IsDigit);
-                       
                        uint number = 0;
                        int nDigits = 0;
                        bool decimalPointFound = false;
@@ -290,13 +221,13 @@ namespace System {
                        // Just the same as Int32, but this one adds instead of substract
                        do {
 
-                               if (!validDigit (s [pos])) {
+                               if (!Int32.ValidDigit (s [pos], AllowHexSpecifier)) {
                                        if (AllowThousands &&
-                                           FindOther (ref pos, s, nfi.NumberGroupSeparator))
+                                           Int32.FindOther (ref pos, s, nfi.NumberGroupSeparator))
                                            continue;
                                        else
                                        if (!decimalPointFound && AllowDecimalPoint &&
-                                           FindOther (ref pos, s, nfi.NumberDecimalSeparator)) {
+                                           Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)) {
                                            decimalPointFound = true;
                                            continue;
                                        }
@@ -342,40 +273,40 @@ namespace System {
 
                        if (AllowTrailingSign && !foundSign) {
                                // Sign + Currency
-                               FindSign (ref pos, s, nfi, ref foundSign, ref negative);
+                               Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative);
                                if (foundSign) {
                                        if (AllowTrailingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (AllowCurrencySymbol)
-                                               FindCurrency (ref pos, s, nfi,
-                                                             ref foundCurrency);
+                                               Int32. FindCurrency (ref pos, s, nfi,
+                                                                    ref foundCurrency);
                                }
                        }
                        
                        if (AllowCurrencySymbol && !foundCurrency) {
                                // Currency + sign
-                               FindCurrency (ref pos, s, nfi, ref foundCurrency);
+                               Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency);
                                if (foundCurrency) {
                                        if (AllowTrailingWhite)
-                                               pos = JumpOverWhite (pos, s, true);
+                                               pos = Int32.JumpOverWhite (pos, s, true);
                                        if (!foundSign && AllowTrailingSign)
-                                               FindSign (ref pos, s, nfi, ref foundSign,
-                                                         ref negative);
+                                               Int32.FindSign (ref pos, s, nfi, ref foundSign,
+                                                               ref negative);
                                }
                        }
                        
                        if (AllowTrailingWhite && pos < s.Length)
-                               pos = JumpOverWhite (pos, s, false);
+                               pos = Int32.JumpOverWhite (pos, s, false);
 
                        if (foundOpenParentheses) {
                                if (pos >= s.Length || s [pos++] != ')')
                                        throw new FormatException ("Input string was not in the correct " + 
                                                                   "format.");
                                if (AllowTrailingWhite && pos < s.Length)
-                                       pos = JumpOverWhite (pos, s, false);
+                                       pos = Int32.JumpOverWhite (pos, s, false);
                        }
 
-                       if (pos < s.Length)
+                       if (pos < s.Length && s [pos] != '\u0000')
                                throw new FormatException ("Input string was not in the correct format.");
 
                        if (negative)
@@ -416,81 +347,81 @@ namespace System {
                        return TypeCode.UInt32;
                }
 
-               public bool ToBoolean (IFormatProvider provider)
+               bool IConvertible.ToBoolean (IFormatProvider provider)
                {
                        return System.Convert.ToBoolean (value);
                }
 
-               public byte ToByte (IFormatProvider provider)
+               byte IConvertible.ToByte (IFormatProvider provider)
                {
                        return System.Convert.ToByte (value);
                }
 
-               public char ToChar (IFormatProvider provider)
+               char IConvertible.ToChar (IFormatProvider provider)
                {
                        return System.Convert.ToChar (value);
                }
 
-               public DateTime ToDateTime (IFormatProvider provider)
+               DateTime IConvertible.ToDateTime (IFormatProvider provider)
                {
                        return System.Convert.ToDateTime (value);
                }
 
-               public decimal ToDecimal (IFormatProvider provider)
+               decimal IConvertible.ToDecimal (IFormatProvider provider)
                {
                        return System.Convert.ToDecimal (value);
                }
 
-               public double ToDouble (IFormatProvider provider)
+               double IConvertible.ToDouble (IFormatProvider provider)
                {
                        return System.Convert.ToDouble (value);
                }
 
-               public short ToInt16 (IFormatProvider provider)
+               short IConvertible.ToInt16 (IFormatProvider provider)
                {
                        return System.Convert.ToInt16 (value);
                }
 
-               public int ToInt32 (IFormatProvider provider)
+               int IConvertible.ToInt32 (IFormatProvider provider)
                {
                        return System.Convert.ToInt32 (value);
                }
 
-               public long ToInt64 (IFormatProvider provider)
+               long IConvertible.ToInt64 (IFormatProvider provider)
                {
                        return System.Convert.ToInt64 (value);
                }
 
                [CLSCompliant (false)]
-               public sbyte ToSByte (IFormatProvider provider)
+               sbyte IConvertible.ToSByte (IFormatProvider provider)
                {
                        return System.Convert.ToSByte (value);
                }
                
-               public float ToSingle (IFormatProvider provider)
+               float IConvertible.ToSingle (IFormatProvider provider)
                {
                        return System.Convert.ToSingle (value);
                }
 
-               public object ToType (Type conversionType, IFormatProvider provider)
+               object IConvertible.ToType (Type conversionType, IFormatProvider provider)
                {
                        return System.Convert.ToType (value, conversionType, provider);
                }
 
                [CLSCompliant (false)]
-               public ushort ToUInt16 (IFormatProvider provider)
+               ushort IConvertible.ToUInt16 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt16 (value);
                }
 
                [CLSCompliant (false)]
-               public uint ToUInt32 (IFormatProvider provider)
+               uint IConvertible.ToUInt32 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt32 (value);
                }
 
                [CLSCompliant (false)]
-               public ulong ToUInt64 (IFormatProvider provider)
+               ulong IConvertible.ToUInt64 (IFormatProvider provider)
                {
                        return System.Convert.ToUInt64 (value);
                }