199 lines
2.3 KiB
Perl
199 lines
2.3 KiB
Perl
#!/usr/local/bin/perl
|
|
|
|
sub lab_shift
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@r,$i,$j,$k,$d,@z);
|
|
|
|
@r=&shift(*a,$n);
|
|
foreach $i (0 .. 31)
|
|
{
|
|
@z=split(/\^/,$r[$i]);
|
|
for ($j=0; $j <= $#z; $j++)
|
|
{
|
|
($d)=($z[$j] =~ /^(..)/);
|
|
($k)=($z[$j] =~ /\[(.*)\]$/);
|
|
$k.=",$n" if ($k ne "");
|
|
$k="$n" if ($k eq "");
|
|
$d="$d[$k]";
|
|
$z[$j]=$d;
|
|
}
|
|
$r[$i]=join('^',@z);
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub shift
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@f);
|
|
|
|
if ($n > 0)
|
|
{
|
|
@f=&shiftl(*a,$n);
|
|
}
|
|
else
|
|
{
|
|
@f=&shiftr(*a,-$n);
|
|
}
|
|
return(@f);
|
|
}
|
|
|
|
sub rotate
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@f);
|
|
|
|
if ($n > 0)
|
|
{ @f=&rotatel(*a,$n); }
|
|
else
|
|
{ @f=&rotater(*a,-$n); }
|
|
return(@f);
|
|
}
|
|
|
|
sub rotater
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@f,@g);
|
|
|
|
@f=&shiftr(*a,$n);
|
|
@g=&shiftl(*a,32-$n);
|
|
$#f=31;
|
|
$#g=31;
|
|
return(&or(*f,*g));
|
|
}
|
|
|
|
sub rotatel
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@f,@g);
|
|
|
|
@f=&shiftl(*a,$n);
|
|
@g=&shiftr(*a,32-$n);
|
|
$#f=31;
|
|
$#g=31;
|
|
return(&or(*f,*g));
|
|
}
|
|
|
|
sub shiftr
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@r,$i);
|
|
|
|
$#r=31;
|
|
foreach $i (0 .. 31)
|
|
{
|
|
if (($i+$n) > 31)
|
|
{
|
|
$r[$i]="--";
|
|
}
|
|
else
|
|
{
|
|
$r[$i]=$a[$i+$n];
|
|
}
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub shiftl
|
|
{
|
|
local(*a,$n)=@_;
|
|
local(@r,$i);
|
|
|
|
$#r=31;
|
|
foreach $i (0 .. 31)
|
|
{
|
|
if ($i < $n)
|
|
{
|
|
$r[$i]="--";
|
|
}
|
|
else
|
|
{
|
|
$r[$i]=$a[$i-$n];
|
|
}
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub printit
|
|
{
|
|
local(@a)=@_;
|
|
local($i);
|
|
|
|
foreach $i (0 .. 31)
|
|
{
|
|
printf "%2s ",$a[$i];
|
|
print "\n" if (($i%8) == 7);
|
|
}
|
|
print "\n";
|
|
}
|
|
|
|
sub xor
|
|
{
|
|
local(*a,*b)=@_;
|
|
local(@r,$i);
|
|
|
|
$#r=31;
|
|
foreach $i (0 .. 31)
|
|
{
|
|
$r[$i]=&compress($a[$i].'^'.$b[$i]);
|
|
# $r[$i]=$a[$i]."^".$b[$i];
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub and
|
|
{
|
|
local(*a,$m)=@_;
|
|
local(@r,$i);
|
|
|
|
$#r=31;
|
|
foreach $i (0 .. 31)
|
|
{
|
|
$r[$i]=(($m & (1<<$i))?($a[$i]):('--'));
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub or
|
|
{
|
|
local(*a,*b)=@_;
|
|
local(@r,$i);
|
|
|
|
$#r=31;
|
|
foreach $i (0 .. 31)
|
|
{
|
|
$r[$i]='--' if (($a[$i] eq '--') && ($b[$i] eq '--'));
|
|
$r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--'));
|
|
$r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--'));
|
|
$r[$i]='++' if (($a[$i] ne '--') && ($b[$i] ne '--'));
|
|
}
|
|
return(@r);
|
|
}
|
|
|
|
sub compress
|
|
{
|
|
local($s)=@_;
|
|
local($_,$i,@a,%a,$r);
|
|
|
|
$s =~ s/\^\^/\^/g;
|
|
$s =~ s/^\^//;
|
|
$s =~ s/\^$//;
|
|
@a=split(/\^/,$s);
|
|
|
|
while ($#a >= 0)
|
|
{
|
|
$_=shift(@a);
|
|
next unless /\d/;
|
|
$a{$_}++;
|
|
}
|
|
foreach $i (sort keys %a)
|
|
{
|
|
next if ($a{$i}%2 == 0);
|
|
$r.="$i^";
|
|
}
|
|
chop($r);
|
|
return($r);
|
|
}
|
|
1;
|