ref: a2ef6bfcd8de0ae9f7f2df2fcdd692bde6ea422c
dir: /lib/std/test/ipparse.myr/
use std const main = { /* valid ipv4 address */ eq("1.2.3.4", `std.Some `std.Ipv4 [1,2,3,4]) /* invalid ipv4 address */ eq("1.3.4", `std.None) /* too short */ eq("1.2.3.4.5", `std.None) /* too long */ eq("1.3.4.256", `std.None) /* out of bounds 1 */ eq("260.2.3.4", `std.None) /* out of bounds 2 */ /* valid ipv6 addresses */ eq("2a03:2880:2110:df07:face:b00c:0:1", \ `std.Some `std.Ipv6 [ \ 0x2a, 0x03, 0x28, 0x80, \ 0x21, 0x10, 0xdf, 0x07, \ 0xfa, 0xce, 0xb0, 0x0c, \ 0x00, 0x00, 0x00, 0x01]) eq("2a03:2880:2110::face:b00c:0:1", \ `std.Some `std.Ipv6 [ \ 0x2a, 0x03, 0x28, 0x80, \ 0x21, 0x10, 0x00, 0x00, \ 0xfa, 0xce, 0xb0, 0x0c, \ 0x00, 0x00, 0x00, 0x01]) eq("2a03:2880:10::face:b00c:0:1", \ `std.Some `std.Ipv6 [ \ 0x2a, 0x03, 0x28, 0x80, \ 0x00, 0x10, 0x00, 0x00, \ 0xfa, 0xce, 0xb0, 0x0c, \ 0x00, 0x00, 0x00, 0x01]) eq("2a03:2880:11:1f1b:face:b00c:0:25de", \ `std.Some `std.Ipv6 [ \ 0x2a, 0x03, 0x28, 0x80, \ 0x00, 0x11, 0x1f, 0x1b, \ 0xfa, 0xce, 0xb0, 0x0c, \ 0x00, 0x00, 0x25, 0xde]) eq("abcd::dcba", \ `std.Some `std.Ipv6 [ \ 0xab, 0xcd, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0xdc, 0xba]) eq("::abcd:dcba", \ `std.Some `std.Ipv6 [ \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0xab, 0xcd, 0xdc, 0xba]) eq("::", `std.Some `std.Ipv6 [ \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00]) eq("2001:b88:1202::10", \ `std.Some `std.Ipv6 [ \ 0x20, 0x01, 0x0b, 0x88, \ 0x12, 0x02, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x10]) /* invalid ipv4 addresses */ eq("2a03:2880:2110:df07:face:b00c:0:1:abc", `std.None) /* too long */ eq("2a03:2880:2110:df07:face:b00c:0", `std.None) /* too short */ eq("2a03:2880:2110:df07:face:b00c:0:1:", `std.None) /* trailing ':' */ } const eq = {ip, expected var pdst : byte[16] var edst : byte[16] var parsed var p, e parsed = std.ipparse(ip) p = ipbytes(pdst[:], parsed) e = ipbytes(edst[:], expected) if !std.eq(p, e) std.fput(1, "misparsed ip {}\n", ip) std.put("parsed: ") for b : p std.put("{x}, ", b) ;; std.put("\nexpected: ") for b : e std.put("{x}, ", b) ;; std.put("\n") std.fatal("failed\n") ;; } const ipbytes = {dst, ipopt match ipopt | `std.None: -> [][:] | `std.Some ip: match ip | `std.Ipv4 b: std.slcp(dst[:4], b[:]) -> dst[:4] | `std.Ipv6 b: std.slcp(dst[:16], b[:]) -> dst[:16] ;; ;; -> [][:] }