App-zipdetails
view release on metacpan or search on metacpan
bin/zipdetails view on Meta::CPAN
sub clearStack
{
@nestingStack = ();
%encapsulations = ();
%inner2outer = ();
%index2entry = ();
%offset2entry = ();
$encapsulationCount = 0;
}
sub dump
{
my $indent = shift // 0;
for my $offset (sort {$a <=> $b} keys %offset2entry)
{
my $leading = " " x $indent ;
say $leading . "\nOffset $offset" ;
say Dumper($offset2entry{$offset})
}
}
sub add
{
my $entry = shift;
getEnclosingEntry($entry);
push @nestingStack, $entry;
$index2entry{ $entry->index } = $entry;
$offset2entry{ $entry->offsetStart } = $entry;
}
sub getEnclosingEntry
{
my $entry = shift;
my $filename = $entry->filename;
pop @nestingStack
while @nestingStack && $entry->offsetStart > $nestingStack[-1]->offsetEnd ;
my $match = undef;
if (@nestingStack &&
$entry->offsetStart >= $nestingStack[-1]->offsetStart &&
$entry->offsetEnd <= $nestingStack[-1]->offsetEnd &&
$entry->index != $nestingStack[-1]->index)
{
# Nested entry found
$match = $nestingStack[-1];
push @{ $encapsulations{ $match->index } }, $entry;
$inner2outer{ $entry->index} = $match->index;
++ $encapsulationCount;
$entry->encapsulated(1) ;
$match->increment_childrenCount();
if ($NESTING_DEBUG)
{
say "#### nesting " . (caller(1))[3] . " index #" . $entry->index . ' "' .
$entry->outputFilename . '" [' . $entry->offsetStart . "->" . $entry->offsetEnd . "]" .
" in #" . $match->index . ' "' .
$match->outputFilename . '" [' . $match->offsetStart . "->" . $match->offsetEnd . "]" ;
}
}
return $match;
}
sub isNested
{
my $offsetStart = shift;
my $offsetEnd = shift;
if ($NESTING_DEBUG)
{
say "### Want: offsetStart " . ::decimalHex0x($offsetStart) . " offsetEnd " . ::decimalHex0x($offsetEnd);
for my $entry (@nestingStack)
{
say "### Have: offsetStart " . ::decimalHex0x($entry->offsetStart) . " offsetEnd " . ::decimalHex0x($entry->offsetEnd);
}
}
return 0
unless @nestingStack ;
my @copy = @nestingStack ;
pop @copy
while @copy && $offsetStart > $copy[-1]->offsetEnd ;
return @copy &&
$offsetStart >= $copy[-1]->offsetStart &&
$offsetEnd <= $copy[-1]->offsetEnd ;
}
sub getOuterEncapsulation
{
my $entry = shift;
my $outerIndex = $inner2outer{ $entry->index } ;
return undef
if ! defined $outerIndex ;
return $index2entry{$outerIndex} // undef;
}
sub getEncapsulations
{
my $entry = shift;
return $encapsulations{ $entry->index } ;
}
sub getFirstEncapsulation
{
my $entry = shift;
my $got = $encapsulations{ $entry->index } ;
( run in 3.022 seconds using v1.01-cache-2.11-cpan-bbc515a03b3 )