X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem%2FUInt32.cs;h=bf83021ece2b11015465f9819e01e90527b4a343;hb=5bbfa8860b090e465a3aa45edeb9c94481ef1a22;hp=193144a94493e456b882fdcb16a8552f580b05d6;hpb=17b718a094830a83a55f81861c41e2ac2195b658;p=mono.git diff --git a/mcs/class/corlib/System/UInt32.cs b/mcs/class/corlib/System/UInt32.cs index 193144a9449..bf83021ece2 100644 --- a/mcs/class/corlib/System/UInt32.cs +++ b/mcs/class/corlib/System/UInt32.cs @@ -5,6 +5,26 @@ // Miguel de Icaza (miguel@ximian.com) // // (C) Ximian, Inc. http://www.ximian.com +// Copyright (C) 2004 Novell (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.Globalization; @@ -14,7 +34,10 @@ namespace System { [Serializable] [CLSCompliant (false)] - public struct UInt32 : IComparable, IFormattable, IConvertible + public struct UInt32 : IFormattable, IConvertible, IComparable +#if NET_2_0 + , IComparable, IEquatable +#endif { public const uint MaxValue = 0xffffffff; public const uint MinValue = 0; @@ -51,8 +74,24 @@ namespace System return (int) m_value; } - [CLSCompliant (false)] - public static uint Parse (string s) +#if NET_2_0 + public int CompareTo (uint value) + { + if (m_value == value) + return 0; + if (m_value > value) + return 1; + else + return -1; + } + + public bool Equals (uint value) + { + return value == m_value; + } +#endif + + internal static bool Parse (string s, bool tryParse, out uint result, out Exception exc) { uint val = 0; int len; @@ -60,8 +99,14 @@ namespace System bool digits_seen = false; bool has_negative_sign = false; - if (s == null) - throw new ArgumentNullException ("s"); + result = 0; + exc = null; + + if (s == null) { + if (!tryParse) + exc = new ArgumentNullException ("s"); + return false; + } len = s.Length; @@ -72,8 +117,11 @@ namespace System break; } - if (i == len) - throw new FormatException (); + if (i == len) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } if (s [i] == '+') i++; @@ -95,43 +143,54 @@ namespace System else { if (Char.IsWhiteSpace (c)) { for (i++; i < len; i++) { - if (!Char.IsWhiteSpace (s [i])) - throw new FormatException (); + if (!Char.IsWhiteSpace (s [i])) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } } break; - } else - throw new FormatException (); + } else { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } } } - if (!digits_seen) - throw new FormatException (); - - if (has_negative_sign) - throw new OverflowException (); + if (!digits_seen) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } - return val; - } + // -0 is legal but other negative values are not + if (has_negative_sign && (val > 0)) { + if (!tryParse) + exc = new OverflowException ( + Locale.GetText ("Negative number")); + return false; + } - [CLSCompliant (false)] - public static uint Parse (string s, IFormatProvider provider) - { - return Parse (s, NumberStyles.Integer, provider); + result = val; + return true; } - [CLSCompliant (false)] - public static uint Parse (string s, NumberStyles style) + internal static bool Parse (string s, NumberStyles style, IFormatProvider provider, bool tryParse, out uint result, out Exception exc) { - return Parse (s, style, null); - } + result = 0; + exc = null; - [CLSCompliant (false)] - public static uint Parse (string s, NumberStyles style, IFormatProvider provider) - { - if (s == null) - throw new ArgumentNullException ("s"); + if (s == null) { + if (!tryParse) + exc = new ArgumentNullException ("s"); + return false; + } - if (s.Length == 0) - throw new FormatException (Locale.GetText ("Input string was not in the correct format.")); + if (s.Length == 0) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } NumberFormatInfo nfi; if (provider != null) { @@ -141,10 +200,10 @@ namespace System else nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; - Int32.CheckStyle (style); + if (!Int32.CheckStyle (style, tryParse, ref exc)) + return false; bool AllowCurrencySymbol = (style & NumberStyles.AllowCurrencySymbol) != 0; - bool AllowExponent = (style & NumberStyles.AllowExponent) != 0; bool AllowHexSpecifier = (style & NumberStyles.AllowHexSpecifier) != 0; bool AllowThousands = (style & NumberStyles.AllowThousands) != 0; bool AllowDecimalPoint = (style & NumberStyles.AllowDecimalPoint) != 0; @@ -156,8 +215,8 @@ namespace System int pos = 0; - if (AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowLeadingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; bool foundOpenParentheses = false; bool negative = false; @@ -171,25 +230,32 @@ namespace System negative = true; // MS always make the number negative when there parentheses // even when NumberFormatInfo.NumberNegativePattern != 0!!! pos++; - if (AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowLeadingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; - if (s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign) - throw new FormatException (Locale.GetText ("Input string was not in the correct format.")); - if (s.Substring (pos, nfi.PositiveSign.Length) == nfi.PositiveSign) - throw new FormatException (Locale.GetText ("Input string was not in the correct format.")); + if (s.Substring (pos, nfi.NegativeSign.Length) == nfi.NegativeSign) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } + if (s.Substring (pos, nfi.PositiveSign.Length) == nfi.PositiveSign) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } } if (AllowLeadingSign && !foundSign) { // Sign + Currency Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative); if (foundSign) { - if (AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowLeadingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; if (AllowCurrencySymbol) { Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency); - if (foundCurrency && AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (foundCurrency && AllowLeadingWhite && + !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; } } } @@ -198,13 +264,14 @@ namespace System // Currency + sign Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency); if (foundCurrency) { - if (AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowLeadingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; if (foundCurrency) { if (!foundSign && AllowLeadingSign) { Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative); - if (foundSign && AllowLeadingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (foundSign && AllowLeadingWhite && + !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; } } } @@ -247,8 +314,11 @@ namespace System nDigits++; // Allows decimal point as long as it's only // followed by zeroes. - if (s [pos++] != '0') - throw new OverflowException (Locale.GetText ("Value too large or too small.")); + if (s [pos++] != '0') { + if (!tryParse) + exc = new OverflowException (Locale.GetText ("Value too large or too small.")); + return false; + } } else { nDigits++; @@ -257,21 +327,26 @@ namespace System number = checked (number * 10 + (uint) (s [pos++] - '0')); } catch (OverflowException) { - throw new OverflowException (Locale.GetText ("Value too large or too small.")); + if (!tryParse) + exc = new OverflowException (Locale.GetText ("Value too large or too small.")); + return false; } } } while (pos < s.Length); // Post number stuff - if (nDigits == 0) - throw new FormatException (Locale.GetText ("Input string was not in the correct format.")); + if (nDigits == 0) { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } if (AllowTrailingSign && !foundSign) { // Sign + Currency Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative); if (foundSign) { - if (AllowTrailingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowTrailingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; if (AllowCurrencySymbol) Int32. FindCurrency (ref pos, s, nfi, ref foundCurrency); } @@ -281,41 +356,115 @@ namespace System // Currency + sign Int32.FindCurrency (ref pos, s, nfi, ref foundCurrency); if (foundCurrency) { - if (AllowTrailingWhite) - pos = Int32.JumpOverWhite (pos, s, true); + if (AllowTrailingWhite && !Int32.JumpOverWhite (ref pos, s, true, tryParse, ref exc)) + return false; if (!foundSign && AllowTrailingSign) Int32.FindSign (ref pos, s, nfi, ref foundSign, ref negative); } } - if (AllowTrailingWhite && pos < s.Length) - pos = Int32.JumpOverWhite (pos, s, false); + if (AllowTrailingWhite && pos < s.Length && !Int32.JumpOverWhite (ref pos, s, false, tryParse, ref exc)) + return false; if (foundOpenParentheses) { - if (pos >= s.Length || s [pos++] != ')') - throw new FormatException (Locale.GetText - ("Input string was not in the correct format.")); - if (AllowTrailingWhite && pos < s.Length) - pos = Int32.JumpOverWhite (pos, s, false); + if (pos >= s.Length || s [pos++] != ')') { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } + if (AllowTrailingWhite && pos < s.Length && !Int32.JumpOverWhite (ref pos, s, false, tryParse, ref exc)) + return false; + } + + if (pos < s.Length && s [pos] != '\u0000') { + if (!tryParse) + exc = Int32.GetFormatException (); + return false; + } + + // -0 is legal but other negative values are not + if (negative && (number > 0)) { + if (!tryParse) + exc = new OverflowException ( + Locale.GetText ("Negative number")); + return false; } - if (pos < s.Length && s [pos] != '\u0000') - throw new FormatException (Locale.GetText ("Input string was not in the correct format.")); + result = number; + + return true; + } - if (negative) - throw new OverflowException (Locale.GetText ("Value too large or too small.")); + [CLSCompliant (false)] + public static uint Parse (string s) + { + Exception exc; + uint res; + + if (!Parse (s, false, out res, out exc)) + throw exc; + + return res; + } + + [CLSCompliant (false)] + public static uint Parse (string s, NumberStyles style, IFormatProvider fp) + { + Exception exc; + uint res; + + if (!Parse (s, style, fp, false, out res, out exc)) + throw exc; + + return res; + } + + [CLSCompliant (false)] + public static uint Parse (string s, IFormatProvider provider) + { + return Parse (s, NumberStyles.Integer, provider); + } + + [CLSCompliant (false)] + public static uint Parse (string s, NumberStyles style) + { + return Parse (s, style, null); + } + +#if NET_2_0 + [CLSCompliant (false)] + public static bool TryParse (string s, out uint result) + { + Exception exc; + if (!Parse (s, true, out result, out exc)) { + result = 0; + return false; + } + + return true; + } + + [CLSCompliant (false)] + public static bool TryParse (string s, NumberStyles style, IFormatProvider provider, out uint result) + { + Exception exc; + if (!Parse (s, style, provider, true, out result, out exc)) { + result = 0; + return false; + } - return number; + return true; } +#endif public override string ToString () { - return ToString (null, null); + return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value)); } public string ToString (IFormatProvider fp) { - return ToString (null, fp); + return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value), fp); } public string ToString (string format) @@ -326,11 +475,7 @@ namespace System public string ToString (string format, IFormatProvider fp) { NumberFormatInfo nfi = NumberFormatInfo.GetInstance (fp); - - if (format == null) - format = "G"; - - return IntegerFormatter.NumberToString (format, nfi, m_value); + return NumberFormatter.NumberToString (format, m_value, nfi); } // =========== IConvertible Methods =========== //