Parse an IP Address: Difference between revisions

(Add source for Rust)
 
(16 intermediate revisions by 14 users not shown)
Line 42:
space that   '''127.0.0.1'''   serves in the ipv4 address space.
<br><br>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">ParseIP(Address){
return InStr(A_LoopField, ".") ? IPv4(Address) : IPv6(Address)
}
 
IPv4(Address){
for i, v in StrSplit(Address, "."){
x := StrSplit(v, ":")
num .= SubStr("00" . Format("{:X}", x.1), -1)
port := x.2 ? x.2 : ""
}
return [num, port]
}
 
IPv6(Address){
for i, v in StrSplit(Address, "]")
if i = 1
for j, x in StrSplit(LTrim(v, "[:"), ":")
num .= x = "" ? "00000000" : SubStr("0000" x, -3)
else
port := LTrim(v, ":")
return [SubStr("00000000000000000000000000000000" num, -31), port]
}</syntaxhighlight>
Examples:<syntaxhighlight lang="autohotkey">data =
(
127.0.0.1
127.0.0.1:80
::1
[::1]:80
2605:2700:0:3::4713:93e3
[2605:2700:0:3::4713:93e3]:80
)
 
output := ""
loop, parse, data, `n, `r
{
x := ParseIP(A_LoopField)
output .= "input = " A_LoopField "`t>`t" x.1 . (x.2 ? " port : " x.2 : "") "`n"
}
MsgBox % output
return</syntaxhighlight>
{{out}}<pre>
input = 127.0.0.1 > 7F000001
input = 127.0.0.1:80 > 7F000001 port : 80
input = ::1 > 00000000000000000000000000000001
input = [::1]:80 > 00000000000000000000000000000001 port : 80
input = 2605:2700:0:3::4713:93e3 > 260527000000000300000000471393e3
input = [2605:2700:0:3::4713:93e3]:80 > 260527000000000300000000471393e3 port : 80
</pre>
 
=={{header|C}}==
{{libheader|C standard library}}
<syntaxhighlight lang="c">
<lang C>
#include <string.h>
#include <memory.h>
Line 344 ⟶ 394:
return ParseIPv4OrIPv6 ( &pszTextLocal, abyAddr, pnPort, pbIsIPv6);
}
</syntaxhighlight>
</lang>
Test:
<syntaxhighlight lang="c">
<lang C>
#include <stdio.h>
 
Line 428 ⟶ 478:
return 0;
}
</syntaxhighlight>
</lang>
 
Output:
Line 486 ⟶ 536:
to parse IP addresses. This approach will also work on Microsoft Windows with some
minor changes.
<langsyntaxhighlight lang="c">#include <arpa/inet.h>
#include <stdbool.h>
#include <stdio.h>
Line 605 ⟶ 655:
test_parse_address("[2605:2700:0:3::4713:93e3]:80");
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 648 ⟶ 698:
address: 260527000000000300000000471393E3
port: 80
 
</pre>
 
