module Subnets
Public Class Methods
include?(p1, p2)
click to toggle source
Test if any element in nets
includes v
. For array elements obj
that are not Net4
or Net6
, calls +obj#===(v)+ to test for inclusion.
@see Subnets::IP4#include? @see Subnets::IP6#include? @param [Array<Net,Object>] nets @param [String, IP
, Net] v
VALUE method_subnets_include_p(VALUE self, VALUE nets, VALUE v) { int is_net4 = 0, is_net6 = 0, is_ip4 = 0, is_ip6 = 0; net4_t net4; net6_t net6; ip4_t ip4; ip6_t ip6; if (CLASS_OF(v) == IP4) { ip4_t *_ip4; is_ip4 = !0; Data_Get_Struct(v, ip4_t, _ip4); ip4 = *_ip4; } else if (CLASS_OF(v) == IP6) { ip6_t *_ip6; is_ip6 = !0; Data_Get_Struct(v, ip6_t, _ip6); ip6 = *_ip6; } else if (CLASS_OF(v) == Net4) { net4_t *_net4; is_net4 = !0; Data_Get_Struct(v, net4_t, _net4); net4 = *_net4; } else if (CLASS_OF(v) == Net6) { net6_t *_net6; is_net6 = !0; Data_Get_Struct(v, net6_t, _net6); net6 = *_net6; } else { const char *buf = StringValueCStr(v); if (read_net4_strict(buf, &net4)) is_net4 = !0; else if (read_net6_strict(buf, &net6)) is_net6 = !0; else if (read_ip4_strict(buf, &ip4)) is_ip4 = !0; else if (read_ip6_strict(buf, &ip6)) is_ip6 = !0; } for (ssize_t i = 0; i < RARRAY_LEN(nets); i++) { VALUE rbnet = RARRAY_AREF(nets, i); if (CLASS_OF(rbnet) == Net4) { if (is_net4) { net4_t *net; Data_Get_Struct(rbnet, net4_t, net); if (net4_include_net4_p(*net, net4)) { return Qtrue; } } else if (is_ip4) { net4_t *net; Data_Get_Struct(rbnet, net4_t, net); if (net4_include_p(*net, ip4)) { return Qtrue; } } } else if (CLASS_OF(rbnet) == Net6) { if (is_net6) { net6_t *net; Data_Get_Struct(rbnet, net6_t, net); if (net6_include_net6_p(*net, net6)) { return Qtrue; } } else if (is_ip6) { net6_t *net; Data_Get_Struct(rbnet, net6_t, net); if (net6_include_p(*net, ip6)) { return Qtrue; } } } else { VALUE ret = rb_funcall(rbnet, rb_intern("==="), 1, v); if (RTEST(ret)) return Qtrue; } } return Qfalse; }
parse(p1)
click to toggle source
Try parsing str
as Net4
, Net6
, IP4
, IP6
.
@return [Net4, Net6
, IP4
, IP6] @raise {ParseError}
VALUE method_subnets_parse(VALUE mod, VALUE str) { const char *s; str = StringValue(str); s = StringValueCStr(str); { net4_t net; if (read_net4_strict(s, &net)) return net4_new(Net4, net); } { net6_t net; if (read_net6_strict(s, &net)) return net6_new(Net6, net); } { ip4_t ip; if (read_ip4_strict(s, &ip)) return ip4_new(IP4, ip); } { ip6_t ip; if (read_ip6_strict(s, &ip)) return ip6_new(IP6, ip); } raise_parse_error("{v4,v6}{net,ip}", s); return Qnil; }