@@ -657,56 +657,77 @@ public bool TryMakeSnum(out int snum)
657657 /// Try to make Ip version from ip version tag which is a formatted text IPv[Version]:
658658 /// </summary>
659659 /// <param name="version">IP version. IPv6 is supported atm.</param>
660- /// <returns>true if ip version tag can be extracted</returns>
660+ /// <returns>true if ip version tag can be extracted. </returns>
661661 public bool TryMakeIpVersion ( out int version )
662662 {
663663 version = default ;
664- var tag = Enumerator . Peek ( ) ;
665- if ( tag != Tokens . Text . IpVersionTag )
664+
665+ if ( Enumerator . Take ( ) != Tokens . Text . IpVersionTag )
666+ {
666667 return false ;
667- Enumerator . Take ( ) ;
668- var versionToken = Enumerator . Take ( ) ;
669- if ( versionToken . Kind == TokenKind . Number && int . TryParse ( versionToken . Text , out var v ) )
668+ }
669+
670+ var token = Enumerator . Take ( ) ;
671+
672+ if ( token . Kind == TokenKind . Number && int . TryParse ( token . Text , out var v ) )
670673 {
671674 version = v ;
672675 return Enumerator . Take ( ) == Tokens . Colon ;
673676 }
677+
674678 return false ;
675679 }
676680
677681 /// <summary>
678- /// Try to make 16 bits hex number
682+ /// Try to make 16 bits hex number.
679683 /// </summary>
680- /// <param name="hexNumber">Extracted hex number</param>
681- /// <returns>true if valid hex number can be extracted</returns>
684+ /// <param name="hexNumber">Extracted hex number. </param>
685+ /// <returns>true if valid hex number can be extracted. </returns>
682686 public bool TryMake16BitsHexNumber ( out string hexNumber )
683687 {
684688 hexNumber = null ;
689+
685690 var token = Enumerator . Peek ( ) ;
686691 while ( token . Kind == TokenKind . Number || token . Kind == TokenKind . Text )
687692 {
688693 if ( hexNumber != null && ( hexNumber . Length + token . Text . Length ) > 4 )
694+ {
689695 return false ;
690- // Validate hex chars
691- if ( token . Kind == TokenKind . Text && ! token . Text . ToUpperInvariant ( ) . All ( c => c >= 'A' && c <= 'F' ) )
696+ }
697+
698+ if ( token . Kind == TokenKind . Text && IsHex ( token . Text ) == false )
699+ {
692700 return false ;
701+ }
702+
693703 hexNumber = string . Concat ( hexNumber ?? string . Empty , token . Text ) ;
704+
694705 Enumerator . Take ( ) ;
695706 token = Enumerator . Peek ( ) ;
696707 }
708+
697709 return true ;
710+
711+ bool IsHex ( string text )
712+ {
713+ return text . ToUpperInvariant ( ) . All ( c => c >= 'A' && c <= 'F' ) ;
714+ }
698715 }
699716
700717 /// <summary>
701718 /// Try to extract IPv6 address. https://tools.ietf.org/html/rfc4291 section 2.2 used for specification.
702719 /// </summary>
703- /// <param name="address">Extracted Ipv6 address</param>
704- /// <returns>true if a valid Ipv6 address can be extracted</returns>
720+ /// <param name="address">Extracted Ipv6 address. </param>
721+ /// <returns>true if a valid Ipv6 address can be extracted. </returns>
705722 public bool TryMakeIpv6AddressLiteral ( out string address )
706723 {
707724 address = null ;
708- if ( ( TryMake ( TryMakeIpVersion , out int ipVersion ) == false ) || ipVersion != 6 )
725+
726+ if ( TryMake ( TryMakeIpVersion , out int ipVersion ) == false || ipVersion != 6 )
727+ {
709728 return false ;
729+ }
730+
710731 var hasDoubleColumn = false ;
711732 var hexPartCount = 0 ;
712733 var hasIpv4Part = false ;
@@ -729,15 +750,11 @@ public bool TryMakeIpv6AddressLiteral(out string address)
729750 builder . Append ( ipv4 ) ;
730751 break ;
731752 }
732- else
733- {
734- return false ;
735- }
736- }
737- else
738- {
739- cp . Rollback ( ) ;
753+
754+ return false ;
740755 }
756+
757+ cp . Rollback ( ) ;
741758 }
742759
743760 if ( token == Tokens . Colon )
@@ -746,7 +763,9 @@ public bool TryMakeIpv6AddressLiteral(out string address)
746763 {
747764 // Double column is allowed only once
748765 if ( hasDoubleColumn )
766+ {
749767 return false ;
768+ }
750769 hasDoubleColumn = true ;
751770 }
752771 builder . Append ( token . Text ) ;
@@ -756,7 +775,10 @@ public bool TryMakeIpv6AddressLiteral(out string address)
756775 else
757776 {
758777 if ( wasColon == false && builder . Length > 0 )
778+ {
759779 return false ;
780+ }
781+
760782 wasColon = false ;
761783 if ( TryMake ( TryMake16BitsHexNumber , out string hexNumber ) )
762784 {
@@ -775,7 +797,9 @@ public bool TryMakeIpv6AddressLiteral(out string address)
775797
776798 var maxAllowedParts = ( hasIpv4Part ? 6 : 8 ) - Math . Sign ( hasDoubleColumn ? 1 : 0 ) ;
777799 if ( ( hasDoubleColumn && hexPartCount > maxAllowedParts ) || ( ! hasDoubleColumn && hexPartCount != maxAllowedParts ) )
800+ {
778801 return false ;
802+ }
779803
780804 return true ;
781805 }
0 commit comments