=={{header|C#}}==
{{trans|Java}}
<syntaxhighlight lang="C#">
using System;
using System.Text.RegularExpressions;
using System.Text;
 
class ParseIPAddress
{
private static readonly Regex IPV4_PAT = new Regex(@"^(\d+)\.(\d+)\.(\d+)\.(\d+)(?::(\d+)){0,1}$");
private static readonly Regex IPV6_DOUBL_COL_PAT = new Regex(@"^\[{0,1}([0-9a-f:]*)::([0-9a-f:]*)(?:\]:(\d+)){0,1}$");
private static readonly Regex IPV6_PAT;
 
static ParseIPAddress()
{
string ipv6Pattern = @"^\[{0,1}";
for (int i = 1; i <= 7; i++)
{
ipv6Pattern += @"([0-9a-f]+):";
}
ipv6Pattern += @"([0-9a-f]+)(?:\]:(\d+)){0,1}$";
IPV6_PAT = new Regex(ipv6Pattern);
}
 
static void Main(string[] args)
{
string[] tests = new string[] { "192.168.0.1", "127.0.0.1", "256.0.0.1", "127.0.0.1:80", "::1", "[::1]:80", "[32e::12f]:80", "2605:2700:0:3::4713:93e3", "[2605:2700:0:3::4713:93e3]:80", "2001:db8:85a3:0:0:8a2e:370:7334" };
Console.WriteLine(String.Format("{0,-40} {1,-32} {2}", "Test Case", "Hex Address", "Port"));
foreach (var ip in tests)
{
try
{
string[] parsed = ParseIP(ip);
Console.WriteLine(String.Format("{0,-40} {1,-32} {2}", ip, parsed[0], parsed[1]));
}
catch (ArgumentException e)
{
Console.WriteLine(String.Format("{0,-40} Invalid address: {1}", ip, e.Message));
}
}
}
 
private static string[] ParseIP(string ip)
{
string hex = "";
string port = "";
 
// IPV4
Match ipv4Matcher = IPV4_PAT.Match(ip);
if (ipv4Matcher.Success)
{
for (int i = 1; i <= 4; i++)
{
hex += ToHex4(ipv4Matcher.Groups[i].Value);
}
if (ipv4Matcher.Groups[5].Success)
{
port = ipv4Matcher.Groups[5].Value;
}
return new string[] { hex, port };
}
 
// IPV6, double colon
Match ipv6DoubleColonMatcher = IPV6_DOUBL_COL_PAT.Match(ip);
if (ipv6DoubleColonMatcher.Success)
{
string p1 = ipv6DoubleColonMatcher.Groups[1].Value;
if (p1 == "")
{
p1 = "0";
}
string p2 = ipv6DoubleColonMatcher.Groups[2].Value;
if (p2 == "")
{
p2 = "0";
}
ip = p1 + GetZero(8 - NumCount(p1) - NumCount(p2)) + p2;
if (ipv6DoubleColonMatcher.Groups[3].Success)
{
ip = "[" + ip + "]:" + ipv6DoubleColonMatcher.Groups[3].Value;
}
}
 
// IPV6
Match ipv6Matcher = IPV6_PAT.Match(ip);
if (ipv6Matcher.Success)
{
for (int i = 1; i <= 8; i++)
{
hex += String.Format("{0,4}", ToHex6(ipv6Matcher.Groups[i].Value)).Replace(" ", "0");
}
if (ipv6Matcher.Groups[9].Success)
{
port = ipv6Matcher.Groups[9].Value;
}
return new string[] { hex, port };
}
 
throw new ArgumentException("ERROR 103: Unknown address: " + ip);
}
 
private static int NumCount(string s)
{
return s.Split(':').Length;
}
 
private static string GetZero(int count)
{
StringBuilder sb = new StringBuilder();
sb.Append(":");
while (count > 0)
{
sb.Append("0:");
count--;
}
return sb.ToString();
}
 
private static string ToHex4(string s)
{
int val = int.Parse(s);
if (val < 0 || val > 255)
{
throw new ArgumentException("ERROR 101: Invalid value : " + s);
}
return val.ToString("X2");
}
 
private static string ToHex6(string s)
{
int val = int.Parse(s, System.Globalization.NumberStyles.HexNumber);
if (val < 0 || val > 65536)
{
throw new ArgumentException("ERROR 102: Invalid hex value : " + s);
}
return s;
}
}
</syntaxhighlight>
{{out}}
<pre>
Test Case Hex Address Port
192.168.0.1 C0A80001
127.0.0.1 7F000001
256.0.0.1 Invalid address: ERROR 101: Invalid value : 256
127.0.0.1:80 7F000001 80
::1 00000000000000000000000000000001
[::1]:80 00000000000000000000000000000001 80
[32e::12f]:80 032e000000000000000000000000012f 80
2605:2700:0:3::4713:93e3 260527000000000300000000471393e3
[2605:2700:0:3::4713:93e3]:80 260527000000000300000000471393e3 80
2001:db8:85a3:0:0:8a2e:370:7334 20010db885a3000000008a2e03707334
 
</pre>
Line 653 ⟶ 860:
=={{header|C++}}==
{{libheader|Boost}}
<langsyntaxhighlight lang="cpp">#include <boost/asio/ip/address.hpp>
#include <cstdint>
#include <iostream>
Line 758 ⟶ 965:
test("[2605:2700:0:3::4713:93e3]:80");
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 804 ⟶ 1,011:
</pre>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
// Parse IP addresses: Nigel Galloway. May 29th., 2021
open System.Text.RegularExpressions
type ipv6= Complete |Composite |Compressed |CompressedComposite
let ip4n,ip6i,ip6g,ip6e,ip6l=let n,g="[0-9a-fA-F]{1,4}","(25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?[0-9])" in (
sprintf "^(%s)\.(%s)\.(%s)\.(%s)$" g g g g, sprintf "^(%s):(%s):(%s):(%s):(%s):(%s):(%s):(%s)$" n n n n n n n n,
sprintf "^((%s):)?((%s):)?((%s):)?((%s):)?((%s):)?((%s):)?(^|%s)::(%s|$)(:(%s))?(:(%s))?(:(%s))?(:(%s))?(:(%s))?(:(%s))?$" n n n n n n n n n n n n n n,
sprintf "^(%s):(%s):(%s):(%s):(%s):(%s):(%s)\.(%s)\.(%s)\.(%s)$" n n n n n n g g g g,
sprintf "^((%s):)?((%s):)?((%s):)?((%s):)?(^|%s)::((%s):)?((%s):)?((%s):)?((%s):)?((%s):)?(%s)\.(%s)\.(%s)\.(%s)$" n n n n n n n n n n g g g g)
let mn,mi,mg,me,ml=[2;4;6;8;10;12;13], [14..2..26], [2;4;6;8;9], [11..2..19], [20..5..35]
let fN(n:Match) g=g|>List.filter(fun(g:int)->n.Groups.[g].Length>0)
let fI n (g:Match)=n|>List.fold(fun Σ (n:int)->(Σ<<<16)+((int>>bigint)(sprintf "0x%s" g.Groups.[n].Value)))0I
let rec fG n g=let a="0123456789abcdef" in match bigint.DivRem(n,16I) with (n,r) when n=0I->a.[int r]::g|>Array.ofList|>System.String |(n,r)->fG n (a.[int r]::g)
let fE(m:Match) n g=(fN m n,fN m g)
let fL n (g:Match)=n|>List.fold(fun Σ (n:int)->(Σ<<<8)+int(g.Groups.[n].Value))0
let (|IP4 |_|) n=let g=Regex.Match(n,ip4n) in if g.Success then Some(fL [1..5..16] g) else None
let (|IP6n|_|) i=let g=Regex.Match(i,ip6i) in if g.Success then Some(fI [1..8] g) else None
let (|IP6i|_|) g=let g=Regex.Match(g,ip6g) in if g.Success then let n,l=fE g mn mi in (if n.Length+l.Length<8 then Some(((fI n g)<<<((8-n.Length)*16))+(fI l g)) else None) else None
let (|IP6g|_|) e=let g=Regex.Match(e,ip6e) in if g.Success then Some(((fI [1..6] g)<<<32)+bigint(fL [7..5..22] g)) else None
let (|IP6e|_|) l=let g=Regex.Match(l,ip6l) in if g.Success then let n,l=fE g mg me in (if n.Length+l.Length<6 then Some(((fI n g)<<<((8-n.Length)*16))+((fI l g)<<<32)+bigint(fL ml g)) else None) else None
let (|IP6l|_|) n=match n with IP6n n->Some(Complete,fG n []) |IP6i n->Some(Compressed,fG n []) |IP6g n->Some(Composite,fG n []) |IP6e n->Some(CompressedComposite,fG n []) |_->None
let (|IP4p|_|) n=let g=Regex.Match(n,"^(.+):(\d{1,4})$") in if g.Success then match g.Groups.[1].Value with IP4 n->Some(n,int g.Groups.[2].Value) |_->None else None
let (|IP6p|_|) n=let g=Regex.Match(n,"^\[(.+)\]:(\d{1,4})$") in if g.Success then match g.Groups.[1].Value with IP6l n->Some(n,int g.Groups.[2].Value) |_->None else None
let pIP n=match n with IP6p((t,g),p)->printfn "%s is a %A IPv6 address value 0x%s using port %d" n t g p
|IP4 g->printfn "%s is an IPv4 address value %0x" n g
|IP6l(t,g)->printfn "%s is a %A IPv6 address value 0x%s" n t g
|IP4p(g,p)->printfn "%s is an IPv4 address value %0x using port %d" n g p
|_->printfn "%s not matched" n
 
["127.0.0.1";"127.0.0.1:80";"2605:2700:0:3::4713:93e3";"::1";"[::1]:80";"2605:2700:0:3::4713:93e3";"[2605:2700:0:3::4713:93e3]:80";
"::ffff:127.0.0.1";"1:2:3:4:5:6:7:8";"1:2:3:4:5:6:7:8:9";"1:2:3:4:5:6:127.0.0.1"]|>List.iter pIP
</syntaxhighlight>
{{out}}
<pre>
127.0.0.1 is an IPv4 address value 7f000001
127.0.0.1:80 is an IPv4 address value 7f000001 using port 80
2605:2700:0:3::4713:93e3 is a Compressed IPv6 address value 0x260527000000000300000000471393e3
::1 is a Compressed IPv6 address value 0x1
[::1]:80 is a Compressed IPv6 address value 0x1 using port 80
2605:2700:0:3::4713:93e3 is a Compressed IPv6 address value 0x260527000000000300000000471393e3
[2605:2700:0:3::4713:93e3]:80 is a Compressed IPv6 address value 0x260527000000000300000000471393e3 using port 80
::ffff:127.0.0.1 is a CompressedComposite IPv6 address value 0xffff7f000001
1:2:3:4:5:6:7:8 is a Complete IPv6 address value 0x10002000300040005000600070008
1:2:3:4:5:6:7:8:9 not matched
1:2:3:4:5:6:127.0.0.1 is a Composite IPv6 address value 0x1000200030004000500067f000001
</pre>
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
"encoding/hex"
"errors"
"fmt"
"netio"
"net"
"strconv"
"os"
"strings"
"strconv"
"strings"
"text/tabwriter"
)
 
// parseIPPort parses an IP with an optional port, returning an IP and a port (or nil
func ParseIPPort(s string) (ip net.IP, port, space string, err error) {
// if no port was present in the given address).
ip = net.ParseIP(s)
func parseIPPort(address string) (net.IP, *uint64, error) {
if ip == nil {
ip := net.ParseIP(address)
var host string
if ip != nil {
host, port, err = net.SplitHostPort(s)
return ip, nil, nil
if err != nil {
}
return
 
}
host, portStr, err := net.SplitHostPort(address)
if port != "" {
if err != nil {
// This check only makes sense if service names are not allowed
return nil, nil, fmt.Errorf("splithostport failed: %w", err)
if _, err = strconv.ParseUint(port, 10, 16); err != nil {
}
return
 
}
port, err := strconv.ParseUint(portStr, 10, 16)
}
if err != nil {
ip = net.ParseIP(host)
return nil, nil, fmt.Errorf("failed to parse port: %w", err)
}
}
if ip == nil {
 
err = errors.New("invalid address format")
ip = net.ParseIP(host)
} else {
if ip == nil {
space = "IPv6"
return nil, nil, fmt.Errorf("failed to parse ip address")
if ip4 := ip.To4(); ip4 != nil {
}
space = "IPv4"
 
ip = ip4
return ip, &port, nil
}
}
}
 
return
func ipVersion(ip net.IP) int {
if ip.To4() == nil {
return 6
}
 
return 4
}
 
func main() {
var testCases := []string{
"127.0.0.1",
"127.0.0.1:80",
"::1",
"[::1]:80443",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80",
}
}
 
max := len("Input")
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
for _, addr := range testCases {
 
if len(addr) > max {
writeTSV := func(w io.Writer, args ...interface{}) {
max = len(addr)
fmt.Fprintf(w, strings.Repeat("%s\t", len(args)), args...)
}
fmt.Fprintf(w, "\n")
}
}
fmt.Printf("%-*s %*s %-6s %s\n", max, "Input",
 
2*net.IPv6len, "Address", "Space", "Port")
writeTSV(w, "Input", "Address", "Space", "Port")
for _, addr := range testCases {
 
fmt.Printf("%-*s ", max, addr)
for _, addr := range testCases {
ip, port, space, err := ParseIPPort(addr)
ip, port, err := parseIPPort(addr)
if err != nil {
if err != nil {
fmt.Println(err)
panic(err)
continue
}
}
 
fmt.Print(strings.Repeat(" ", net.IPv6len-len(ip)))
portStr := "n/a"
for _, b := range ip {
if port != nil {
fmt.Printf("%02x", b)
portStr = fmt.Sprint(*port)
}
}
fmt.Printf(" %-6s %s\n", space, port)
 
}
ipVersion := fmt.Sprintf("IPv%d", ipVersion(ip))
}</lang>
 
writeTSV(w, addr, hex.EncodeToString(ip), ipVersion, portStr)
}
 
w.Flush()
}
</syntaxhighlight>
{{out}}
<pre>
Input Address Address Space Port
127.0.0.1 7f00000100000000000000000000ffff7f000001 IPv4
127.0.0.1:80 7f00000100000000000000000000ffff7f000001 IPv4 80
::1 00000000000000000000000000000001 IPv6
[::1]:80 443 00000000000000000000000000000001 IPv6 80443
2605:2700:0:3::4713:93e3 260527000000000300000000471393e3 IPv6
[2605:2700:0:3::4713:93e3]:80 260527000000000300000000471393e3 IPv6 80
</pre>
 
