alias longipv6 {
bset -t & 1 $1
set -l %start 1
set -l %end
set -l %hextets
while ($bfind(&,%start,:).textcs) {
%end = $v1 - 1
if (%end > %start) %hextets = %hextets $base($bvar(&,%start - %end).text,16,10)
else %hextets = %hextets SHORTENED
%start = %end + 2
}
tokenize 32 $replacex(%hextets $base($bvar(&,%start -).text,16,10),SHORTENED,$str(0 $+ $chr(32),$calc(8 - $numtok(%hextets,32))))
set -l %decimal $add_($multiply_(5192296858534827628530496329220096,$1),$multiply_(79228162514264337593543950336,$2))
%decimal = $add_(%decimal,$multiply_(1208925819614629174706176,$3))
%decimal = $add_(%decimal,$multiply_(18446744073709551616,$4))
%decimal = $add_(%decimal,$multiply_(281474976710656,$5))
%decimal = $add_(%decimal,$multiply_(4294967296,$6))
%decimal = $add_(%decimal,$multiply_(65536,$7))
$iif($isid,return,echo -a) $add_(%decimal,$8)
}
alias add_ {
if ($len($2) > $len($1)) tokenize 32 $2 $1
set -l %result
set -l %carryover
set -l %temp
while ($right($1,15) isnum) {
%temp = $base($calc($v1 + $right($2,15) + %carryover),10,10,$len($v1))
%carryover = $mid(%temp,1-,-15)
%result = $right(%temp,15) $+ %result
tokenize 32 $mid($1,1-,-15) $mid($2,1-,-15)
}
return %result
}
alias multiply_ {
if ($len($2) > $len($1)) tokenize 32 $2 $1
set -l %temp
set -l %result
set -l %multiplicand $1
set -l %multiplier
set -l %remaining
set -l %interval
set -l %padding
set -l %carryover
tokenize 1 $2
while ($1 isnum) {
%multiplier = $right($1,7)
%remaining = $mid($1,1-,-7)
%carryover = 0
if (%multiplier > 0) {
tokenize 1 %multiplicand
while ($right($1,7) isnum) {
%temp = $base($calc($v1 * %multiplier + %carryover),10,10,$len($v1))
%carryover = $mid(%temp,1-,-7)
%interval = $right(%temp,7) $+ %interval
tokenize 1 $mid($1,1-,-7)
}
if (%carryover) %interval = %carryover $+ %interval
%result = $add_(%result,%interval $+ %padding)
}
%padding = %padding $+ $str(0,$len(%multiplier))
tokenize 1 %remaining
}
return %result
}