anchor.diff:  ]).
   
   %% @type ip24() = list() | binary() | {int(), int(), int()}
  -
  -%% @spec parse_file(string() | atom()) -> {binary(), binary(), tuple()}
  +%% @type ip32() = list() | binary() | {int(), int(), int(), int()}
  +%% @type ip() = ip24() | ip32() | invalid_ip
  +%% @type acldb() = {binary(), binary(), tuple()}
  +
  +%% @spec parse_file(string() | atom()) -> acldb()
   %% @doc Parses an ACL file and converts it to an IP -> Zone index.
   %%
   %%  IPs DATABASE FORMAT
  
positive.code: split_ips(<<"\n", Rest/binary>>, Acc) ->
      split_ips(Rest, Acc);
  split_ips(<<IP:5/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:6/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:7/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:8/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:9/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:10/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]);
  split_ips(<<IP:11/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip(IP) | Acc]).
  
  parse_ip(IP) ->
      [A, B, C] = lists:map(
              fun list_to_integer/1,
              string:tokens(binary_to_list(IP), ".")
  
negative.code: -ifdef(TEST).
  
  ip_parse_test() ->
      [IP = parse_ip24(BinIP) || {IP, BinIP} <- test_ips()],
      ok.
  
  test_ips() ->
  