=={{header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">import Data.List (isInfixOf)
import Numeric (showHex)
import Data.Char (isDigit)
Line 999 ⟶ 1,269:
"2605:2700:0:3::4713:93e3", -- Rosetta Code
"[2605:2700:0:3::4713:93e3]:80"] -- Rosetta Code
</syntaxhighlight>
</lang>
Output:<pre>
IPv4 7f000001
Line 1,010 ⟶ 1,280:
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">link printf, hexcvt
 
procedure main()
Line 1,090 ⟶ 1,360:
}
}
end</langsyntaxhighlight>
 
{{libheader|Icon Programming Library}}
Line 1,117 ⟶ 1,387:
Implementation:
 
<langsyntaxhighlight Jlang="j">parseaddr=:3 :0
if. '.' e. y do.
if. +./'::' E. y do.
Line 1,153 ⟶ 1,423:
((#y){.'v';'addr';'port')=. y
'ipv',(":v),' ',(hfd addr),(#port)#' ',":port
)</langsyntaxhighlight>
 
Task examples:
 
<langsyntaxhighlight Jlang="j"> fmt parseaddr '127.0.0.1'
ipv4 7f000001
fmt parseaddr '127.0.0.1:80'
Line 1,168 ⟶ 1,438:
ipv6 260527000000000300000000471393e3
fmt parseaddr '[2605:2700:0:3::4713:93e3]:80'
ipv6 260527000000000300000000471393e3 80</langsyntaxhighlight>
 
The intermediate (unformatted) result from parseaddr is the protocol number (4 or 6), the address and optionally the port:<syntaxhighlight lang="j"> parseaddr '127.0.0.1'
4 2130706433
parseaddr '127.0.0.1:80'
4 2130706433 80
parseaddr '::1'
6 1
parseaddr '[::1]:80'
6 1 80
parseaddr '2605:2700:0:3::4713:93e3'
6 50537416338094019778974086937420469219
parseaddr '[2605:2700:0:3::4713:93e3]:80'
6 50537416338094019778974086937420469219 80</syntaxhighlight>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
<lang Java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Line 1,282 ⟶ 1,565:
 
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,297 ⟶ 1,580:
2001:db8:85a3:0:0:8a2e:370:7334 20010db885a3000000008a2e03707334
</pre>
 
=={{header|jq}}==
'''Works with gojq''', the Go implementation of jq.
 
'''Adapted from [[#Wren|Wren]]'''
 
<syntaxhighlight lang="jq">
# Generic preliminaries
 
# To take advantage of gojq's arbitrary-precision integer arithmetic:
def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in);
 
# To take advantage of gojq's arbitrary-precision integer arithmetic:
# if the input and $j are integers, then the result will be an integer.
def div($j):
(. - (. % j)) / $j;
 
# integer to stream of 0s and 1s, least significant bit first
def bitwise:
recurse( if . >= 2 then div(2) else empty end) | . % 2;
 
# inverse of `bitwise`
def stream_to_integer(stream):
reduce stream as $c ( {power:1 , ans: 0};
.ans += ($c * .power) | .power *= 2 )
| .ans;
 
# Input determines the max number of bits to be retained
# $x and $y are two integers
def xorBits($x;$y):
def lxor(a;b):
if (a==1 or b==1) and ((a==1 and b==1)|not) then 1
elif a == null then b
elif b == null then a
else 0
end;
if $x == 0 then $y
elif $y == 0 then $x
else
[if . then limit(.; $x|bitwise) else $x|bitwise end] as $s
| [if . then limit(.; $y|bitwise) else $y|bitwise end] as $t
| stream_to_integer(
range(0; [($s|length), ($t|length)] | max) as $i
| lxor($s[$i]; $t[$i]) )
end ;
 
# $x and $y are two integers
def xor($x;$y):
null | xorBits($x;$y);
 
def count(stream): reduce stream as $i (0; .+1);
 
# Input: an array
def insert($i; $x): .[:$i] + [$x] + .[$i:];
 
# Input: a non-negative integer
def tobase($b):
def digit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1];
def mod: . % $b;
def div: ((. - mod) / $b);
def digits: recurse( select(. > 0) | div) | mod ;
# For jq it would be wise to protect against `infinite` as input, but using `isinfinite` confuses gojq
select( (tostring|test("^[0-9]+$")) and 2 <= $b and $b <= 36)
| if . == 0 then "0"
else [digits | digit] | reverse[1:] | add
end;
 
# Input: a string in base $b
# Output: its decimal value
def frombase($b):
def decimalValue:
if 48 <= . and . <= 57 then . - 48
elif 65 <= . and . <= 90 then . - 55 # (10+.-65)
elif 97 <= . and . <= 122 then . - 87 # (10+.-97)
else "decimalValue <- \(.)" | error
end;
reduce (explode|reverse[]|decimalValue) as $x ({p:1};
.value += (.p * $x)
| .p *= $b)
| .value ;
 
### Parse an IP address
 
# An IPAddress is represented by an object {"address", "addressSpace", "port"}
# where addressSpace is one of "IPv4", "IPv6", "Invalid"
# and a port of -1 denotes 'not specified'.
 
def INVALID: {address: 0, addressSpace: "Invalid", port: 0};
 
def ipAddressParse:
 
