blob: 7b5a345e025a188461cb9b325bb0c6bace2b53f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
use "die.use"
use "intparse.use"
use "option.use"
use "strfind.use"
use "types.use"
use "chartype.use"
/* FIXME: needed for decls which should be pulled in as hidden */
use "hasprefix.use"
use "utf.use"
pkg std =
type netaddr = union
`Ipv4 byte[4]
`Ipv6 byte[16]
;;
const ipparse : (ip : byte[:] -> option(netaddr))
const ip4parse : (ip : byte[:] -> option(netaddr))
const ip6parse : (ip : byte[:] -> option(netaddr))
;;
const ipparse = {ip
match strfind(ip, ":")
| `Some _: -> ip6parse(ip)
| `None: -> ip4parse(ip)
;;
}
const ip4parse = {ip
var addr
var last : size
var x : option(int32)
var val : int32 /* need int32 to check for overflow */
var i
var j : size
i = 0
last = 0
for j = 0; j < ip.len; j++
if ip[j] == '.' castto(byte)
match intparsebase(ip[last:j], 10)
| `Some v:
val = v
if val < 0 || val > 255
-> `None
;;
addr[i++] = val castto(byte)
last = j + 1
| `None:
-> `None
;;
;;
;;
match intparsebase(ip[last:j], 10)
| `Some v:
val = v
if val < 0 || val > 255
-> `None
;;
addr[i] = val castto(byte)
| `None:
-> `None
;;
if j != ip.len
-> `None
;;
-> `Some (`Ipv4 addr)
}
const ip6parse = {ip
-> `None
}
|