Software /
code /
prosody
Comparison
util/ip.lua @ 8431:a5a03d40a20c
util.ip: Make bit string function into a method
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 01 Dec 2017 04:37:33 +0100 |
parent | 8430:a58d560aa8d5 |
child | 8432:da807f4f706c |
comparison
equal
deleted
inserted
replaced
8430:a58d560aa8d5 | 8431:a5a03d40a20c |
---|---|
49 end | 49 end |
50 | 50 |
51 return setmetatable({ addr = ipStr, packed = packed, proto = proto, zone = zone }, ip_mt); | 51 return setmetatable({ addr = ipStr, packed = packed, proto = proto, zone = zone }, ip_mt); |
52 end | 52 end |
53 | 53 |
54 local function toBits(ip) | 54 function ip_methods.bits(ip) |
55 local result = ""; | |
56 local fields = {}; | |
57 if ip.proto == "IPv4" then | |
58 ip = ip.toV4mapped; | |
59 end | |
60 ip = (ip.addr):upper(); | 55 ip = (ip.addr):upper(); |
61 ip:gsub("([^:]*):?", function (c) fields[#fields + 1] = c end); | 56 ip:gsub("([^:]*):?", function (c) fields[#fields + 1] = c end); |
62 if not ip:match(":$") then fields[#fields] = nil; end | 57 if not ip:match(":$") then fields[#fields] = nil; end |
63 for i, field in ipairs(fields) do | 58 for i, field in ipairs(fields) do |
64 if field:len() == 0 and i ~= 1 and i ~= #fields then | 59 if field:len() == 0 and i ~= 1 and i ~= #fields then |
75 end | 70 end |
76 end | 71 end |
77 return result; | 72 return result; |
78 end | 73 end |
79 | 74 |
75 function ip_methods.bits_full(ip) | |
76 if ip.proto == "IPv4" then | |
77 ip = ip.toV4mapped; | |
78 end | |
79 return ip.bits; | |
80 end | |
81 | |
80 local function commonPrefixLength(ipA, ipB) | 82 local function commonPrefixLength(ipA, ipB) |
81 ipA, ipB = toBits(ipA), toBits(ipB); | 83 ipA, ipB = ipA.bits_full, ipB.bits_full; |
82 for i = 1, 128 do | 84 for i = 1, 128 do |
83 if ipA:sub(i,i) ~= ipB:sub(i,i) then | 85 if ipA:sub(i,i) ~= ipB:sub(i,i) then |
84 return i-1; | 86 return i-1; |
85 end | 87 end |
86 end | 88 end |