diff options
Diffstat (limited to 'src/mscorlib/src/System/Guid.cs')
-rw-r--r-- | src/mscorlib/src/System/Guid.cs | 873 |
1 files changed, 521 insertions, 352 deletions
diff --git a/src/mscorlib/src/System/Guid.cs b/src/mscorlib/src/System/Guid.cs index 1116faf027..f64211d5d0 100644 --- a/src/mscorlib/src/System/Guid.cs +++ b/src/mscorlib/src/System/Guid.cs @@ -2,17 +2,18 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -namespace System { - - using System; - using System.Globalization; - using System.Text; - using Microsoft.Win32; - using System.Runtime.InteropServices; - using System.Runtime.CompilerServices; - using System.Diagnostics; - using System.Diagnostics.Contracts; +using System; +using System.Globalization; +using System.Text; +using Microsoft.Win32; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace System +{ // Represents a Globally Unique Identifier. [StructLayout(LayoutKind.Sequential)] [Serializable] @@ -24,17 +25,17 @@ namespace System { //////////////////////////////////////////////////////////////////////////////// // Member variables //////////////////////////////////////////////////////////////////////////////// - private int _a; - private short _b; - private short _c; - private byte _d; - private byte _e; - private byte _f; - private byte _g; - private byte _h; - private byte _i; - private byte _j; - private byte _k; + private int _a; + private short _b; + private short _c; + private byte _d; + private byte _e; + private byte _f; + private byte _g; + private byte _h; + private byte _i; + private byte _j; + private byte _k; @@ -46,10 +47,10 @@ namespace System { // public Guid(byte[] b) { - if (b==null) + if (b == null) throw new ArgumentNullException(nameof(b)); if (b.Length != 16) - throw new ArgumentException(Environment.GetResourceString("Arg_GuidArrayCtor", "16"), nameof(b)); + throw new ArgumentException(SR.Format(SR.Arg_GuidArrayCtor, "16"), nameof(b)); Contract.EndContractBlock(); _a = ((int)b[3] << 24) | ((int)b[2] << 16) | ((int)b[1] << 8) | b[0]; @@ -66,7 +67,7 @@ namespace System { } [CLSCompliant(false)] - public Guid (uint a, ushort b, ushort c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k) + public Guid(uint a, ushort b, ushort c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k) { _a = (int)a; _b = (short)b; @@ -86,16 +87,16 @@ namespace System { // public Guid(int a, short b, short c, byte[] d) { - if (d==null) + if (d == null) throw new ArgumentNullException(nameof(d)); // Check that array is not too big - if(d.Length != 8) - throw new ArgumentException(Environment.GetResourceString("Arg_GuidArrayCtor", "8"), nameof(d)); + if (d.Length != 8) + throw new ArgumentException(SR.Format(SR.Arg_GuidArrayCtor, "8"), nameof(d)); Contract.EndContractBlock(); - _a = a; - _b = b; - _c = c; + _a = a; + _b = b; + _c = c; _d = d[0]; _e = d[1]; _f = d[2]; @@ -125,41 +126,45 @@ namespace System { } [Flags] - private enum GuidStyles { - None = 0x00000000, - AllowParenthesis = 0x00000001, //Allow the guid to be enclosed in parens - AllowBraces = 0x00000002, //Allow the guid to be enclosed in braces - AllowDashes = 0x00000004, //Allow the guid to contain dash group separators - AllowHexPrefix = 0x00000008, //Allow the guid to contain {0xdd,0xdd} - RequireParenthesis = 0x00000010, //Require the guid to be enclosed in parens - RequireBraces = 0x00000020, //Require the guid to be enclosed in braces - RequireDashes = 0x00000040, //Require the guid to contain dash group separators - RequireHexPrefix = 0x00000080, //Require the guid to contain {0xdd,0xdd} - - HexFormat = RequireBraces | RequireHexPrefix, /* X */ - NumberFormat = None, /* N */ - DigitFormat = RequireDashes, /* D */ - BraceFormat = RequireBraces | RequireDashes, /* B */ - ParenthesisFormat = RequireParenthesis | RequireDashes, /* P */ - - Any = AllowParenthesis | AllowBraces | AllowDashes | AllowHexPrefix, + private enum GuidStyles + { + None = 0x00000000, + AllowParenthesis = 0x00000001, //Allow the guid to be enclosed in parens + AllowBraces = 0x00000002, //Allow the guid to be enclosed in braces + AllowDashes = 0x00000004, //Allow the guid to contain dash group separators + AllowHexPrefix = 0x00000008, //Allow the guid to contain {0xdd,0xdd} + RequireParenthesis = 0x00000010, //Require the guid to be enclosed in parens + RequireBraces = 0x00000020, //Require the guid to be enclosed in braces + RequireDashes = 0x00000040, //Require the guid to contain dash group separators + RequireHexPrefix = 0x00000080, //Require the guid to contain {0xdd,0xdd} + + HexFormat = RequireBraces | RequireHexPrefix, /* X */ + NumberFormat = None, /* N */ + DigitFormat = RequireDashes, /* D */ + BraceFormat = RequireBraces | RequireDashes, /* B */ + ParenthesisFormat = RequireParenthesis | RequireDashes, /* P */ + + Any = AllowParenthesis | AllowBraces | AllowDashes | AllowHexPrefix, } - private enum GuidParseThrowStyle { - None = 0, - All = 1, - AllButOverflow = 2 + private enum GuidParseThrowStyle + { + None = 0, + All = 1, + AllButOverflow = 2 } - private enum ParseFailureKind { - None = 0, - ArgumentNull = 1, - Format = 2, - FormatWithParameter = 3, - NativeException = 4, + private enum ParseFailureKind + { + None = 0, + ArgumentNull = 1, + Format = 2, + FormatWithParameter = 3, + NativeException = 4, FormatWithInnerException = 5 } // This will store the result of the parsing. And it will eventually be used to construct a Guid instance. - private struct GuidResult { + private struct GuidResult + { internal Guid parsedGuid; internal GuidParseThrowStyle throwStyle; @@ -169,53 +174,61 @@ namespace System { internal string m_failureArgumentName; internal Exception m_innerException; - internal void Init(GuidParseThrowStyle canThrow) { + internal void Init(GuidParseThrowStyle canThrow) + { parsedGuid = Guid.Empty; - throwStyle = canThrow; + throwStyle = canThrow; } - internal void SetFailure(Exception nativeException) { + internal void SetFailure(Exception nativeException) + { m_failure = ParseFailureKind.NativeException; m_innerException = nativeException; } - internal void SetFailure(ParseFailureKind failure, string failureMessageID) { + internal void SetFailure(ParseFailureKind failure, string failureMessageID) + { SetFailure(failure, failureMessageID, null, null, null); } - internal void SetFailure(ParseFailureKind failure, string failureMessageID, object failureMessageFormatArgument) { + internal void SetFailure(ParseFailureKind failure, string failureMessageID, object failureMessageFormatArgument) + { SetFailure(failure, failureMessageID, failureMessageFormatArgument, null, null); } internal void SetFailure(ParseFailureKind failure, string failureMessageID, object failureMessageFormatArgument, - string failureArgumentName, Exception innerException) { + string failureArgumentName, Exception innerException) + { Debug.Assert(failure != ParseFailureKind.NativeException, "ParseFailureKind.NativeException should not be used with this overload"); m_failure = failure; m_failureMessageID = failureMessageID; m_failureMessageFormatArgument = failureMessageFormatArgument; m_failureArgumentName = failureArgumentName; m_innerException = innerException; - if (throwStyle != GuidParseThrowStyle.None) { + if (throwStyle != GuidParseThrowStyle.None) + { throw GetGuidParseException(); } } - internal Exception GetGuidParseException() { - switch (m_failure) { - case ParseFailureKind.ArgumentNull: - return new ArgumentNullException(m_failureArgumentName, Environment.GetResourceString(m_failureMessageID)); + internal Exception GetGuidParseException() + { + switch (m_failure) + { + case ParseFailureKind.ArgumentNull: + return new ArgumentNullException(m_failureArgumentName, SR.GetResourceString(m_failureMessageID)); - case ParseFailureKind.FormatWithInnerException: - return new FormatException(Environment.GetResourceString(m_failureMessageID), m_innerException); + case ParseFailureKind.FormatWithInnerException: + return new FormatException(SR.GetResourceString(m_failureMessageID), m_innerException); - case ParseFailureKind.FormatWithParameter: - return new FormatException(Environment.GetResourceString(m_failureMessageID, m_failureMessageFormatArgument)); + case ParseFailureKind.FormatWithParameter: + return new FormatException(SR.Format(SR.GetResourceString(m_failureMessageID), m_failureMessageFormatArgument)); - case ParseFailureKind.Format: - return new FormatException(Environment.GetResourceString(m_failureMessageID)); + case ParseFailureKind.Format: + return new FormatException(SR.GetResourceString(m_failureMessageID)); - case ParseFailureKind.NativeException: - return m_innerException; + case ParseFailureKind.NativeException: + return m_innerException; - default: - Debug.Assert(false, "Unknown GuidParseFailure: " + m_failure); - return new FormatException(Environment.GetResourceString("Format_GuidUnrecognized")); + default: + Debug.Assert(false, "Unknown GuidParseFailure: " + m_failure); + return new FormatException(SR.Format_GuidUnrecognized); } } } @@ -230,7 +243,8 @@ namespace System { // public Guid(String g) { - if (g==null) { + if (g == null) + { throw new ArgumentNullException(nameof(g)); } Contract.EndContractBlock(); @@ -238,10 +252,12 @@ namespace System { GuidResult result = new GuidResult(); result.Init(GuidParseThrowStyle.All); - if (TryParseGuid(g, GuidStyles.Any, ref result)) { + if (TryParseGuid(g, GuidStyles.Any, ref result)) + { this = result.parsedGuid; } - else { + else + { throw result.GetGuidParseException(); } } @@ -249,17 +265,20 @@ namespace System { public static Guid Parse(String input) { - if (input == null) { + if (input == null) + { throw new ArgumentNullException(nameof(input)); } Contract.EndContractBlock(); GuidResult result = new GuidResult(); result.Init(GuidParseThrowStyle.AllButOverflow); - if (TryParseGuid(input, GuidStyles.Any, ref result)) { + if (TryParseGuid(input, GuidStyles.Any, ref result)) + { return result.parsedGuid; } - else { + else + { throw result.GetGuidParseException(); } } @@ -268,11 +287,13 @@ namespace System { { GuidResult parseResult = new GuidResult(); parseResult.Init(GuidParseThrowStyle.None); - if (TryParseGuid(input, GuidStyles.Any, ref parseResult)) { + if (TryParseGuid(input, GuidStyles.Any, ref parseResult)) + { result = parseResult.parsedGuid; return true; } - else { + else + { result = Guid.Empty; return false; } @@ -286,45 +307,55 @@ namespace System { if (format == null) throw new ArgumentNullException(nameof(format)); - if( format.Length != 1) { + if (format.Length != 1) + { // all acceptable format strings are of length 1 - throw new FormatException(Environment.GetResourceString("Format_InvalidGuidFormatSpecification")); + throw new FormatException(SR.Format_InvalidGuidFormatSpecification); } GuidStyles style; char formatCh = format[0]; - if (formatCh == 'D' || formatCh == 'd') { + if (formatCh == 'D' || formatCh == 'd') + { style = GuidStyles.DigitFormat; - } - else if (formatCh == 'N' || formatCh == 'n') { + } + else if (formatCh == 'N' || formatCh == 'n') + { style = GuidStyles.NumberFormat; } - else if (formatCh == 'B' || formatCh == 'b') { + else if (formatCh == 'B' || formatCh == 'b') + { style = GuidStyles.BraceFormat; } - else if (formatCh == 'P' || formatCh == 'p') { + else if (formatCh == 'P' || formatCh == 'p') + { style = GuidStyles.ParenthesisFormat; } - else if (formatCh == 'X' || formatCh == 'x') { + else if (formatCh == 'X' || formatCh == 'x') + { style = GuidStyles.HexFormat; } - else { - throw new FormatException(Environment.GetResourceString("Format_InvalidGuidFormatSpecification")); + else + { + throw new FormatException(SR.Format_InvalidGuidFormatSpecification); } GuidResult result = new GuidResult(); result.Init(GuidParseThrowStyle.AllButOverflow); - if (TryParseGuid(input, style, ref result)) { + if (TryParseGuid(input, style, ref result)) + { return result.parsedGuid; } - else { + else + { throw result.GetGuidParseException(); } } public static bool TryParseExact(String input, String format, out Guid result) { - if (format == null || format.Length != 1) { + if (format == null || format.Length != 1) + { result = Guid.Empty; return false; } @@ -332,22 +363,28 @@ namespace System { GuidStyles style; char formatCh = format[0]; - if (formatCh == 'D' || formatCh == 'd') { + if (formatCh == 'D' || formatCh == 'd') + { style = GuidStyles.DigitFormat; - } - else if (formatCh == 'N' || formatCh == 'n') { + } + else if (formatCh == 'N' || formatCh == 'n') + { style = GuidStyles.NumberFormat; } - else if (formatCh == 'B' || formatCh == 'b') { + else if (formatCh == 'B' || formatCh == 'b') + { style = GuidStyles.BraceFormat; } - else if (formatCh == 'P' || formatCh == 'p') { + else if (formatCh == 'P' || formatCh == 'p') + { style = GuidStyles.ParenthesisFormat; } - else if (formatCh == 'X' || formatCh == 'x') { + else if (formatCh == 'X' || formatCh == 'x') + { style = GuidStyles.HexFormat; } - else { + else + { // invalid guid format specification result = Guid.Empty; return false; @@ -355,11 +392,13 @@ namespace System { GuidResult parseResult = new GuidResult(); parseResult.Init(GuidParseThrowStyle.None); - if (TryParseGuid(input, style, ref parseResult)) { + if (TryParseGuid(input, style, ref parseResult)) + { result = parseResult.parsedGuid; return true; } - else { + else + { result = Guid.Empty; return false; } @@ -368,13 +407,15 @@ namespace System { private static bool TryParseGuid(String g, GuidStyles flags, ref GuidResult result) { - if (g == null) { + if (g == null) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } String guidString = g.Trim(); //Remove Whitespace - if (guidString.Length == 0) { + if (guidString.Length == 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } @@ -382,15 +423,19 @@ namespace System { // Check for dashes bool dashesExistInString = (guidString.IndexOf('-', 0) >= 0); - if (dashesExistInString) { - if ((flags & (GuidStyles.AllowDashes | GuidStyles.RequireDashes)) == 0) { + if (dashesExistInString) + { + if ((flags & (GuidStyles.AllowDashes | GuidStyles.RequireDashes)) == 0) + { // dashes are not allowed result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } } - else { - if ((flags & GuidStyles.RequireDashes) != 0) { + else + { + if ((flags & GuidStyles.RequireDashes) != 0) + { // dashes are required result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; @@ -400,15 +445,19 @@ namespace System { // Check for braces bool bracesExistInString = (guidString.IndexOf('{', 0) >= 0); - if (bracesExistInString) { - if ((flags & (GuidStyles.AllowBraces | GuidStyles.RequireBraces)) == 0) { + if (bracesExistInString) + { + if ((flags & (GuidStyles.AllowBraces | GuidStyles.RequireBraces)) == 0) + { // braces are not allowed result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } } - else { - if ((flags & GuidStyles.RequireBraces) != 0) { + else + { + if ((flags & GuidStyles.RequireBraces) != 0) + { // braces are required result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; @@ -417,50 +466,61 @@ namespace System { // Check for parenthesis bool parenthesisExistInString = (guidString.IndexOf('(', 0) >= 0); - - if (parenthesisExistInString) { - if ((flags & (GuidStyles.AllowParenthesis | GuidStyles.RequireParenthesis)) == 0) { + + if (parenthesisExistInString) + { + if ((flags & (GuidStyles.AllowParenthesis | GuidStyles.RequireParenthesis)) == 0) + { // parenthesis are not allowed result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } } - else { - if ((flags & GuidStyles.RequireParenthesis) != 0) { + else + { + if ((flags & GuidStyles.RequireParenthesis) != 0) + { // parenthesis are required result.SetFailure(ParseFailureKind.Format, "Format_GuidUnrecognized"); return false; } } - try { + try + { // let's get on with the parsing - if (dashesExistInString) { + if (dashesExistInString) + { // Check if it's of the form [{|(]dddddddd-dddd-dddd-dddd-dddddddddddd[}|)] return TryParseGuidWithDashes(guidString, ref result); } - else if (bracesExistInString) { + else if (bracesExistInString) + { // Check if it's of the form {0xdddddddd,0xdddd,0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}} return TryParseGuidWithHexPrefix(guidString, ref result); } - else { + else + { // Check if it's of the form dddddddddddddddddddddddddddddddd return TryParseGuidWithNoStyle(guidString, ref result); } } - catch(IndexOutOfRangeException ex) { + catch (IndexOutOfRangeException ex) + { result.SetFailure(ParseFailureKind.FormatWithInnerException, "Format_GuidUnrecognized", null, null, ex); return false; } - catch (ArgumentException ex) { + catch (ArgumentException ex) + { result.SetFailure(ParseFailureKind.FormatWithInnerException, "Format_GuidUnrecognized", null, null, ex); return false; - } + } } - + // Check if it's of the form {0xdddddddd,0xdddd,0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}} - private static bool TryParseGuidWithHexPrefix(String guidString, ref GuidResult result) { + private static bool TryParseGuidWithHexPrefix(String guidString, ref GuidResult result) + { int numStart = 0; int numLen = 0; @@ -468,13 +528,15 @@ namespace System { guidString = EatAllWhitespace(guidString); // Check for leading '{' - if(String.IsNullOrEmpty(guidString) || guidString[0] != '{') { + if (String.IsNullOrEmpty(guidString) || guidString[0] != '{') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidBrace"); return false; } // Check for '0x' - if(!IsHexPrefix(guidString, 1)) { + if (!IsHexPrefix(guidString, 1)) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidHexPrefix", "{0xdddddddd, etc}"); return false; } @@ -482,7 +544,8 @@ namespace System { // Find the end of this hex number (since it is not fixed length) numStart = 3; numLen = guidString.IndexOf(',', numStart) - numStart; - if(numLen <= 0) { + if (numLen <= 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidComma"); return false; } @@ -492,14 +555,16 @@ namespace System { return false; // Check for '0x' - if(!IsHexPrefix(guidString, numStart+numLen+1)) { + if (!IsHexPrefix(guidString, numStart + numLen + 1)) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidHexPrefix", "{0xdddddddd, 0xdddd, etc}"); return false; } // +3 to get by ',0x' numStart = numStart + numLen + 3; numLen = guidString.IndexOf(',', numStart) - numStart; - if(numLen <= 0) { + if (numLen <= 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidComma"); return false; } @@ -508,14 +573,16 @@ namespace System { if (!StringToShort(guidString.Substring(numStart, numLen) /*first DWORD*/, -1, ParseNumbers.IsTight, out result.parsedGuid._b, ref result)) return false; // Check for '0x' - if(!IsHexPrefix(guidString, numStart+numLen+1)) { + if (!IsHexPrefix(guidString, numStart + numLen + 1)) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidHexPrefix", "{0xdddddddd, 0xdddd, 0xdddd, etc}"); return false; } // +3 to get by ',0x' numStart = numStart + numLen + 3; numLen = guidString.IndexOf(',', numStart) - numStart; - if(numLen <= 0) { + if (numLen <= 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidComma"); return false; } @@ -523,9 +590,10 @@ namespace System { // Read in the number if (!StringToShort(guidString.Substring(numStart, numLen) /*first DWORD*/, -1, ParseNumbers.IsTight, out result.parsedGuid._c, ref result)) return false; - + // Check for '{' - if(guidString.Length <= numStart+numLen+1 || guidString[numStart+numLen+1] != '{') { + if (guidString.Length <= numStart + numLen + 1 || guidString[numStart + numLen + 1] != '{') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidBrace"); return false; } @@ -534,10 +602,11 @@ namespace System { numLen++; byte[] bytes = new byte[8]; - for(int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { // Check for '0x' - if(!IsHexPrefix(guidString, numStart+numLen+1)) { + if (!IsHexPrefix(guidString, numStart + numLen + 1)) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidHexPrefix", "{... { ... 0xdd, ...}}"); return false; } @@ -546,33 +615,37 @@ namespace System { numStart = numStart + numLen + 3; // Calculate number length - if(i < 7) // first 7 cases + if (i < 7) // first 7 cases { numLen = guidString.IndexOf(',', numStart) - numStart; - if(numLen <= 0) { + if (numLen <= 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidComma"); return false; - } + } } else // last case ends with '}', not ',' { numLen = guidString.IndexOf('}', numStart) - numStart; - if(numLen <= 0) { + if (numLen <= 0) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidBraceAfterLastNumber"); return false; - } + } } // Read in the number int signedNumber; - if (!StringToInt(guidString.Substring(numStart, numLen), -1, ParseNumbers.IsTight, out signedNumber, ref result)) { + if (!StringToInt(guidString.Substring(numStart, numLen), -1, ParseNumbers.IsTight, out signedNumber, ref result)) + { return false; } uint number = (uint)signedNumber; // check for overflow - if(number > 255) { - result.SetFailure(ParseFailureKind.Format, "Overflow_Byte"); + if (number > 255) + { + result.SetFailure(ParseFailureKind.Format, "Overflow_Byte"); return false; } bytes[i] = (byte)number; @@ -588,40 +661,48 @@ namespace System { result.parsedGuid._k = bytes[7]; // Check for last '}' - if(numStart+numLen+1 >= guidString.Length || guidString[numStart+numLen+1] != '}') { + if (numStart + numLen + 1 >= guidString.Length || guidString[numStart + numLen + 1] != '}') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidEndBrace"); return false; } // Check if we have extra characters at the end - if( numStart+numLen+1 != guidString.Length -1) { + if (numStart + numLen + 1 != guidString.Length - 1) + { result.SetFailure(ParseFailureKind.Format, "Format_ExtraJunkAtEnd"); return false; } - + return true; } - + // Check if it's of the form dddddddddddddddddddddddddddddddd - private static bool TryParseGuidWithNoStyle(String guidString, ref GuidResult result) { - int startPos=0; + private static bool TryParseGuidWithNoStyle(String guidString, ref GuidResult result) + { + int startPos = 0; int temp; long templ; int currentPos = 0; - if(guidString.Length != 32) { + if (guidString.Length != 32) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - for(int i= 0; i< guidString.Length; i++) { + for (int i = 0; i < guidString.Length; i++) + { char ch = guidString[i]; - if(ch >= '0' && ch <= '9') { + if (ch >= '0' && ch <= '9') + { continue; } - else { + else + { char upperCaseCh = Char.ToUpper(ch, CultureInfo.InvariantCulture); - if(upperCaseCh >= 'A' && upperCaseCh <= 'F') { + if (upperCaseCh >= 'A' && upperCaseCh <= 'F') + { continue; } } @@ -651,20 +732,21 @@ namespace System { if (!StringToLong(guidString, ref currentPos, ParseNumbers.NoSpace, out templ, ref result)) return false; - if (currentPos - startPos!=12) { + if (currentPos - startPos != 12) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - result.parsedGuid._d = (byte)(temp>>8); + result.parsedGuid._d = (byte)(temp >> 8); result.parsedGuid._e = (byte)(temp); temp = (int)(templ >> 32); - result.parsedGuid._f = (byte)(temp>>8); + result.parsedGuid._f = (byte)(temp >> 8); result.parsedGuid._g = (byte)(temp); temp = (int)(templ); - result.parsedGuid._h = (byte)(temp>>24); - result.parsedGuid._i = (byte)(temp>>16); - result.parsedGuid._j = (byte)(temp>>8); + result.parsedGuid._h = (byte)(temp >> 24); + result.parsedGuid._i = (byte)(temp >> 16); + result.parsedGuid._j = (byte)(temp >> 8); result.parsedGuid._k = (byte)(temp); return true; @@ -672,36 +754,43 @@ namespace System { // Check if it's of the form [{|(]dddddddd-dddd-dddd-dddd-dddddddddddd[}|)] - private static bool TryParseGuidWithDashes(String guidString, ref GuidResult result) { - int startPos=0; + private static bool TryParseGuidWithDashes(String guidString, ref GuidResult result) + { + int startPos = 0; int temp; long templ; int currentPos = 0; // check to see that it's the proper length - if (guidString[0]=='{') { - if (guidString.Length!=38 || guidString[37]!='}') { + if (guidString[0] == '{') + { + if (guidString.Length != 38 || guidString[37] != '}') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - startPos=1; + startPos = 1; } - else if (guidString[0]=='(') { - if (guidString.Length!=38 || guidString[37]!=')') { + else if (guidString[0] == '(') + { + if (guidString.Length != 38 || guidString[37] != ')') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - startPos=1; + startPos = 1; } - else if(guidString.Length != 36) { + else if (guidString.Length != 36) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - if (guidString[8+startPos] != '-' || - guidString[13+startPos] != '-' || - guidString[18+startPos] != '-' || - guidString[23+startPos] != '-') { + if (guidString[8 + startPos] != '-' || + guidString[13 + startPos] != '-' || + guidString[18 + startPos] != '-' || + guidString[23 + startPos] != '-') + { result.SetFailure(ParseFailureKind.Format, "Format_GuidDashes"); return false; } @@ -725,24 +814,25 @@ namespace System { if (!StringToInt(guidString, ref currentPos, 4, ParseNumbers.NoSpace, out temp, ref result)) return false; ++currentPos; //Increment past the '-'; - startPos=currentPos; + startPos = currentPos; if (!StringToLong(guidString, ref currentPos, ParseNumbers.NoSpace, out templ, ref result)) return false; - if (currentPos - startPos != 12) { + if (currentPos - startPos != 12) + { result.SetFailure(ParseFailureKind.Format, "Format_GuidInvLen"); return false; } - result.parsedGuid._d = (byte)(temp>>8); + result.parsedGuid._d = (byte)(temp >> 8); result.parsedGuid._e = (byte)(temp); temp = (int)(templ >> 32); - result.parsedGuid._f = (byte)(temp>>8); + result.parsedGuid._f = (byte)(temp >> 8); result.parsedGuid._g = (byte)(temp); temp = (int)(templ); - result.parsedGuid._h = (byte)(temp>>24); - result.parsedGuid._i = (byte)(temp>>16); - result.parsedGuid._j = (byte)(temp>>8); + result.parsedGuid._h = (byte)(temp >> 24); + result.parsedGuid._i = (byte)(temp >> 16); + result.parsedGuid._j = (byte)(temp >> 8); result.parsedGuid._k = (byte)(temp); return true; @@ -752,10 +842,12 @@ namespace System { // // StringToShort, StringToInt, and StringToLong are wrappers around COMUtilNative integer parsing routines; - private static unsafe bool StringToShort(String str, int requiredLength, int flags, out short result, ref GuidResult parseResult) { + private static unsafe bool StringToShort(String str, int requiredLength, int flags, out short result, ref GuidResult parseResult) + { return StringToShort(str, null, requiredLength, flags, out result, ref parseResult); } - private static unsafe bool StringToShort(String str, int* parsePos, int requiredLength, int flags, out short result, ref GuidResult parseResult) { + private static unsafe bool StringToShort(String str, int* parsePos, int requiredLength, int flags, out short result, ref GuidResult parseResult) + { result = 0; int x; bool retValue = StringToInt(str, parsePos, requiredLength, flags, out x, ref parseResult); @@ -763,79 +855,103 @@ namespace System { return retValue; } - private static unsafe bool StringToInt(String str, int requiredLength, int flags, out int result, ref GuidResult parseResult) { + private static unsafe bool StringToInt(String str, int requiredLength, int flags, out int result, ref GuidResult parseResult) + { return StringToInt(str, null, requiredLength, flags, out result, ref parseResult); } - private static unsafe bool StringToInt(String str, ref int parsePos, int requiredLength, int flags, out int result, ref GuidResult parseResult) { - fixed(int * ppos = &parsePos) { + private static unsafe bool StringToInt(String str, ref int parsePos, int requiredLength, int flags, out int result, ref GuidResult parseResult) + { + fixed (int* ppos = &parsePos) + { return StringToInt(str, ppos, requiredLength, flags, out result, ref parseResult); } } - private static unsafe bool StringToInt(String str, int* parsePos, int requiredLength, int flags, out int result, ref GuidResult parseResult) { + private static unsafe bool StringToInt(String str, int* parsePos, int requiredLength, int flags, out int result, ref GuidResult parseResult) + { result = 0; int currStart = (parsePos == null) ? 0 : (*parsePos); - try { + try + { result = ParseNumbers.StringToInt(str, 16, flags, parsePos); } - catch (OverflowException ex) { - if (parseResult.throwStyle == GuidParseThrowStyle.All) { + catch (OverflowException ex) + { + if (parseResult.throwStyle == GuidParseThrowStyle.All) + { throw; } - else if (parseResult.throwStyle == GuidParseThrowStyle.AllButOverflow) { - throw new FormatException(Environment.GetResourceString("Format_GuidUnrecognized"), ex); + else if (parseResult.throwStyle == GuidParseThrowStyle.AllButOverflow) + { + throw new FormatException(SR.Format_GuidUnrecognized, ex); } - else { + else + { parseResult.SetFailure(ex); return false; } } - catch (Exception ex) { - if (parseResult.throwStyle == GuidParseThrowStyle.None) { + catch (Exception ex) + { + if (parseResult.throwStyle == GuidParseThrowStyle.None) + { parseResult.SetFailure(ex); return false; } - else { + else + { throw; } } //If we didn't parse enough characters, there's clearly an error. - if (requiredLength != -1 && parsePos != null && (*parsePos) - currStart != requiredLength) { + if (requiredLength != -1 && parsePos != null && (*parsePos) - currStart != requiredLength) + { parseResult.SetFailure(ParseFailureKind.Format, "Format_GuidInvalidChar"); return false; } return true; } - private static unsafe bool StringToLong(String str, ref int parsePos, int flags, out long result, ref GuidResult parseResult) { - fixed(int * ppos = &parsePos) { + private static unsafe bool StringToLong(String str, ref int parsePos, int flags, out long result, ref GuidResult parseResult) + { + fixed (int* ppos = &parsePos) + { return StringToLong(str, ppos, flags, out result, ref parseResult); } } - private static unsafe bool StringToLong(String str, int* parsePos, int flags, out long result, ref GuidResult parseResult) { + private static unsafe bool StringToLong(String str, int* parsePos, int flags, out long result, ref GuidResult parseResult) + { result = 0; - try { + try + { result = ParseNumbers.StringToLong(str, 16, flags, parsePos); } - catch (OverflowException ex) { - if (parseResult.throwStyle == GuidParseThrowStyle.All) { + catch (OverflowException ex) + { + if (parseResult.throwStyle == GuidParseThrowStyle.All) + { throw; } - else if (parseResult.throwStyle == GuidParseThrowStyle.AllButOverflow) { - throw new FormatException(Environment.GetResourceString("Format_GuidUnrecognized"), ex); + else if (parseResult.throwStyle == GuidParseThrowStyle.AllButOverflow) + { + throw new FormatException(SR.Format_GuidUnrecognized, ex); } - else { + else + { parseResult.SetFailure(ex); return false; } } - catch (Exception ex) { - if (parseResult.throwStyle == GuidParseThrowStyle.None) { + catch (Exception ex) + { + if (parseResult.throwStyle == GuidParseThrowStyle.None) + { parseResult.SetFailure(ex); return false; } - else { + else + { throw; } } @@ -850,10 +966,10 @@ namespace System { char curChar; // Now get each char from str and if it is not whitespace add it to chArr - for(int i = 0; i < str.Length; i++) + for (int i = 0; i < str.Length; i++) { curChar = str[i]; - if(!Char.IsWhiteSpace(curChar)) + if (!Char.IsWhiteSpace(curChar)) { chArr[newLength++] = curChar; } @@ -865,7 +981,7 @@ namespace System { private static bool IsHexPrefix(String str, int i) { - if(str.Length > i+1 && str[i] == '0' && (Char.ToLower(str[i+1], CultureInfo.InvariantCulture) == 'x')) + if (str.Length > i + 1 && str[i] == '0' && (Char.ToLower(str[i + 1], CultureInfo.InvariantCulture) == 'x')) return true; else return false; @@ -879,7 +995,7 @@ namespace System { g[0] = (byte)(_a); g[1] = (byte)(_a >> 8); - g[2] = (byte)(_a >> 16); + g[2] = (byte)(_a >> 16); g[3] = (byte)(_a >> 24); g[4] = (byte)(_b); g[5] = (byte)(_b >> 8); @@ -901,14 +1017,14 @@ namespace System { // Returns the guid in "registry" format. public override String ToString() { - return ToString("D",null); + return ToString("D", null); } public unsafe override int GetHashCode() { // Simply XOR all the bits of the GUID 32 bits at a time. - fixed (int* ptr = &this._a) - return ptr[0] ^ ptr[1] ^ ptr[2] ^ ptr[3]; + fixed (int* ptr = &_a) + return ptr[0] ^ ptr[1] ^ ptr[2] ^ ptr[3]; } // Returns true if and only if the guid represented @@ -917,16 +1033,16 @@ namespace System { { Guid g; // Check that o is a Guid first - if(o == null || !(o is Guid)) + if (o == null || !(o is Guid)) return false; - else g = (Guid) o; + else g = (Guid)o; // Now compare each of the elements - if(g._a != _a) + if (g._a != _a) return false; - if(g._b != _b) + if (g._b != _b) return false; - if(g._c != _c) + if (g._c != _c) return false; if (g._d != _d) return false; @@ -951,11 +1067,11 @@ namespace System { public bool Equals(Guid g) { // Now compare each of the elements - if(g._a != _a) + if (g._a != _a) return false; - if(g._b != _b) + if (g._b != _b) return false; - if(g._c != _c) + if (g._c != _c) return false; if (g._d != _d) return false; @@ -977,64 +1093,80 @@ namespace System { return true; } - private int GetResult(uint me, uint them) { - if (me<them) { + private int GetResult(uint me, uint them) + { + if (me < them) + { return -1; } return 1; } - public int CompareTo(Object value) { - if (value == null) { + public int CompareTo(Object value) + { + if (value == null) + { return 1; } - if (!(value is Guid)) { - throw new ArgumentException(Environment.GetResourceString("Arg_MustBeGuid"), nameof(value)); + if (!(value is Guid)) + { + throw new ArgumentException(SR.Arg_MustBeGuid, nameof(value)); } Guid g = (Guid)value; - if (g._a!=this._a) { - return GetResult((uint)this._a, (uint)g._a); + if (g._a != _a) + { + return GetResult((uint)_a, (uint)g._a); } - if (g._b!=this._b) { - return GetResult((uint)this._b, (uint)g._b); + if (g._b != _b) + { + return GetResult((uint)_b, (uint)g._b); } - if (g._c!=this._c) { - return GetResult((uint)this._c, (uint)g._c); + if (g._c != _c) + { + return GetResult((uint)_c, (uint)g._c); } - if (g._d!=this._d) { - return GetResult((uint)this._d, (uint)g._d); + if (g._d != _d) + { + return GetResult((uint)_d, (uint)g._d); } - if (g._e!=this._e) { - return GetResult((uint)this._e, (uint)g._e); + if (g._e != _e) + { + return GetResult((uint)_e, (uint)g._e); } - if (g._f!=this._f) { - return GetResult((uint)this._f, (uint)g._f); + if (g._f != _f) + { + return GetResult((uint)_f, (uint)g._f); } - if (g._g!=this._g) { - return GetResult((uint)this._g, (uint)g._g); + if (g._g != _g) + { + return GetResult((uint)_g, (uint)g._g); } - if (g._h!=this._h) { - return GetResult((uint)this._h, (uint)g._h); + if (g._h != _h) + { + return GetResult((uint)_h, (uint)g._h); } - if (g._i!=this._i) { - return GetResult((uint)this._i, (uint)g._i); + if (g._i != _i) + { + return GetResult((uint)_i, (uint)g._i); } - if (g._j!=this._j) { - return GetResult((uint)this._j, (uint)g._j); + if (g._j != _j) + { + return GetResult((uint)_j, (uint)g._j); } - if (g._k!=this._k) { - return GetResult((uint)this._k, (uint)g._k); + if (g._k != _k) + { + return GetResult((uint)_k, (uint)g._k); } return 0; @@ -1042,48 +1174,59 @@ namespace System { public int CompareTo(Guid value) { - if (value._a!=this._a) { - return GetResult((uint)this._a, (uint)value._a); + if (value._a != _a) + { + return GetResult((uint)_a, (uint)value._a); } - if (value._b!=this._b) { - return GetResult((uint)this._b, (uint)value._b); + if (value._b != _b) + { + return GetResult((uint)_b, (uint)value._b); } - if (value._c!=this._c) { - return GetResult((uint)this._c, (uint)value._c); + if (value._c != _c) + { + return GetResult((uint)_c, (uint)value._c); } - if (value._d!=this._d) { - return GetResult((uint)this._d, (uint)value._d); + if (value._d != _d) + { + return GetResult((uint)_d, (uint)value._d); } - if (value._e!=this._e) { - return GetResult((uint)this._e, (uint)value._e); + if (value._e != _e) + { + return GetResult((uint)_e, (uint)value._e); } - if (value._f!=this._f) { - return GetResult((uint)this._f, (uint)value._f); + if (value._f != _f) + { + return GetResult((uint)_f, (uint)value._f); } - if (value._g!=this._g) { - return GetResult((uint)this._g, (uint)value._g); + if (value._g != _g) + { + return GetResult((uint)_g, (uint)value._g); } - if (value._h!=this._h) { - return GetResult((uint)this._h, (uint)value._h); + if (value._h != _h) + { + return GetResult((uint)_h, (uint)value._h); } - if (value._i!=this._i) { - return GetResult((uint)this._i, (uint)value._i); + if (value._i != _i) + { + return GetResult((uint)_i, (uint)value._i); } - if (value._j!=this._j) { - return GetResult((uint)this._j, (uint)value._j); + if (value._j != _j) + { + return GetResult((uint)_j, (uint)value._j); } - if (value._k!=this._k) { - return GetResult((uint)this._k, (uint)value._k); + if (value._k != _k) + { + return GetResult((uint)_k, (uint)value._k); } return 0; @@ -1092,27 +1235,27 @@ namespace System { public static bool operator ==(Guid a, Guid b) { // Now compare each of the elements - if(a._a != b._a) + if (a._a != b._a) return false; - if(a._b != b._b) + if (a._b != b._b) return false; - if(a._c != b._c) + if (a._c != b._c) return false; - if(a._d != b._d) + if (a._d != b._d) return false; - if(a._e != b._e) + if (a._e != b._e) return false; - if(a._f != b._f) + if (a._f != b._f) return false; - if(a._g != b._g) + if (a._g != b._g) return false; - if(a._h != b._h) + if (a._h != b._h) return false; - if(a._i != b._i) + if (a._i != b._i) return false; - if(a._j != b._j) + if (a._j != b._j) return false; - if(a._k != b._k) + if (a._k != b._k) return false; return true; @@ -1125,7 +1268,8 @@ namespace System { // This will create a new guid. Since we've now decided that constructors should 0-init, // we need a method that allows users to create a guid. - public static Guid NewGuid() { + public static Guid NewGuid() + { // CoCreateGuid should never return Guid.Empty, since it attempts to maintain some // uniqueness guarantees. It should also never return a known GUID, but it's unclear // how extensively it checks for known values. @@ -1136,37 +1280,45 @@ namespace System { return guid; } - public String ToString(String format) { + public String ToString(String format) + { return ToString(format, null); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static char HexToChar(int a) { a = a & 0xf; - return (char) ((a > 9) ? a - 10 + 0x61 : a + 0x30); + return (char)((a > 9) ? a - 10 + 0x61 : a + 0x30); } - unsafe private static int HexsToChars(char* guidChars, int offset, int a, int b) + unsafe private static int HexsToChars(char* guidChars, int a, int b) { - return HexsToChars(guidChars, offset, a, b, false); + guidChars[0] = HexToChar(a >> 4); + guidChars[1] = HexToChar(a); + + guidChars[2] = HexToChar(b >> 4); + guidChars[3] = HexToChar(b); + + return 4; } - unsafe private static int HexsToChars(char* guidChars, int offset, int a, int b, bool hex) + unsafe private static int HexsToCharsHexOutput(char* guidChars, int a, int b) { - if (hex) { - guidChars[offset++] = '0'; - guidChars[offset++] = 'x'; - } - guidChars[offset++] = HexToChar(a>>4); - guidChars[offset++] = HexToChar(a); - if (hex) { - guidChars[offset++] = ','; - guidChars[offset++] = '0'; - guidChars[offset++] = 'x'; - } - guidChars[offset++] = HexToChar(b>>4); - guidChars[offset++] = HexToChar(b); - return offset; + guidChars[0] = '0'; + guidChars[1] = 'x'; + + guidChars[2] = HexToChar(a >> 4); + guidChars[3] = HexToChar(a); + + guidChars[4] = ','; + guidChars[5] = '0'; + guidChars[6] = 'x'; + + guidChars[7] = HexToChar(b >> 4); + guidChars[8] = HexToChar(b); + + return 9; } // IFormattable interface @@ -1181,41 +1333,53 @@ namespace System { bool dash = true; bool hex = false; - if( format.Length != 1) { + if (format.Length != 1) + { // all acceptable format strings are of length 1 - throw new FormatException(Environment.GetResourceString("Format_InvalidGuidFormatSpecification")); + throw new FormatException(SR.Format_InvalidGuidFormatSpecification); } - + char formatCh = format[0]; - if (formatCh == 'D' || formatCh == 'd') { + if (formatCh == 'D' || formatCh == 'd') + { guidString = string.FastAllocateString(36); - } - else if (formatCh == 'N' || formatCh == 'n') { + } + else if (formatCh == 'N' || formatCh == 'n') + { guidString = string.FastAllocateString(32); dash = false; } - else if (formatCh == 'B' || formatCh == 'b') { + else if (formatCh == 'B' || formatCh == 'b') + { guidString = string.FastAllocateString(38); - unsafe { - fixed (char* guidChars = guidString) { + unsafe + { + fixed (char* guidChars = guidString) + { guidChars[offset++] = '{'; guidChars[37] = '}'; } } } - else if (formatCh == 'P' || formatCh == 'p') { + else if (formatCh == 'P' || formatCh == 'p') + { guidString = string.FastAllocateString(38); - unsafe { - fixed (char* guidChars = guidString) { + unsafe + { + fixed (char* guidChars = guidString) + { guidChars[offset++] = '('; guidChars[37] = ')'; } } } - else if (formatCh == 'X' || formatCh == 'x') { + else if (formatCh == 'X' || formatCh == 'x') + { guidString = string.FastAllocateString(68); - unsafe { - fixed (char* guidChars = guidString) { + unsafe + { + fixed (char* guidChars = guidString) + { guidChars[offset++] = '{'; guidChars[67] = '}'; } @@ -1223,51 +1387,56 @@ namespace System { dash = false; hex = true; } - else { - throw new FormatException(Environment.GetResourceString("Format_InvalidGuidFormatSpecification")); + else + { + throw new FormatException(SR.Format_InvalidGuidFormatSpecification); } - unsafe { - fixed (char* guidChars = guidString) { - if (hex) { + unsafe + { + fixed (char* guidChars = guidString) + { + if (hex) + { // {0xdddddddd,0xdddd,0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}} guidChars[offset++] = '0'; guidChars[offset++] = 'x'; - offset = HexsToChars(guidChars, offset, _a >> 24, _a >> 16); - offset = HexsToChars(guidChars, offset, _a >> 8, _a); + offset += HexsToChars(guidChars + offset, _a >> 24, _a >> 16); + offset += HexsToChars(guidChars + offset, _a >> 8, _a); guidChars[offset++] = ','; guidChars[offset++] = '0'; guidChars[offset++] = 'x'; - offset = HexsToChars(guidChars, offset, _b >> 8, _b); + offset += HexsToChars(guidChars + offset, _b >> 8, _b); guidChars[offset++] = ','; guidChars[offset++] = '0'; guidChars[offset++] = 'x'; - offset = HexsToChars(guidChars, offset, _c >> 8, _c); + offset += HexsToChars(guidChars + offset, _c >> 8, _c); guidChars[offset++] = ','; guidChars[offset++] = '{'; - offset = HexsToChars(guidChars, offset, _d, _e, true); + offset += HexsToCharsHexOutput(guidChars + offset, _d, _e); guidChars[offset++] = ','; - offset = HexsToChars(guidChars, offset, _f, _g, true); + offset += HexsToCharsHexOutput(guidChars + offset, _f, _g); guidChars[offset++] = ','; - offset = HexsToChars(guidChars, offset, _h, _i, true); + offset += HexsToCharsHexOutput(guidChars + offset, _h, _i); guidChars[offset++] = ','; - offset = HexsToChars(guidChars, offset, _j, _k, true); + offset += HexsToCharsHexOutput(guidChars + offset, _j, _k); guidChars[offset++] = '}'; } - else { + else + { // [{|(]dddddddd[-]dddd[-]dddd[-]dddd[-]dddddddddddd[}|)] - offset = HexsToChars(guidChars, offset, _a >> 24, _a >> 16); - offset = HexsToChars(guidChars, offset, _a >> 8, _a); + offset += HexsToChars(guidChars + offset, _a >> 24, _a >> 16); + offset += HexsToChars(guidChars + offset, _a >> 8, _a); if (dash) guidChars[offset++] = '-'; - offset = HexsToChars(guidChars, offset, _b >> 8, _b); + offset += HexsToChars(guidChars + offset, _b >> 8, _b); if (dash) guidChars[offset++] = '-'; - offset = HexsToChars(guidChars, offset, _c >> 8, _c); + offset += HexsToChars(guidChars + offset, _c >> 8, _c); if (dash) guidChars[offset++] = '-'; - offset = HexsToChars(guidChars, offset, _d, _e); + offset += HexsToChars(guidChars + offset, _d, _e); if (dash) guidChars[offset++] = '-'; - offset = HexsToChars(guidChars, offset, _f, _g); - offset = HexsToChars(guidChars, offset, _h, _i); - offset = HexsToChars(guidChars, offset, _j, _k); + offset += HexsToChars(guidChars + offset, _f, _g); + offset += HexsToChars(guidChars + offset, _h, _i); + offset += HexsToChars(guidChars + offset, _j, _k); } } } |