Parse an IP Address: Difference between revisions

no edit summary
m (→‎{{header|Raku}}: use 'xdigit', better documented)
No edit summary
Line 3,683:
Test Case: RosettaCode
Address: Invalid Address
</pre>
 
=={{header|Vlang}}==
{{trans|AutoHotkey}}
<lang 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]
}</lang>
 
{{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>
 
291

edits