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;
}