Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Net / System / _IPv4Address.cs / 1 / _IPv4Address.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System { // The class designed as to keep minimal the working set of Uri class. // The idea is to stay with static helper methods and strings internal class IPv4AddressHelper { // fields private IPv4AddressHelper() { } private const int NumberOfLabels = 4; // methods internal static string ParseCanonicalName(string str, int start, int end, ref bool isLoopback) { unsafe { byte* numbers = stackalloc byte[NumberOfLabels]; isLoopback = Parse(str, numbers, start, end); return numbers[0] + "." + numbers[1] + "." + numbers[2] + "." + numbers[3]; } } internal static int ParseHostNumber(string str, int start, int end) { unsafe { byte* numbers = stackalloc byte[NumberOfLabels]; Parse(str, numbers, start, end); return (numbers[0] << 24) + (numbers[1] << 16) + (numbers[2] << 8) + numbers[3]; } } // // IsValid // // Performs IsValid on a substring. Updates the index to where we // believe the IPv4 address ends // // Inputs: //name // string containing possible IPv4 address // // start // offset in to start checking for IPv4 address // // end // offset in of the last character we can touch in the check // // Outputs: // end // index of last character in we checked // // Assumes: // The address string is terminated by either // end of the string, characters ':' '/' '\' '?' // // // Returns: // bool // // Throws: // Nothing // //internal unsafe static bool IsValid(char* name, int start, ref int end) { // return IsValid(name, start, ref end, false); //} //Remark: MUST NOT be used unless all input indexes are are verified and trusted. internal unsafe static bool IsValid(char* name, int start, ref int end, bool allowIPv6, bool notImplicitFile) { int dots = 0; int number = 0; bool haveNumber = false; while (start < end) { char ch = name[start]; if (allowIPv6) { // for ipv4 inside ipv6 the terminator is either ScopeId, prefix or ipv6 terminator if(ch == ']' || ch == '/' || ch == '%') break; } else if (ch == '/' || ch == '\\' || (notImplicitFile && (ch == ':' || ch == '?' || ch == '#'))) { break; } if (ch <= '9' && ch >= '0') { haveNumber = true; number = number * 10 + (name[start] - '0'); if (number > 255) { return false; } } else if (ch == '.') { if (!haveNumber) { return false; } ++dots; haveNumber = false; number = 0; } else { return false; } ++start; } bool res = (dots == 3) && haveNumber; if (res) { end = start; } return res; } // // Parse // // Convert this IPv4 address into a sequence of 4 8-bit numbers // // Assumes: // has been validated and contains only decimal digits in groups // of 8-bit numbers and the characters '.' // Address may terminate with ':' or with the end of the string // unsafe private static bool Parse(string name, byte* numbers, int start, int end) { for (int i = 0; i < NumberOfLabels; ++i) { byte b = 0; char ch; for (; (start < end) && (ch = name[start]) != '.' && ch != ':'; ++start) { b = (byte)(b * 10 + (byte)(ch - '0')); } numbers[i] = b; ++start; } return numbers[0] == 127; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System { // The class designed as to keep minimal the working set of Uri class. // The idea is to stay with static helper methods and strings internal class IPv4AddressHelper { // fields private IPv4AddressHelper() { } private const int NumberOfLabels = 4; // methods internal static string ParseCanonicalName(string str, int start, int end, ref bool isLoopback) { unsafe { byte* numbers = stackalloc byte[NumberOfLabels]; isLoopback = Parse(str, numbers, start, end); return numbers[0] + "." + numbers[1] + "." + numbers[2] + "." + numbers[3]; } } internal static int ParseHostNumber(string str, int start, int end) { unsafe { byte* numbers = stackalloc byte[NumberOfLabels]; Parse(str, numbers, start, end); return (numbers[0] << 24) + (numbers[1] << 16) + (numbers[2] << 8) + numbers[3]; } } // // IsValid // // Performs IsValid on a substring. Updates the index to where we // believe the IPv4 address ends // // Inputs: //name // string containing possible IPv4 address // // start // offset in to start checking for IPv4 address // // end // offset in of the last character we can touch in the check // // Outputs: // end // index of last character in we checked // // Assumes: // The address string is terminated by either // end of the string, characters ':' '/' '\' '?' // // // Returns: // bool // // Throws: // Nothing // //internal unsafe static bool IsValid(char* name, int start, ref int end) { // return IsValid(name, start, ref end, false); //} //Remark: MUST NOT be used unless all input indexes are are verified and trusted. internal unsafe static bool IsValid(char* name, int start, ref int end, bool allowIPv6, bool notImplicitFile) { int dots = 0; int number = 0; bool haveNumber = false; while (start < end) { char ch = name[start]; if (allowIPv6) { // for ipv4 inside ipv6 the terminator is either ScopeId, prefix or ipv6 terminator if(ch == ']' || ch == '/' || ch == '%') break; } else if (ch == '/' || ch == '\\' || (notImplicitFile && (ch == ':' || ch == '?' || ch == '#'))) { break; } if (ch <= '9' && ch >= '0') { haveNumber = true; number = number * 10 + (name[start] - '0'); if (number > 255) { return false; } } else if (ch == '.') { if (!haveNumber) { return false; } ++dots; haveNumber = false; number = 0; } else { return false; } ++start; } bool res = (dots == 3) && haveNumber; if (res) { end = start; } return res; } // // Parse // // Convert this IPv4 address into a sequence of 4 8-bit numbers // // Assumes: // has been validated and contains only decimal digits in groups // of 8-bit numbers and the characters '.' // Address may terminate with ':' or with the end of the string // unsafe private static bool Parse(string name, byte* numbers, int start, int end) { for (int i = 0; i < NumberOfLabels; ++i) { byte b = 0; char ch; for (; (start < end) && (ch = name[start]) != '.' && ch != ':'; ++start) { b = (byte)(b * 10 + (byte)(ch - '0')); } numbers[i] = b; ++start; } return numbers[0] == 127; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SyntaxCheck.cs
- ParameterDataSourceExpression.cs
- NativeMethods.cs
- ResourceDictionaryCollection.cs
- PersistenceProviderFactory.cs
- PermissionSetEnumerator.cs
- GCHandleCookieTable.cs
- EdmSchemaError.cs
- ProxyAttribute.cs
- ArraySortHelper.cs
- TreeIterator.cs
- LinearGradientBrush.cs
- XpsResource.cs
- VariableQuery.cs
- DbModificationCommandTree.cs
- GetLedgerRequest.cs
- InfoCardBaseException.cs
- BitmapEffectvisualstate.cs
- FixedDocument.cs
- BinaryConverter.cs
- SettingsBindableAttribute.cs
- RegexWorker.cs
- QueryOperationResponseOfT.cs
- DecoderFallback.cs
- XmlIlVisitor.cs
- GetMemberBinder.cs
- LinqMaximalSubtreeNominator.cs
- CodeTypeDeclarationCollection.cs
- SqlTopReducer.cs
- MergeLocalizationDirectives.cs
- WebPartConnectVerb.cs
- Util.cs
- path.cs
- BasicHttpMessageSecurity.cs
- Peer.cs
- CustomAttributeSerializer.cs
- FixedSOMLineRanges.cs
- DefaultTraceListener.cs
- QuestionEventArgs.cs
- TreeNodeCollection.cs
- SqlGatherConsumedAliases.cs
- SweepDirectionValidation.cs
- RC2CryptoServiceProvider.cs
- ViewBase.cs
- Stack.cs
- PreviewKeyDownEventArgs.cs
- TreeViewAutomationPeer.cs
- XmlSchemaSubstitutionGroup.cs
- SectionUpdates.cs
- PermissionToken.cs
- XmlIlTypeHelper.cs
- FocusTracker.cs
- CodeNamespaceImport.cs
- PnrpPeerResolverBindingElement.cs
- FigureParagraph.cs
- VersionedStreamOwner.cs
- ExpressionBuilder.cs
- HttpFileCollection.cs
- MessageAction.cs
- SizeF.cs
- XamlFigureLengthSerializer.cs
- MembershipValidatePasswordEventArgs.cs
- BaseCollection.cs
- ListComponentEditorPage.cs
- InkCollectionBehavior.cs
- ProcessMonitor.cs
- FillBehavior.cs
- MonitorWrapper.cs
- updatecommandorderer.cs
- XmlAttributeAttribute.cs
- CellIdBoolean.cs
- SqlUserDefinedAggregateAttribute.cs
- Queue.cs
- CodeCommentStatementCollection.cs
- ToolStripPanelRenderEventArgs.cs
- TraceHandlerErrorFormatter.cs
- keycontainerpermission.cs
- CompiledRegexRunnerFactory.cs
- SqlNodeTypeOperators.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- SortedDictionary.cs
- StrokeCollectionConverter.cs
- GridViewDeleteEventArgs.cs
- KeyInterop.cs
- ExpandSegmentCollection.cs
- GeneralTransform3D.cs
- OperationCanceledException.cs
- FileDialog.cs
- ExpressionBuilder.cs
- ProcessThread.cs
- DbConnectionClosed.cs
- MethodRental.cs
- Exceptions.cs
- InputEventArgs.cs
- _Rfc2616CacheValidators.cs
- QueryFunctions.cs
- _Rfc2616CacheValidators.cs
- AssemblyHash.cs
- GetRecipientListRequest.cs
- Scanner.cs