# Helper for octet1
# Assumes .len == (.hextets|length)
def fixhextets:
.insertions = (8 - .len)
| .i = 0
| until(.i == 8;
if .hextets[.i] == ""
then .hextets[.i] = "0"
| until( .insertions <= 0;
.insertions += -1
| .i as $i
| .hextets |= insert($i; "0") )
| .i = 8
else .i += 1
end ) ;
# Handle the case when octet length is 4
def octet4:
(.octets[0] | split(":")) as $split
| if $split|length == 2
then ($split[1]|tonumber? // null) as $temp
| if $temp | (. == null or . < 0 or . > 65535)
then .return = INVALID
else .port = $temp
| .octets[0] = $split[0]
end
else .
end
| if .return then .
else reduce range(0;4) as $i (.;
if .return then .
else (.octets[$i] | tonumber? // null) as $num
| if $num | (. == null or . < 0 or . > 255) then .return = INVALID
else .address = xor(.address; $num * (2 | power($i * 8)))
end
end)
end
| if .return then .
elif .trans
then .address += 281470681743360 # "ffff00000000"
else .
end ;
 
# Handle the case when octet length is 1
def octet1:
.addressSpace = "IPv6"
| if .ipa[0:1] == "["
then .ipa |= .[1:]
| (.ipa | split("]:")) as $split
| if $split|length != 2 then .return = INVALID
else ($split[1] | tonumber? // null) as $temp
| if $temp | (. == null or . < 0 or . > 65535) then .return = INVALID
else .port = $temp
| .ipa |= .[0: (-2 - ($split[1]|length))]
end
end
else .
end
| if .return then .
else .hextets = (.ipa | split(":")|reverse)
| .len = (.hextets|length)
| if .ipa|startswith("::")
then .hextets[-1] = "0"
elif .ipa|endswith("::")
then .hextets[0] = "0"
else .
end
| if .ipa == "::" then .hextets[1] = "0" else . end
| if .len > 8 or (.len == 8 and any(.hextets[]; . == "")) or count(.hextets[] | select(. == "")) > 1
then .return = INVALID
else .
end
end
| if .return then .
elif .len < 8
then fixhextets
else .
end
| if .return then .
else reduce range(0; 8) as $j (.;
if .return then .
else (.hextets[$j] | frombase(16)) as $num
| if $num > 65535 then .return = INVALID
else .address = xor(.address; $num * (2 | power($j * 16)))
end
end)
end ;
 
{ addressSpace: "IPv4",
ipa: ascii_downcase,
port: -1,
trans: false }
| if (.ipa|startswith("::ffff:")) and (.ipa|test("[.]"))
then .addressSpace = "IPv6"
| .trans = true
| .ipa |= .[7:]
elif (.ipa|startswith("[::ffff:")) and (.ipa|test("[.]"))
then .addressSpace = "IPv6"
| .trans = true
| .ipa |= (.[8:] | gsub("]";""))
else .
end
| .octets = (.ipa | split(".") | reverse)
| .address = 0
| if .octets|length == 4
then octet4
elif .octets|length == 1
then octet1
else .return = INVALID
end
| if .return then .return
else {address, addressSpace, port}
end ;
 
# Examples
def ipas:
"127.0.0.1",
"127.0.0.1:80",
"::1",
"[::1]:80",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80",
"::ffff:192.168.173.22",
"[::ffff:192.168.173.22]:80",
"1::",
"::",
"256.0.0.0",
"::ffff:127.0.0.0.1"
;
 
ipas
| "IP address : \(.)",
( ipAddressParse
| "Address : \(.address|tobase(16))",
"Address Space : \(.addressSpace)",
"Port : \(if .port == -1 then "not specified" else .port end)",
""
)
</syntaxhighlight>
'''Invocation''': gojq -nr -f parse-an-ip-address.jq
{{output}}
Exactly as for [[#Wren|Wren]]
 
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">
const testdata = ["127.0.0.1", "127.0.0.1:80", "::1", "[::1]:80",
"2605:2700:0:3::4713:93e3", "[2605:2700:0:3::4713:93e3]:80",
Line 1,334 ⟶ 1,851:
println("For input $ip, IP in hex is $hx, address space $add, port $por.")
end
</syntaxhighlight>
</lang>
{{output}}
<pre>
Line 1,364 ⟶ 1,881:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.3
 
import java.math.BigInteger
Line 1,481 ⟶ 1,998:
println()
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,545 ⟶ 2,062:
Port : 0
</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import net, sequtils, strscans, strutils
 
const NoPort = -1
 
func parseIpAddressAndPort(str: string): tuple[ipAddr: IpAddress; port: int] =
var ipString: string
var port: int
if str.scanf("[$+]:$i", ipString, port):
# IP v6 address with port.
return (ipString.parseIpAddress(), port)
if '.' in str and str.scanf("$+:$i", ipString, port):
# IP v4 address with port.
return (ipString.parseIpAddress(), port)
# IP address without port.
result = (str.parseIpAddress(), NoPort)
 
 
const Inputs = ["127.0.0.1", "127.0.0.1:80",
"::1", "[::1]:80",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80"]
 
# Room to reserve to display the input.
const InputSize = Inputs.mapIt(it.len).foldl(max(a, b)) + 2
 
echo "Input".alignLeft(InputSize), "Address".align(32), " Space", " Port"
 
for input in Inputs:
try:
let (ipAddress, port) = input.parseIpAddressAndPort()
let portStr = if port == NoPort: "" else: $port
case ipAddress.family
of IPv6:
echo input.alignLeft(InputSize),
ipAddress.address_v6.map(toHex).join().align(32),
"IP v6".align(7),
portStr.align(6)
of IPv4:
echo input.alignLeft(InputSize),
ipAddress.address_v4.map(toHex).join().align(32),
"IP v4".align(7),
portStr.align(6)
 
except ValueError:
echo "Invalid IP address: ", input</syntaxhighlight>
 
{{out}}
<pre>Input Address Space Port
127.0.0.1 7F000001 IP v4
127.0.0.1:80 7F000001 IP v4 80
::1 00000000000000000000000000000001 IP v6
[::1]:80 00000000000000000000000000000001 IP v6 80
2605:2700:0:3::4713:93e3 260527000000000300000000471393E3 IP v6
[2605:2700:0:3::4713:93e3]:80 260527000000000300000000471393E3 IP v6 80</pre>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">sub parse_v4 {
my ($ip, $port) = @_;
my @quad = split(/\./, $ip);
Line 1,628 ⟶ 2,201:
 
print "$ver $ip\tport $port\n\n";
}</langsyntaxhighlight>output<syntaxhighlight lang="text">127.0.0.1
v4 7f000001 port -1
 
Line 1,655 ⟶ 2,228:
parse error
a::b::1
parse error</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>function parse_ip(string txt)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
sequence r
<span style="color: #008080;">function</span> <span style="color: #000000;">parse_ip</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
integer dot = find('.',txt),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">r</span>
colon = find(':',txt),
<span style="color: #004080;">integer</span> <span style="color: #000000;">dot</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">),</span>
openbr = find('[',txt),
<span style="color: #000000;">colon</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">':'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">),</span>
closebr = find(']',txt)
<span style="color: #000000;">openbr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'['</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">),</span>
if colon=5 and txt[1..4] = "http" then
<span style="color: #000000;">closebr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">']'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
txt = trim(txt[6..$],"/")
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span> <span style="color: #008080;">and</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"http"</span><span style="color: #0000FF;">)</span>
return parse_ip(txt)
<span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">=</span><span style="color: #000000;">6</span> <span style="color: #008080;">and</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">5</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"https"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$],</span><span style="color: #008000;">"/"</span><span style="color: #0000FF;">)</span>
bool ipv6 = openbr or dot=0 or (colon and colon<dot)
<span style="color: #008080;">return</span> <span style="color: #000000;">parse_ip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
if ipv6 then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence res = repeat(0,8)
<span style="color: #004080;">bool</span> <span style="color: #000000;">ipv6</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">openbr</span> <span style="color: #008080;">or</span> <span style="color: #000000;">dot</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">colon</span> <span style="color: #008080;">and</span> <span style="color: #000000;">colon</span><span style="color: #0000FF;"><</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">)</span>
if openbr then
<span style="color: #008080;">if</span> <span style="color: #000000;">ipv6</span> <span style="color: #008080;">then</span>
if openbr!=1 or closebr<openbr then return 0 end if
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">)</span>
r = scanf(txt[closebr+1..$],":%d")
<span style="color: #008080;">if</span> <span style="color: #000000;">openbr</span> <span style="color: #008080;">then</span>
if length(r)!=1 then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #000000;">openbr</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">closebr</span><span style="color: #0000FF;"><</span><span style="color: #000000;">openbr</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
atom port = r[1][1]
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">closebr</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$],</span><span style="color: #008000;">":%d"</span><span style="color: #0000FF;">)</span>
if port<0 or port>65535 then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
res &= port
<span style="color: #004080;">atom</span> <span style="color: #000000;">port</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
txt = txt[2..closebr-1]
<span style="color: #008080;">if</span> <span style="color: #000000;">port</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">port</span><span style="color: #0000FF;">></span><span style="color: #000000;">65535</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #000000;">res</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">port</span>
if dot then
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..</span><span style="color: #000000;">closebr</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
colon = rfind(':',txt)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if colon>dot then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #000000;">dot</span> <span style="color: #008080;">then</span>
object r4 = parse_ip(txt[colon+1..$])
<span style="color: #000000;">colon</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rfind</span><span style="color: #0000FF;">(</span><span style="color: #008000;">':'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
if not sequence(r4) or length(r4)!=4 then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #000000;">colon</span><span style="color: #0000FF;">></span><span style="color: #000000;">dot</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
res[7] = r4[1]*#100+r4[2]
<span style="color: #004080;">object</span> <span style="color: #000000;">r4</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parse_ip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$])</span>
res[8] = r4[3]*#100+r4[4]
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r4</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r4</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">4</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
txt = txt[1..colon-1+(txt[colon-1]=':')]
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">7</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r4</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">#100</span><span style="color: #0000FF;">+</span><span style="color: #000000;">r4</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span>
dot = 2
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">8</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r4</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">#100</span><span style="color: #0000FF;">+</span><span style="color: #000000;">r4</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">]</span>
end if
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">':'</span><span style="color: #0000FF;">)]</span>
sequence r8 = {}
<span style="color: #000000;">dot</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span>
integer ip = 0
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
while length(txt) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">r8</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
colon = find(':',txt)
<span style="color: #004080;">integer</span> <span style="color: #000000;">ip</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
if colon=1 then
<span style="color: #008080;">while</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if ip then return 0 end if
<span style="color: #000000;">colon</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">':'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">)</span>
ip = length(r8)+1
<span style="color: #008080;">if</span> <span style="color: #000000;">colon</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
txt = txt[2+(length(r8)=0)..$]
<span style="color: #008080;">if</span> <span style="color: #000000;">ip</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
else
<span style="color: #000000;">ip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r8</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span>
r = scanf(txt[1..colon-1],"%x")
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r8</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)..$]</span>
if length(r)!=1 then return 0 end if
<span atom r11 style="color: r[1][1]#008080;">else</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"%x"</span><span style="color: #0000FF;">)</span>
if r11<0 or r11>#FFFF then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
r8 &= r11
<span style="color: #004080;">atom</span> <span style="color: #000000;">r11</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
if colon=0 then exit end if
<span style="color: #008080;">if</span> <span style="color: #000000;">r11</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">r11</span><span style="color: #0000FF;">></span><span style="color: #000000;">#FFFF</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
txt = txt[colon+1..$]
<span style="color: #000000;">r8</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">r11</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">colon</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end while
<span style="color: #000000;">txt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]</span>
if ip then
if length(r8)><span style=(8-dot)"color: then#008080;">end</span> return<span 0 endstyle="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
r8[ip..ip-1] = repeat(0,(8-dot)-length(r8))
<span style="color: #008080;">if</span> <span style="color: #000000;">ip</span> <span style="color: #008080;">then</span>
else
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r8</span><span style="color: #0000FF;">)>=(</span><span style="color: #000000;">8</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if length(r8)!=8-dot then return 0 end if
<span style="color: #000000;">r8</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ip</span><span style="color: #0000FF;">..</span><span style="color: #000000;">ip</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,(</span><span style="color: #000000;">8</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">)-</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r8</span><span style="color: #0000FF;">))</span>
end if
<span style="color: #008080;">else</span>
res[1..8-dot] = r8
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r8</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">8</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dot</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return res
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">8</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r8</span>
-- ipv4:
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
if dot=0 or (colon and colon<dot) then return 0 end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
r = scanf(txt[1..colon-1],"%d.%d.%d.%d")
<span style="color: #000080;font-style:italic;">-- ipv4:</span>
if length(r)!=1 then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #000000;">dot</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">colon</span> <span style="color: #008080;">and</span> <span style="color: #000000;">colon</span><span style="color: #0000FF;"><</span><span style="color: #000000;">dot</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
r = r[1]
<span style="color: #004080;">string</span> <span style="color: #000000;">d4</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #008000;">'.'</span><span style="color: #0000FF;">,</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">)</span>
for i=1 to length(r) do
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d4</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d %d %d %d"</span><span style="color: #0000FF;">)</span>
if r[i]<0 or r[i]>255 then return 0 end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
if colon then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
sequence r2 = scanf(txt[colon+1..$],"%d")
<span style="color: #008080;">if</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]<</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]></span><span style="color: #000000;">255</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if length(r2)!=1 then return 0 end if
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
atom port = r2[1][1]
<span style="color: #008080;">if</span> <span style="color: #000000;">colon</span> <span style="color: #008080;">then</span>
if port<0 or port>65535 then return 0 end if
<span style="color: #004080;">sequence</span> <span style="color: #000000;">r2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">txt</span><span style="color: #0000FF;">[</span><span style="color: #000000;">colon</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$],</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">)</span>
r &= port
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r2</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #004080;">atom</span> <span style="color: #000000;">port</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">r2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
return r
<span style="color: #008080;">if</span> <span style="color: #000000;">port</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">port</span><span style="color: #0000FF;">></span><span style="color: #000000;">65535</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function
<span style="color: #000000;">r</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">port</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
constant tests = {{"127.0.0.1",{127,0,0,1}},
<span style="color: #008080;">return</span> <span style="color: #000000;">r</span>
{"127.0.0.1:80",{127,0,0,1,80}},
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
{"::1",{0,0,0,0,0,0,0,1}},
{"[::1]:80",{0,0,0,0,0,0,0,1,80}},
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"127.0.0.1"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"2605:2700:0:3::4713:93e3",{#2605,#2700,0,3,0,0,#4713,#93e3}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"127.0.0.1:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"[2605:2700:0:3::4713:93e3]:80",{#2605,#2700,0,3,0,0,#4713,#93e3,80}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::1"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"::ffff:192.168.173.22",{0,0,0,0,0,#ffff,#c0a8,#ad16}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[::1]:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"[::ffff:192.168.173.22]:80",{0,0,0,0,0,#ffff,#c0a8,#ad16,80}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2605:2700:0:3::4713:93e3"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2605</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#2700</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#4713</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#93e3</span><span style="color: #0000FF;">}},</span>
{"1::",{1,0,0,0,0,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[2605:2700:0:3::4713:93e3]:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2605</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#2700</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#4713</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#93e3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"[1::]:80",{1,0,0,0,0,0,0,0,80}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::ffff:192.168.173.22"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#c0a8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ad16</span><span style="color: #0000FF;">}},</span>
{"::",{0,0,0,0,0,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[::ffff:192.168.173.22]:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#c0a8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ad16</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"[::]:80",{0,0,0,0,0,0,0,0,80}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"1::"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"192.168.0.1",{192,168,0,1}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[1::]:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"2001:db8:85a3:0:0:8a2e:370:7334",{#2001,#db8,#85a3,0,0,#8a2e,#370,#7334}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"2001:db8:85a3::8a2e:370:7334",{#2001,#db8,#85a3,0,0,#8a2e,#370,#7334}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[::]:80"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">80</span><span style="color: #0000FF;">}},</span>
{"[2001:db8:85a3:8d3:1319:8a2e:370:7334]:443",{#2001,#db8,#85a3,#8d3,#1319,#8a2e,#370,#7334,443}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"192.168.0.1"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">192</span><span style="color: #0000FF;">,</span><span style="color: #000000;">168</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"256.0.0.0",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:db8:85a3:0:0:8a2e:370:7334"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#85a3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8a2e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#370</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#7334</span><span style="color: #0000FF;">}},</span>
{"g::1",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:db8:85a3::8a2e:370:7334"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#85a3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8a2e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#370</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#7334</span><span style="color: #0000FF;">}},</span>
{"::ffff:127.0.0.0.1",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[2001:db8:85a3:8d3:1319:8a2e:370:7334]:443"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#85a3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8d3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#1319</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8a2e</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#370</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#7334</span><span style="color: #0000FF;">,</span><span style="color: #000000;">443</span><span style="color: #0000FF;">}},</span>
{"a::b::1",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"256.0.0.0"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"0000",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"g::1"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"0000:0000",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::ffff:127.0.0.0.1"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"0000:0000:0000:0000:0000:0000:0000:0000",{0,0,0,0,0,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"a::b::1"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"0000:0000:0000::0000:0000",{0,0,0,0,0,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"0000"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"0000::0000::0000:0000",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"0000:0000"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",{#ffff,#ffff,#ffff,#ffff,#ffff,#ffff,#ffff,#ffff}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"0000:0000:0000:0000:0000:0000:0000:0000"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"ffff:ffff:ffff:fffg:ffff:ffff:ffff:ffff",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"0000:0000:0000::0000:0000"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",{#fff,#ffff,#ffff,#ffff,#ffff,#ffff,#ffff,#ffff}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"0000::0000::0000:0000"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"fff:ffff:0:ffff:ffff:ffff:ffff:ffff",{#fff,#ffff,0,#ffff,#ffff,#ffff,#ffff,#ffff}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">}},</span>
{"2001:0db8:0:0:0:0:1428:57ab",{#2001,#0db8,0,0,0,0,#1428,#57ab}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"ffff:ffff:ffff:fffg:ffff:ffff:ffff:ffff"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"2001:0db8::1428:57ab",{#2001,#0db8,0,0,0,0,#1428,#57ab}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#fff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">}},</span>
{"2001:0db8:0:0:8d3:0:0:0",{#2001,#0db8,0,0,#8d3,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"fff:ffff:0:ffff:ffff:ffff:ffff:ffff"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#fff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">}},</span>
{"2001:0db8:0:0:8d3::",{#2001,#0db8,0,0,#8d3,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:0db8:0:0:0:0:1428:57ab"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#0db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#1428</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#57ab</span><span style="color: #0000FF;">}},</span>
{"2001:0db8::8d3:0:0:0",{#2001,#0db8,0,0,#8d3,0,0,0}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:0db8::1428:57ab"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#0db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#1428</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#57ab</span><span style="color: #0000FF;">}},</span>
{"http://127.0.0.1/",{127,0,0,1}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:0db8:0:0:8d3:0:0:0"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#0db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8d3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"http:",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:0db8:0:0:8d3::"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#0db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8d3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"http:/2001:db8:3:4::127.0.2.0",{#2001,#db8,3,4,0,0,#7F00,#200}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"2001:0db8::8d3:0:0:0"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#0db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#8d3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
{"::192.168.0.1",{0,0,0,0,0,0,#C0A8,1}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"http://127.0.0.1/"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"::ffff:0:255.255.255.255",{0,0,0,0,#ffff,0,#ffff,#ffff}},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"https://127.0.0.1/"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">127</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"http:"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{"ffffffffffffffffffffffffffffffff::",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"http:/2001:db8:3:4::127.0.2.0"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">#2001</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#db8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#7F00</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#200</span><span style="color: #0000FF;">}},</span>
{"[1::]:9999999999999999999999999999",0},
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::192.168.0.1"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#C0A8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
{"I think that's enough tests for now",0}}
<span style="color: #0000FF;">{</span><span style="color: #008000;">"::ffff:0:255.255.255.255"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">,</span><span style="color: #000000;">#ffff</span><span style="color: #0000FF;">}},</span>
 
<span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
for i=1 to length(tests) do
<span style="color: #0000FF;">{</span><span style="color: #008000;">"ffffffffffffffffffffffffffffffff::"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{string ip, object expected} = tests[i]
<span style="color: #0000FF;">{</span><span style="color: #008000;">"[1::]:9999999999999999999999999999"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
object actual = parse_ip(ip)
<span style="color: #0000FF;">{</span><span style="color: #008000;">"I think that's enough tests for now"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}}</span>
if actual!=expected then
?{ip,actual,expected}
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
?9/0
<span style="color: #0000FF;">{</span><span style="color: #004080;">string</span> <span style="color: #000000;">ip</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">object</span> <span style="color: #000000;">expected</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
end if
<span style="color: #004080;">object</span> <span style="color: #000000;">actual</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">parse_ip</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ip</span><span style="color: #0000FF;">)</span>
string addr
<span style="color: #008080;">if</span> <span style="color: #000000;">actual</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">expected</span> <span style="color: #008080;">then</span>
if actual=0 then
<span style="color: #0000FF;">?{</span><span style="color: #000000;">ip</span><span style="color: #0000FF;">,</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">,</span><span style="color: #000000;">expected</span><span style="color: #0000FF;">}</span>
addr = "**not a valid ip address**"
<span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span>
else
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if remainder(length(actual),2) then
<span style="color: #004080;">string</span> <span style="color: #000000;">addr</span>
actual[$] = sprintf(", port %d",actual[$])
<span style="color: #008080;">if</span> <span style="color: #000000;">actual</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
else
<span style="color: #000000;">addr</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"**not a valid ip address**"</span>
actual = append(actual,"")
<span style="color: #008080;">else</span>
end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
if length(actual)=5 then
<span style="color: #000000;">actual</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">", port %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">[$])</span>
addr = sprintf("ivp4 address: %02x%02x%02x%02x%s",actual)
<span style="color: #008080;">else</span>
elsif length(actual)=9 then
<span style="color: #000000;">actual</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span>
addr = sprintf("ivp6 address: %04x%04x%04x%04x%04x%04x%04x%04x%s",actual)
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
else
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">5</span> <span style="color: #008080;">then</span>
?9/0
<span style="color: #000000;">addr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"ivp4 address: %02x%02x%02x%02x%s"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">9</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">addr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"ivp6 address: %04x%04x%04x%04x%04x%04x%04x%04x%s"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">actual</span><span style="color: #0000FF;">)</span>
printf(1,"%45s %s\n",{ip,addr})
<span style="color: #008080;">else</span>
end for</lang>
<span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%45s %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ip</span><span style="color: #0000FF;">,</span><span style="color: #000000;">addr</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
                                    127.0.0.1 ivp4 address: 7F000001
127.0.0.1 ivp4 address: 7F000001
                                 127.0.0.1:80 ivp4 address: 7F000001, port 80
127.0.0.1:80 ivp4 address: 7F000001, port 80
                                          ::1 ivp6 address: 00000000000000000000000000000001
::1 ivp6 address: 00000000000000000000000000000001
                                     [::1]:80 ivp6 address: 00000000000000000000000000000001, port 80
[::1]:80 ivp6 address: 00000000000000000000000000000001, port 80
                     2605:2700:0:3::4713:93e3 ivp6 address: 260527000000000300000000471393E3
2605:2700:0:3::4713:93e3 ivp6 address: 260527000000000300000000471393E3
                [2605:2700:0:3::4713:93e3]:80 ivp6 address80 ivp6 address: 260527000000000300000000471393E3 260527000000000300000000471393E3, port 80 port 80
                        ::ffff:192.168.173.22 ivp6 address: 00000000000000000000FFFFC0A8AD16
::ffff:192.168.173.22 ivp6 address: 00000000000000000000FFFFC0A8AD16
                   [::ffff:192.168.173.22]:80 ivp6 address: 00000000000000000000FFFFC0A8AD16, port 80
[::ffff:192.168.173.22]:80 ivp6 address: 00000000000000000000FFFFC0A8AD16, port 80
                                          1:: ivp6 address: 00010000000000000000000000000000
1:: ivp6 address: 00010000000000000000000000000000
                                     [1::]:80 ivp6 address: 00010000000000000000000000000000, port 80
[1::]:80 ivp6 address: 00010000000000000000000000000000, port 80
                                           :: ivp6 address: 00000000000000000000000000000000
:: ivp6 address: 00000000000000000000000000000000
                                      [::]:80 ivp6 address: 00000000000000000000000000000000, port 80
[::]:80 ivp6 address: 00000000000000000000000000000000, port 80
                                  192.168.0.1 ivp4 address: C0A80001
192.168.0.1 ivp4 address: C0A80001
              2001:db8:85a3:0:0:8a2e:370:7334 ivp6 address: 20010DB885A3000000008A2E03707334
2001:db8:85a3:0:0:8a2e:370:7334 ivp6 address: 20010DB885A3000000008A2E03707334
                 2001:db8:85a3::8a2e:370:7334 ivp6 address: 20010DB885A3000000008A2E03707334
2001:db8:85a3::8a2e:370:7334 ivp6 address: 20010DB885A3000000008A2E03707334
   [2001:db8:85a3:8d3:1319:8a2e:370:7334]:443 ivp6 address443 ivp6 address: 20010DB885A308D313198A2E03707334 20010DB885A308D313198A2E03707334, port 443 port 443
                                    256.0.0.0 **not a valid ip address**
256.0.0.0 **not a valid ip address**
                                         g::1 **not a valid ip address**
g::1 **not a valid ip address**
                           ::ffff:127.0.0.0.1 **not a valid ip address**
::ffff:127.0.0.0.1 **not a valid ip address**
                                      a::b::1 **not a valid ip address**
a::b::1 **not a valid ip address**
                                         0000 **not a valid ip address**
0000 **not a valid ip address**
                                    0000:0000 **not a valid ip address**
0000:0000 **not a valid ip address**
0000      0000:0000:0000:0000:0000:0000:0000:0000 ivp6 address0000 ivp6 address: 00000000000000000000000000000000 00000000000000000000000000000000
                    0000:0000:0000::0000:0000 ivp6 address: 00000000000000000000000000000000
0000:0000:0000::0000:0000 ivp6 address: 00000000000000000000000000000000
                        0000::0000::0000:0000 **not a valid ip address**
0000::0000::0000:0000 **not a valid ip address**
ffff      ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ivp6 addressffff ivp6 address: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
ffff      ffff:ffff:ffff:fffg:ffff:ffff:ffff:ffff ffff **not a valid ip addressnot a valid ip address**
fff       fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff ivp6 addressffff ivp6 address: 0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
fff          fff:ffff:0:ffff:ffff:ffff:ffff:ffff ivp6 addressffff ivp6 address: 0FFFFFFF0000FFFFFFFFFFFFFFFFFFFF 0FFFFFFF0000FFFFFFFFFFFFFFFFFFFF
                  2001:0db8:0:0:0:0:1428:57ab ivp6 address: 20010DB80000000000000000142857AB
2001:0db8:0:0:0:0:1428:57ab ivp6 address: 20010DB80000000000000000142857AB
                         2001:0db8::1428:57ab ivp6 address: 20010DB80000000000000000142857AB
2001:0db8::1428:57ab ivp6 address: 20010DB80000000000000000142857AB
                      2001:0db8:0:0:8d3:0:0:0 ivp6 address: 20010DB80000000008D3000000000000
2001:0db8:0:0:8d3:0:0:0 ivp6 address: 20010DB80000000008D3000000000000
                          2001:0db8:0:0:8d3:: ivp6 address: 20010DB80000000008D3000000000000
2001:0db8:0:0:8d3:: ivp6 address: 20010DB80000000008D3000000000000
                         2001:0db8::8d3:0:0:0 ivp6 address: 20010DB80000000008D3000000000000
2001:0db8::8d3:0:0:0 ivp6 address: 20010DB80000000008D3000000000000
                            http://127.0.0.1/ ivp4 address: 7F000001
http://127.0.0.1/ ivp4 address: 7F000001
                           https://127.0.0.1/ ivp4 address: 7F000001
http: **not a valid ip address**
                                        http: **not a valid ip address**
http:/2001:db8:3:4::127.0.2.0 ivp6 address: 20010DB800030004000000007F000200
                http:/2001:db8:3:4::127.0.2.0 ivp6 address: 20010DB800030004000000007F000200
::192.168.0.1 ivp6 address: 000000000000000000000000C0A80001
                                ::192.168.0.1 ivp6 address: 000000000000000000000000C0A80001
::ffff:0:255.255.255.255 ivp6 address: 0000000000000000FFFF0000FFFFFFFF
                     ::ffff:0:255.255.255.255 ivp6 address: 0000000000000000FFFF0000FFFFFFFF
**not a valid ip address**
                                              **not a valid ip address**
ffffffffffffffffffffffffffffffff:: **not a valid ip address**
           ffffffffffffffffffffffffffffffff:: **not a valid ip address**
[1::]:9999999999999999999999999999 **not a valid ip address**
           [1::]:9999999999999999999999999999 **not a valid ip address**
I think that's enough tests for now **not a valid ip address**
          I think that's enough tests for now **not a valid ip address**
</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp"># Return a cons pair of address and port: (address . port)
(de ipAddress (Adr)
(use (@A @B @C @D @Port)
Line 1,884 ⟶ 2,464:
(need (- 9 (length Lst)) 0) ) ) # Handle '::'
(cons (or (car Lst) "0") (cdr Lst)) ) )
(format Port) ) )</langsyntaxhighlight>
Test:
<langsyntaxhighlight PicoLisplang="picolisp">(for A
(quote
"127.0.0.1"
Line 1,899 ⟶ 2,479:
(hex (car I))
(format (car I))
(cdr I) ) ) )</langsyntaxhighlight>
Output:
<pre style="height:8em;overflow:scroll">127.0.0.1 7F000001 2130706433
Line 1,909 ⟶ 2,489:
 
==PL/I==
<langsyntaxhighlight lang="pli">*process or(!) source xref attributes macro options;
/*********************************************************************
* Program to parse an IP address into --> IPv4 or IPv6 format
Line 2,185 ⟶ 2,765:
End;
 
end;</langsyntaxhighlight>
Output:
<pre style="overflow:scroll">
Line 2,199 ⟶ 2,779:
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Get-IpAddress
{
Line 2,262 ⟶ 2,842:
}
}
</syntaxhighlight>
</lang>
Parse an array of IP addresses in a text format:
<syntaxhighlight lang="powershell">
<lang PowerShell>
$ipAddresses = "127.0.0.1","127.0.0.1:80","::1","[::1]:80","2605:2700:0:3::4713:93e3","[2605:2700:0:3::4713:93e3]:80" | Get-IpAddress
$ipAddresses
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,280 ⟶ 2,860:
</pre>
The '''Address''' "property" is an object containing more information...
<syntaxhighlight lang="powershell">
<lang PowerShell>
$ipAddresses[5].Address
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,296 ⟶ 2,876:
</pre>
... allowing for specific filtering:
<syntaxhighlight lang="powershell">
<lang PowerShell>
$ipAddresses | where {$_.Address.AddressFamily -eq "InterNetworkV6" -and $_.Port -ne $null}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 2,310 ⟶ 2,890:
===Python: Using ipaddress===
{{works with|Python|3.5}}
<langsyntaxhighlight lang="python">from ipaddress import ip_address
from urllib.parse import urlparse
 
Line 2,336 ⟶ 2,916:
hex_ip = {4:'{:08X}', 6:'{:032X}'}[ip.version].format(int(ip))
print("{:39s} {:>32s} IPv{} port={}".format(
str(ip), hex_ip, ip.version, port ))</langsyntaxhighlight>
 
{{out}}
Line 2,351 ⟶ 2,931:
{{libheader|pyparse}}
The following uses [http://pyparsing.wikispaces.com/ pyparse] to parse the IP address. It's an attempt at using pyparse to describe an IP address in an ''extended'' [[wp:Backus–Naur_Form|BNF syntax]]. Using a parser does seems a bit like using a sledgehammer to crack a nut. However it does make for an interesting alternative to using a [[Regular expression|regular expressions]] to parse IP addresses. Note - for example - that the parser specifically reports - as an exception - the location where the IP address is syntactically wrong.
<langsyntaxhighlight lang="python">import string
from pyparsing import * # import antigravity
 
Line 2,474 ⟶ 3,054:
print ip, "IP Version:",ip.version,"- Address is OK!",
except (ParseException,ValueError), details: print "Bad! IP address syntax error detected:",details,
print "- Actually:",desc</langsyntaxhighlight>
Output:
<pre>
Line 2,517 ⟶ 3,097:
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 2,547 ⟶ 3,127:
"2605:2700:0:3::4713:93e3"
"[2605:2700:0:3::4713:93e3]:80"))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,560 ⟶ 3,140:
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>grammar IP_Addr {
token TOP { ^ [ <IPv4> | <IPv6> ] $ }
 
token IPv4 {
[ <d8> +% '.' ] <?{ $<d8> == 4 }> <port>?
Line 2,576 ⟶ 3,156:
| <h16> +% ':' <?{ $<h16> == 8 }>
{ @*by16 = @$<h16> }
 
| [ (<h16>) +% ':']? '::' [ (<h16>) +% ':' ]? <?{ @$0 + @$1 ≤ 8 }>
{ @*by16 = |@$0, |('0' xx 8 - (@$0 + @$1)), |@$1 }
 
| '::ffff:' <IPv4>
{ @*by16 = |('0' xx 5), 'ffff', |(by8to16 @*by8) }
Line 2,586 ⟶ 3,166:
token d8 { (\d+) <?{ $0 < 256 }> }
token d16 { (\d+) <?{ $0 < 65536 }> }
token h16 { (<:hexdigitxdigit>+) <?{ @$0.chars ≤ 4 }> }
 
token port {
Line 2,643 ⟶ 3,223:
}
say '';
}</langsyntaxhighlight>
{{out}}
<pre>127.0.0.1
Line 2,729 ⟶ 3,309:
the &nbsp; '''parse''' &nbsp; instruction for this purpose.
=== version 1 ===
<langsyntaxhighlight lang="rexx">/*REXX program parses an IP address into ──► IPv4 or IPv6 format, optional pport.*/
_= "_"; say center('input IP address' , 30),
center('hex IP address' , 32),
Line 2,766 ⟶ 3,346:
 
say left(a,30) right(hx,32) right(x2d(hx),39) ' IPv' || (6-2*dot) right(port,5)
return</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default input:}}
<pre>
Line 2,780 ⟶ 3,360:
 
=== version 2 ===
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* 27.05.2013 Walter Pachl
**********************************************************************/
Line 2,862 ⟶ 3,442:
End
End
Return o2 'IPv6' port</langsyntaxhighlight>
Output:
<pre style="overflow:scroll">
Line 2,886 ⟶ 3,466:
=={{header|Ruby}}==
 
<langsyntaxhighlight lang="ruby">require 'ipaddr'
 
Line 2,920 ⟶ 3,500:
end
 
output_table(output)</langsyntaxhighlight>
{{Output}}
<pre> String Address Port Family Hex
Line 2,933 ⟶ 3,513:
 
=={{header|Rust}}==
<langsyntaxhighlight Rustlang="rust">use std::{
net::{IpAddr, SocketAddr},
str::FromStr,
Line 3,005 ⟶ 3,585:
.cloned()
.for_each(print_addr);
}</langsyntaxhighlight>
 
=={{header|Scala}}==
===Full blown ultimate solution===
{{Out}}Best seen running in your browser [https://scastie.scala-lang.org/kWO8C5pLSu6xEQ0kHAlswg Scastie (remote JVM)].
<langsyntaxhighlight Scalalang="scala">object IPparser extends App {
 
/*
Line 3,305 ⟶ 3,885:
}
 
} // IPparser cloc.exe : 235 loc</langsyntaxhighlight>
 
=={{header|Tcl}}==
{{tcllib|ip}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
package require ip
 
Line 3,347 ⟶ 3,927:
# Return the descriptor dictionary
return $result
}</langsyntaxhighlight>
Demonstration code:
<langsyntaxhighlight lang="tcl">foreach address {
127.0.0.1
127.0.0.1:80
Line 3,375 ⟶ 3,955:
puts ""
}
}</langsyntaxhighlight>
Output:
<pre>
Line 3,392 ⟶ 3,972:
 
=={{header|VBScript}}==
<langsyntaxhighlight lang="vb">Function parse_ip(addr)
'ipv4 pattern
Set ipv4_pattern = New RegExp
Line 3,478 ⟶ 4,058:
For n = 0 To UBound(ip_arr)
WScript.StdOut.Write parse_ip(ip_arr(n)) & vbCrLf
Next</langsyntaxhighlight>
 
{{Out}}
Line 3,507 ⟶ 4,087:
Test Case: RosettaCode
Address: Invalid Address
</pre>
 
=={{header|V (Vlang)}}==
{{trans|AutoHotkey}}
<syntaxhighlight lang="v (vlang)">const data =
('
127.0.0.1
127.0.0.1:80
::1
[::1]:80
2605:2700:0:3::4713:93e3
[2605:2700:0:3::4713:93e3]:80
')
 
fn main() {
mut output :=''
for val in data.split('\n') {
if val !='' {
xarr := parse_ip(val)
output += 'input = ' + val + '\t>\t' + xarr[0] + if xarr[1] !='' {' port : ' + xarr[1]} else {''} + '\n'
}
}
println(output)
}
 
fn parse_ip(address string) []string {
return if address.contains('.') {ipv4(address)} else {ipv6(address)}
}
 
fn ipv4(address string) []string {
mut num, mut port := '', ''
for val in address.split('.') {
xarr := val.split(':')
num += xarr[0].int().hex2().replace('x','')
if xarr.len > 1 {port = xarr[1]} else {port =''}
}
return [num, port]
}
 
fn ipv6(address string) []string {
mut num, mut port := '', ''
for idx, val in address.split(']') {
if idx == 0 {
for xal in val.trim_left('[:').split(':') {
if xal =='' {num += '00000000'} else {num += '0000'.substr(0, 4 - xal.len) + xal}
}
}
else {port = val.trim_left(':')}
}
return ['00000000000000000000000000000000'.substr(0, 32 - num.len) + num, port]
}</syntaxhighlight>
 
{{out}}
<pre>
input = 127.0.0.1 > 07f000001
input = 127.0.0.1:80 > 07f000001 port : 80
input = ::1 > 00000000000000000000000000000001
input = [::1]:80 > 00000000000000000000000000000001 port : 80
input = 2605:2700:0:3::4713:93e3 > 260527000000000300000000471393e3
input = [2605:2700:0:3::4713:93e3]:80 > 260527000000000300000000471393e3 port : 80
</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-dynamic}}
{{libheader|wren-big}}
{{libheader|Wren-str}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./dynamic" for Enum, Tuple
import "./big" for BigInt
import "./str" for Str
import "./fmt" for Conv, Fmt
 
var AddressSpace = Enum.create("AddressSpace", ["IPv4", "IPv6", "Invalid"])
 
// a port of -1 denotes 'not specified'
var IPAddressComponents = Tuple.create("IPAddressComponents", ["address", "addressSpace", "port"])
 
var INVALID = IPAddressComponents.new(BigInt.zero, AddressSpace.Invalid, 0)
 
var ipAddressParse = Fn.new { |ipAddress|
var addressSpace = AddressSpace.IPv4
var ipa = Str.lower(ipAddress)
var port = -1
var trans = false
 
if (ipa.startsWith("::ffff:") && ipa.contains(".")) {
addressSpace = AddressSpace.IPv6
trans = true
ipa = ipa[7..-1]
} else if (ipa.startsWith("[::ffff:") && ipa.contains(".")) {
addressSpace = AddressSpace.IPv6
trans = true
ipa = ipa[8..-1].replace("]", "")
}
var octets = ipa.split(".")[-1..0].toList
var address = BigInt.zero
if (octets.count == 4) {
var split = octets[0].split(":")
if (split.count == 2) {
var temp = Num.fromString(split[1])
if (!temp || temp < 0 || temp > 65535) return INVALID
port = temp
octets[0] = split[0]
}
for (i in 0..3) {
var num = Num.fromString(octets[i])
if (!num || num < 0 || num > 255) return INVALID
var bigNum = BigInt.new(num)
address = address | (bigNum << (i * 8))
}
if (trans) address = address + BigInt.fromBaseString("ffff00000000", 16)
} else if (octets.count == 1) {
addressSpace = AddressSpace.IPv6
if (ipa[0] == "[") {
ipa = ipa[1..-1]
var split = ipa.split("]:")
if (split.count != 2) return INVALID
var temp = Num.fromString(split[1])
if (!temp || temp < 0 || temp > 65535) return INVALID
port = temp
ipa = ipa[0...(-2 - split[1].count)]
}
var hextets = ipa.split(":")[-1..0].toList
var len = hextets.count
 
if (ipa.startsWith("::")) {
hextets[-1] = "0"
} else if (ipa.endsWith("::")) {
hextets[0] = "0"
}
if (ipa == "::") hextets[1] = "0"
if (len > 8 || (len == 8 && hextets.any { |h| h == "" }) || hextets.count { |h| h == "" } > 1) {
return INVALID
}
if (len < 8) {
var insertions = 8 - len
for (i in 0..7) {
if (hextets[i] == "") {
hextets[i] = "0"
while (insertions > 0) {
insertions = insertions - 1
hextets.insert(i, "0")
}
break
}
}
}
for (j in 0..7) {
var num = Conv.atoi(hextets[j], 16)
if (num > 0xFFFF) return INVALID
var bigNum = BigInt.new(num)
address = address | (bigNum << (j * 16))
}
} else return INVALID
 
return IPAddressComponents.new(address, addressSpace, port)
}
 
var ipas = [
"127.0.0.1",
"127.0.0.1:80",
"::1",
"[::1]:80",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80",
"::ffff:192.168.173.22",
"[::ffff:192.168.173.22]:80",
"1::",
"::",
"256.0.0.0",
"::ffff:127.0.0.0.1"
]
for (ipa in ipas) {
var ipac = ipAddressParse.call(ipa)
Fmt.print("IP address : $s", ipa)
Fmt.print("Address : $s", Str.upper(ipac.address.toBaseString(16)))
Fmt.print("Address Space : $s", AddressSpace.members[ipac.addressSpace])
Fmt.print("Port : $s", (ipac.port == -1) ? "not specified" : ipac.port.toString)
System.print()
}</syntaxhighlight>
 
{{out}}
<pre>
IP address : 127.0.0.1
Address : 7F000001
Address Space : IPv4
Port : not specified
 
IP address : 127.0.0.1:80
Address : 7F000001
Address Space : IPv4
Port : 80
 
IP address : ::1
Address : 1
Address Space : IPv6
Port : not specified
 
IP address : [::1]:80
Address : 1
Address Space : IPv6
Port : 80
 
IP address : 2605:2700:0:3::4713:93e3
Address : 260527000000000300000000471393E3
Address Space : IPv6
Port : not specified
 
IP address : [2605:2700:0:3::4713:93e3]:80
Address : 260527000000000300000000471393E3
Address Space : IPv6
Port : 80
 
IP address : ::ffff:192.168.173.22
Address : FFFFC0A8AD16
Address Space : IPv6
Port : not specified
 
IP address : [::ffff:192.168.173.22]:80
Address : FFFFC0A8AD16
Address Space : IPv6
Port : 80
 
IP address : 1::
Address : 10000000000000000000000000000
Address Space : IPv6
Port : not specified
 
IP address : ::
Address : 0
Address Space : IPv6
Port : not specified
 
IP address : 256.0.0.0
Address : 0
Address Space : Invalid
Port : 0
 
IP address : ::ffff:127.0.0.0.1
Address : 0
Address Space : Invalid
Port : 0
</pre>
2,455

edits