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/, )
}
}