$longip() for ipv6 addresses - 20/09/10 11:58 AM
As stated in the subject: $longip() for ipv6 addresses
alias longipv6 { if ($1-. isnum) { if ($1 >= 0) { var %num = $1, %i = 8, %out = : while (%i) { bunset " bset " 50 0 while ($left(%num, 15) > 65535) { var %div = $int($calc($v1 / 65536)), %rem = $v1 % 65536 bset -t " $calc(51 - $mid(%num, 16, 0) - $len(%div)) %div %num = %rem $+ $mid(%num, 16) } %out = $+(:, $base(0 $+ $v1, 10, 16), %out) !breplace " 0 48 %num = $regsubex($bvar(", 1-).text, /^0*/, ) dec %i } return $lower($regsubex(%out, /.$|((?:(:)0)++)(:$|(?(?!\1).)+(?=.$))|(((^)))./g, \2\3)) } } elseif ($regex($1-, /^(?(?=.*::)(?!(?>.*?:(?=:)){2})(::|(?>(?<=^|::)|:)[a-f\d]{1,4}+){1,8}+|(?1){8})$/)) { var %n = $replace($1, ::, $str(:0:, $calc(8 - $numtok($1, 58)))), %i = 8, %out, $& %3 = 281474976710656, $& %4 = 18446744073709551616, $& %5 = 1208925819614629174706176, $& %6 = 79228162514264337593543950336, $& %7 = 5192296858534827628530496329220096 while (%i) { var %num = $base($gettok(%n, %i, 58), 16, 10), %pow = 8 - %i if (%pow < 3) { inc %out $calc(%num * 65536 ^ %pow) } elseif (%num) { var %pow = $eval(% $+ %pow, 2), %carry, %result while ($right(%pow, 10)) { var %mul = $v1 * %num, %result = $base($calc($right(%mul, 10) + %carry), 10, 10, 10) $& $+ %result, %carry = $left(%mul, -10), %pow = $left(%pow, -10) } var %result = %carry $+ %result, %carry, %num while (%out $+ %result) { var %add = $calc($right(%result, 15) + $right(%out, 15)), $& %num = $base($calc($right(%add, 15) + %carry), 10, 10, 15) $+ %num, $& %carry = $left(%add, -15), %out = $left(%out, -15), %result = $left(%result, -15) } %out = %carry $+ %num } dec %i } return $regsubex(%out, /^0*+\B/, ) } }
alias longipv6 { if ($1-. isnum) { if ($1 >= 0) { var %num = $1, %i = 8, %out while (%i) { bunset " bset " 50 0 while ($left(%num, 15) > 65535) { var %div = $int($calc($v1 / 65536)), %rem = $v1 % 65536 bset -t " $calc(51 - $mid(%num, 16, 0) - $len(%div)) %div %num = %rem $+ $mid(%num, 16) } %out = $instok(%out, $base(0 $+ $v1, 10, 16), 1, 58) !breplace " 0 48 %num = $regsubex($bvar(", 1-).text, /^0*/, ) dec %i } return $lower($iptype(%out).compress) } } elseif ($iptype($1-) == ipv6) { var %n = $iptype($1).expand, %i = 8, %out, $& %3 = 281474976710656, $& %4 = 18446744073709551616, $& %5 = 1208925819614629174706176, $& %6 = 79228162514264337593543950336, $& %7 = 5192296858534827628530496329220096 while (%i) { var %num = $base($gettok(%n, %i, 58), 16, 10), %pow = 8 - %i if (%pow < 3) { inc %out $calc(%num * 65536 ^ %pow) } elseif (%num) { var %pow = $eval(% $+ %pow, 2), %carry, %result while ($right(%pow, 10)) { var %mul = $v1 * %num, %result = $base($calc($right(%mul, 10) + %carry), 10, 10, 10) $& $+ %result, %carry = $left(%mul, -10), %pow = $left(%pow, -10) } var %result = %carry $+ %result, %carry, %num while (%out $+ %result) { var %add = $calc($right(%result, 15) + $right(%out, 15)), $& %num = $base($calc($right(%add, 15) + %carry), 10, 10, 15) $+ %num, $& %carry = $left(%add, -15), %out = $left(%out, -15), %result = $left(%result, -15) } %out = %carry $+ %num } dec %i } return $regsubex(%out, /^0*+\B/, ) } }