Lines Matching full:my

10 my $NESTING_DEBUG = 0 ;
32 my $VERSION = '4.004' ;
101 my %ZIP_CompressionMethods =
134 my %OS_Lookup = (
161 my %Lookup = (
187 my $signature = shift ;
197 my $signature = shift ;
207 my $signature = shift ;
214 my $signature = shift ;
220 my $signature = shift ;
226 my $signature = shift ;
232 my $signature = shift ;
239 my $signature = shift ;
248 # my $signature = shift ;
254 my %sigs =
265 my %Extras = (
346 my $id = shift ;
348 my $name = $Extras{$id}[0] // "Unknown";
354 my %HashIDLookup = (
367 my %AlgIdLookup = (
383 my %FlagsLookup = (
392 my %HashAlgLookup = (
396 my $FH;
398 my $ZIP64 = 0 ;
399 my $NIBBLES = 8;
401 my $LocalHeaderCount = 0;
402 my $CentralHeaderCount = 0;
403 my $InfoCount = 0;
404 my $WarningCount = 0;
405 my $ErrorCount = 0;
406 my $lastWasMessage = 0;
408 my $fatalDisabled = 0;
410 my $OFFSET = 0 ;
413 my $POSSIBLE_PREFIX_DELTA = 0;
414 my $PREFIX_DELTA = 0;
416 my $TRAILING = 0 ;
417 my $PAYLOADLIMIT = 256;
418 my $ZERO = 0 ;
419 my $APK = 0 ;
420 my $START_APK = 0;
421 my $APK_LEN = 0;
423 my $CentralDirectory = CentralDirectory->new();
424 my $LocalDirectory = LocalDirectory->new();
425 my $HeaderOffsetIndex = HeaderOffsetIndex->new();
426 my $EOCD_Present = 0;
430 my $offset = shift;
431 my $s = offset($OFFSET);
438 my $v = shift ;
444 my ($OFF, $ENDS_AT, $LENGTH, $CONTENT, $TEXT, $VALUE) ;
446 my $FMT1 = 'STDOUT1';
447 my $FMT2 = 'STDOUT2';
451 my $wantVerbose = shift ;
452 my $nibbles = shift;
454 my $width = '@' . ('>' x ($nibbles -1));
455 my $space = " " x length($width);
458 # my $rightColumn = "^*" ;
459 my $rightColumn = "^" . ("<" x 132);
465 my $fmt ;
515 my $format = shift ;
524 my $input = shift;
570 my $size = shift;
571 my $text = shift;
572 my $limit = shift ;
584 myRead(my $payload, $size);
611 my $data = shift;
612 my $text = shift;
613 my $format = shift;
615 my $size = length($data) ;
633 my $size = shift;
634 my $text = shift;
635 my $format = shift;
653 my $text = shift;
654 my $format = shift;
670 my $data = shift ;
671 my $text = shift ;
672 my $format = shift;
674 my $size = length($data) ;
691 my $letter = shift;
707 my $name = shift ;
708 my $unpack = shift ;
709 my $size = shift ;
710 my $cb1 = shift ;
711 my $cb2 = shift ;
714 myRead(my $buff, $size);
715 my (@value) = unpack $unpack, $buff;
716 my $hex = Value($unpack, @value);
719 my $v ;
742 my $name = shift ;
743 my $cb1 = shift ;
744 my $cb2 = shift ;
751 my $name = shift ;
752 my $cb1 = shift ;
753 my $cb2 = shift ;
760 my $name = shift ;
761 my $cb1 = shift ;
762 my $cb2 = shift ;
769 my $name = shift ;
770 my $cb1 = shift ;
771 my $cb2 = shift ;
778 my $size = shift;
779 my $message = shift;
780 my $redact = shift ;
786 my $before = $FH->tell();
789 myRead(my $buffer, $size );
799 my $size = shift;
800 my $message = shift;
801 my $redact = shift ;
843 my $v = unpack ("Q<", $_[0]);
854 my $b ;
861 my $b ;
868 my $b ;
876 my $b ;
883 my $offset = shift ;
884 my $loc = shift ;
895 my $offset = shift ;
904 my $start = $FH->tell();
906 my $got = scanForSignature(1);
908 my $delta = $FH->tell() - $start ;
921 my $walk = shift // 0;
929 my %sigs = Signatures::getSigsForScan();
931 my $start = $FH->tell();
936 my $last = '';
937 my $offset = 0;
938 my $buffer ;
943 my $combine = $last . $buffer ;
945 my $ix = 0;
956 my $rest = substr($combine, $ix + 2, 2);
965 my $here = $FH->tell();
968 my $name = Signatures::name($sigs{$rest});
985 my $is64In32 = 0;
987 my $opt_verbose = 0;
988 my $opt_scan = 0;
989 my $opt_walk = 0;
990 my $opt_Redact = 0;
991 my $opt_utc = 0;
992 my $opt_want_info_mesages = 1;
993 my $opt_want_warning_mesages = 1;
994 my $opt_want_error_mesages = 1;
995 my $opt_want_message_exit_status = 0;
996 my $exit_status_code = 0;
997 my $opt_help =0;
1021 my ($opt_name, $opt_value) = @_;
1038 my $filename = shift @ARGV;
1056 my $FILELEN = -s $filename ;
1068 my @Messages = ();
1074 my $foundZipRecords = 0;
1075 my $foundCentralHeader = 0;
1076 my $lastEndsAt = 0;
1077 my $lastSignature = 0;
1078 my $lastHeader = {};
1082 my $output_encryptedCD = 0;
1085 while(my $s = scanForSignature($opt_walk))
1087 my $here = $FH->tell();
1088 my $delta = $here - $lastEndsAt ;
1118 my $hdrSize = checkForBadlyFormedDataDescriptor($lastHeader, $delta) ;
1181 my ($buffer, $signature) = read_V();
1185 my $handler = Signatures::decoder($signature);
1208 my $s = scanForSignature();
1230 my $expectedOffset = 0;
1231 my $expectedSignature = 0;
1232 my $expectedBuffer = 0;
1233 my $foundCentralHeader = 0;
1234 my $processedAPK = 0;
1235 my $processedECD = 0;
1236 my $lastHeader ;
1238 # my $lastWasLocalHeader = 0;
1239 # my $inCentralHeader = 0;
1245 my $here = $FH->tell();
1248 my $delta = $FILELEN - $TRAILING;
1255 my ($buffer, $signature) = read_V();
1269 my $expectedEntry = $HeaderOffsetIndex->getNextIndex() ;
1278 my $delta = $expectedOffset - $here ;
1283 # my $delta = $expectedOffset - $here ;
1357 my $handler = Signatures::decoder($signature);
1364 # my $locOffset = $CentralDirectory->getNextLocalOffset();
1365 # my $delta = $locOffset - $here ;
1389 # my $skippedFrom = $FH->tell() ;
1390 # my $skippedContent = $CentralDirectory->{CentralDirectoryOffset} - $skippedFrom ;
1443 my %cleanCentralEntries = %{ $CentralDirectory->{byCentralOffset} };
1451 for my $index (sort { $a <=> $b } keys %{ Nesting::encapsulations() })
1453 my $outer = Nesting::entryByIndex($index) ;
1457 for my $inner (sort { $a <=> $b } @{ Nesting::encapsulations()->{$index} } )
1468 my %orphans = map { $_->localHeaderOffset => $_->outputFilename }
1480 my $table = new SimpleTable;
1493 my %orphans = map { $_->centralHeaderOffset => $_ }
1504 my $table = new SimpleTable;
1524 my %outerEntries = map { $_->localHeaderOffset => $_->outputFilename }
1536 my $count = scalar keys %outerEntries;
1539 my $table = new SimpleTable;
1552 my %missingDataDescriptor = map { $_->localHeaderOffset => $_->outputFilename }
1560 for my $offset (sort keys %missingDataDescriptor)
1562 my $filename = $missingDataDescriptor{$offset};
1570 my %ByLocalOffset = map { $_->localHeaderOffset => $_ }
1578 for my $offset (sort keys %ByLocalOffset)
1580 my @entries = @{ $ByLocalOffset{$offset}->getCdEntries };
1584 my $localEntry = $LocalDirectory->getByLocalOffset($offset) ;
1594 my $table = new SimpleTable;
1613 my @localOffsets = sort { $a <=> $b } keys %{ $CentralDirectory->{byLocalOffset} };
1617 my %nested ;
1618 my %bomb;
1620 for my $offset (@localOffsets)
1622 my $innerEntry = $LocalDirectory->{byLocalOffset}{$offset};
1625 my $outerLocalEntry = Nesting::getOuterEncapsulation($innerEntry);
1628 my $outerOffset = $outerLocalEntry->localHeaderOffset();
1646 for my $loc (sort keys %nested)
1648 my $count = scalar @{ $nested{$loc} };
1649 my $outerEntry = $LocalDirectory->getByLocalOffset($loc);
1651 for my $n ( @{ $nested{$loc} } )
1653 my $innerEntry = $LocalDirectory->getByLocalOffset($n);
1665 for my $loc (sort keys %bomb)
1667 my $count = scalar @{ $bomb{$loc} };
1668 my $outerEntry = $LocalDirectory->getByLocalOffset($loc);
1671 my $table = new SimpleTable;
1694 for my $centralEntry ( sort { $a->centralHeaderOffset() <=> $b->centralHeaderOffset() } values %cleanCentralEntries )
1696 my $localOffset = $centralEntry->localHeaderOffset;
1697 my $localEntry = $LocalDirectory->getByLocalOffset($localOffset);
1716 my $table = new SimpleTable;
1719 for my $data (@$fields)
1721 my ($field, $offset, $name, $stringify) = @$data;
1723 my $localValue = $localEntry->{$field} ;
1724 my $centralValue = $centralEntry->{$field};
1742 my $badFields = $table->hasData;
1754 my @messages = "Central Directory exists, but Local Directory not found" ;
1787 my $count = scalar @Messages ;
1797 my $lastHeader = shift;
1798 my $delta = shift // 0;
1804 my $here = $FH->tell();
1806 my $localEntry = $lastHeader->{entry};
1813 my $signature = unpack "V", peekAtOffset($here + $delta, 4);
1820 my $cl32 = unpack "V", peekAtOffset($here + $delta - 8, 4);
1821 my $cl64 = unpack "Q<", peekAtOffset($here + $delta - 16, 8);
1839 my $lastHeader= shift;
1840 my $delta = shift;
1846 my $here = $FH->tell();
1848 my $localEntry = $lastHeader->{entry};
1849 my $compressedSize = $lastHeader->{payloadLength} ;
1851 my $sigName = Signatures::titleName(ZIP_DATA_HDR_SIG);
1907 my $cdEntry = $localEntry->getCdEntry;
1913 my $cl = unpack "V", peekAtOffset($FH->tell() + 4, 4);
1937 my $cl = unpack "Q<", peekAtOffset($FH->tell() + 4, 8);
1966 my $id = shift ;
1972 my $id = shift ;
1978 my $signature = shift ;
1979 my $data = shift ;
1980 my $startRecordOffset = shift ;
1982 my $locHeaderOffset = $FH->tell() -4 ;
1990 my $buffer;
1991 my $orphan = 0;
1993 my ($loc, $CDcompressedSize, $cdZip64, $zip64Sizes, $cdIndex, $cdEntryOffset) ;
1994 my $CentralEntryExists = $CentralDirectory->localOffset($startRecordOffset);
1995 my $localEntry = LocalDirectoryEntry->new();
1997 my $cdEntry;
2020 my $extractVer = out_C "Extract Zip Spec", \&decodeZipVer;
2023 my ($bgp, $gpFlag) = read_v();
2024 my ($bcm, $compressedMethod) = read_v();
2028 my $LanguageEncodingFlag = $gpFlag & ZIP_GP_FLAG_LANGUAGE_ENCODING ;
2029 my $streaming = $gpFlag & ZIP_GP_FLAG_STREAMING_MASK ;
2036 my $lastMod = out_V "Modification Time", sub { LastModTime($_[0]) };
2038 my $crc = out_V "CRC";
2042 my $compressedSize = out_V "Compressed Size";
2045 my $uncompressedSize = out_V "Uncompressed Size";
2048 my $filenameLength = out_v "Filename Length";
2055 my $extraLength = out_v "Extra Length";
2057 my $filename = '';
2062 myRead(my $raw_filename, $filenameLength);
2097 my @msg ;
2118 my $minizip_encrypted = $localEntry->minizip_secure;
2119 my $pk_encrypted = ($gpFlag & ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK) && $compressedMethod != 99 && ! $minizip_encrypted;
2133 my $size = 0;
2137 my $cdl = defined $cdEntry
2145 my $cdu = defined $CentralDirectory->{byLocalOffset}{$locHeaderOffset}
2148 my $CDuncompressedSize = $localEntry->uncompressedSize ;
2153 my $fullCompressedSize = $CDcompressedSize;
2155 my $payloadOffset = $FH->tell();
2162 my $available = $FILELEN - $FH->tell;
2176 my $haveCDcompressedSize = $CDcompressedSize;
2201 myRead(my $sha1, 20);
2206 my $auth ;
2237 my $cdSize = shift;
2239 my $here = $FH->tell();
2241 my $data ;
2247 my $ix = index($data, Pack_ZIP_DIGITAL_SIGNATURE_SIG);
2251 my $sigSize = unpack "v", substr($data, $ix+4, 2);
2265 my $decryptHeaderSize = DecryptionHeader(1);
2270 my $delta = deltaToNextSignature();
2298 my $central = shift ;
2312 my $bytecount = 2;
2314 my $IVSize = out_v "IVSize";
2318 my $Size = out_V "Size";
2326 my $ErdSize = out_v "ErdSize";
2329 my $Reserved1_RCount = out_V "RCount";
2332 my $VSize = out_v "VSize";
2344 my $recipients = shift;
2350 my $HSize = out_v "HSize" ;
2352 my $ix = 1;
2355 my $hex = sprintf("Key #%X", $ix) ;
2356 my $RESize = out_v "RESize $hex";
2367 my $data = shift;
2378 my $filename = shift;
2399 my $offset = shift ;
2400 my $filename = shift ;
2401 my $extractVersion = shift;
2402 my $versionMadeBy = shift;
2403 my $compressedSize = shift;
2404 my $uncompressedSize = shift;
2405 my $externalAttributes = shift;
2407 my $dosAttributes = $externalAttributes & 0xFFFF;
2408 my $otherAttributes = ($externalAttributes >> 16 ) & 0xFFFF;
2410 my $probablyDirectory = 0;
2411 my $filenameOK = 0;
2412 my $attributesSet = 0;
2413 my $dosAttributeSet = 0;
2414 my $unixAttributeSet = 0;
2469 my $got = decodeZipVer($extractVersion);
2477 my $filename = shift ;
2557 my $raw_filename = shift;
2558 my $LanguageEncodingFlag = shift;
2559 my $message = shift // "Filename";
2561 my $filename ;
2562 my $decoded_filename;
2590 my $raw_filename = shift;
2591 my $LanguageEncodingFlag = shift;
2592 my $message = shift // "Filename";
2594 my ($filename, $decoded_filename, $modified) = getOutputFilename($raw_filename, $LanguageEncodingFlag);
2610 # my $NormaizedForm ;
2632 my $v = validateFilename($decoded_filename);
2636 my @v = ref $v eq 'ARRAY'
2651 my $signature = shift ;
2652 my $data = shift ;
2653 my $startRecordOffset = shift ;
2655 my $cdEntryOffset = $FH->tell() - 4 ;
2661 my $buffer;
2666 my $made_by = out_C "Created OS", \&decodeOS;
2667 my $extractVer = out_C "Extract Zip Spec", \&decodeZipVer;
2670 my ($bgp, $gpFlag) = read_v();
2671 my ($bcm, $compressedMethod) = read_v();
2673 my $cdEntry = CentralDirectoryEntry->new($cdEntryOffset);
2677 my $LanguageEncodingFlag = $gpFlag & ZIP_GP_FLAG_LANGUAGE_ENCODING ;
2684 my $lastMod = out_V "Modification Time", sub { LastModTime($_[0]) };
2686 my $crc = out_V "CRC";
2687 my $compressedSize = out_V "Compressed Size";
2688 my $std_compressedSize = $compressedSize;
2689 my $uncompressedSize = out_V "Uncompressed Size";
2690 my $std_uncompressedSize = $uncompressedSize;
2691 my $filenameLength = out_v "Filename Length";
2696 my $extraLength = out_v "Extra Length";
2697 my $comment_length = out_v "Comment Length";
2698 my $disk_start = out_v "Disk Start";
2699 my $std_disk_start = $disk_start;
2701 my $int_file_attrib = out_v "Int File Attributes";
2706 my $ext_file_attrib = out_V "Ext File Attributes";
2710 my $dos_attrib = $ext_file_attrib & 0xFFFF;
2739 my $native_attrib = ($ext_file_attrib >> 16 ) & 0xFFFF;
2755 my $rwx = ($native_attrib & 0777);
2759 my $output = '';
2772 my $not_rwx = (($native_attrib >> 12) & 0xF);
2785 my $got = $masks->{$not_rwx} // 'Unknown Unix attrib' ;
2795 my ($d, $locHeaderOffset) = read_V();
2796 my $out = Value_V($locHeaderOffset);
2797 my $std_localHeaderOffset = $locHeaderOffset;
2812 my $commonMessage = "'Local Header Offset' field in '" . Signatures::name($signature) . "' is invalid";
2816 my $filename = '';
2821 myRead(my $raw_filename, $filenameLength);
2862 my $comment ;
2878 my $ver = shift ;
2883 my $sHi = int($ver /10) ;
2884 my $sLo = $ver % 10 ;
2891 my $ver = shift ;
2905 my $signature = shift ;
2906 my $data = shift ;
2907 my $startRecordOffset = shift ;
2914 my $size = out_Q "Size of record";
2920 my $extractSpec = out_C "Extract Zip Spec", \&decodeZipVer;
2922 my $diskNumber = out_V "Number of this disk";
2923 my $cdDiskNumber = out_V "Central Dir Disk no";
2924 my $entriesOnThisDisk = out_Q "Entries in this disk";
2925 my $totalEntries = out_Q "Total Entries";
2926 my $centralDirSize = out_Q "Size of Central Dir";
2928 my ($d, $centralDirOffset) = read_Q();
2929 my $out = Value_Q($centralDirOffset);
2938 my $commonMessage = "'Offset to Central Directory' field in '" . Signatures::name($signature) . "' is invalid";
2946 my $remaining = $size - 44;
2969 my ($bcm, $compressedMethod) = read_v();
2980 my $hashLen = out_v "Hash Length ";
2986 my $entry = Zip64EndCentralHeaderEntry->new();
3004 my $signature = shift ;
3005 my $data = shift ;
3006 my $startRecordOffset = shift ;
3013 # my ($nextRecord, $deltaActuallyAvailable) = $HeaderOffsetIndex->checkForOverlap(16);
3027 my ($d, $zip64EndCentralDirOffset) = read_Q();
3028 my $out = Value_Q($zip64EndCentralDirOffset);
3035 my $totalDisks = out_V "Total no of Disks";
3039 my $commonMessage = "'Offset to Zip64 End of Central Directory Record' field in '" . Signatures::name($signature) . "' is invalid";
3051 my $diskNumber = shift ;
3052 my $cdDiskNumber = shift ;
3053 my $entriesOnThisDisk = shift ;
3054 my $totalEntries = shift ;
3055 my $centralDirSize = shift ;
3056 my $centralDirOffset = shift ;
3069 my $offset = shift;
3070 my $diskNumber = shift ;
3071 my $cdDiskNumber = shift ;
3072 my $entriesOnThisDisk = shift ;
3073 my $totalEntries = shift ;
3074 my $centralDirSize = shift ;
3075 my $centralDirOffset = shift ;
3091 my $signature = shift ;
3092 my $data = shift ;
3093 my $startRecordOffset = shift ;
3101 my $diskNumber = out_v "Number of this disk";
3102 my $cdDiskNumber = out_v "Central Dir Disk no";
3103 my $entriesOnThisDisk = out_v "Entries in this disk";
3104 my $totalEntries = out_v "Total Entries";
3105 my $centralDirSize = out_V "Size of Central Dir";
3107 my ($d, $centralDirOffset) = read_V();
3108 my $out = Value_V($centralDirOffset);
3115 my $comment_length = out_v "Comment Length";
3119 my $here = $FH->tell() ;
3120 my $available = $FILELEN - $here ;
3131 my $comment ;
3143 my $commonMessage = "'Offset to Central Directory' field in '" . Signatures::name($signature) . "' is invalid";
3165 my $signature = shift ;
3166 my $data = shift ;
3167 my $startRecordOffset = shift ;
3169 my $here = $FH->tell();
3177 # my (undef, $next_sig) = read_V();
3189 my $sigName = Signatures::titleName(ZIP_DATA_HDR_SIG);
3203 my $compressedSize;
3204 my $uncompressedSize;
3206 my $localEntry = $LocalDirectory->lastStreamedEntryAdded();
3207 my $centralEntry = $localEntry && $localEntry->getCdEntry ;
3217 my $crc = out_V "CRC";
3218 my $payloadLength = $here - 4 - $localEntry->payloadOffset;
3220 my $deltaToNext = deltaToNextSignature();
3221 my $cl32 = unpack "V", peekAtOffset($here + 4, 4);
3222 my $cl64 = unpack "Q<", peekAtOffset($here + 4, 8);
3321 my $filename = $localEntry->filename;
3338 my $signature = shift ;
3339 my $data = shift ;
3340 my $startRecordOffset = shift ;
3342 my $here = $FH->tell();
3346 my (undef, $next_sig) = read_V();
3364 my $signature = shift ;
3365 my $data = shift ;
3366 my $startRecordOffset = shift ;
3372 my $size = out_v "Size of record";
3383 my $signature = shift ;
3384 my $data = shift ;
3385 my $startRecordOffset = shift ;
3391 my $Size = out_v "Size of record";
3396 myRead(my $payload, $Size);
3404 my $method = shift;
3405 my $gp = shift;
3409 my %lookup = (
3418 my $mid = ($gp >> 1) & 0x03 ;
3453 my $fh = $_[0] ;
3454 my $size = $_[1];
3463 my $fh = $_[0] ;
3464 my $size = $_[1];
3474 my $got = \$_[0] ;
3475 my $size = $_[1];
3477 my $wantSize = $size;
3487 my $buff ;
3488 my $status = $FH->read($buff, $size);
3494 my $len = length $$got;
3503 my $expected = shift;
3504 my $got = shift;
3510 my $byteCount = shift ;
3511 my $message = shift ;
3512 my $field = shift // '';
3515 my $here = $FH->tell() ;
3516 my $available = $FILELEN - $here ;
3519 my @message ;
3542 my $offset = shift;
3543 my $expectedSignature = shift ;
3560 my $offset = shift;
3561 my $expectedSignature = shift ;
3566 my $currentOFFSET = $OFFSET;
3567 my $gotSig = readSignatureFromOffset($offset);
3587 my $offset = shift;
3588 my $headerStart = shift;
3589 my $centralDirSize = shift;
3590 my $commonMessage = shift ;
3591 my $expectedSignature = shift ;
3592 my $dereferencePointer = shift;
3594 my $must_point_back = 1;
3596 my $delta = $offset - $FILELEN + 1 ;
3609 my $actual = $headerStart - $centralDirSize;
3610 my $cdSizeOK = ($actual == $offset);
3611 my $possibleDelta = $actual - $offset;
3619 my $gotSig = readSignatureFromOffset($actual);
3620 my $v = hexValue32($gotSig);
3631 my $gotSig = readSignatureFromOffset($offset);
3632 my $v = hexValue32($gotSig);
3643 my $offset = shift;
3644 my $headerStart = shift;
3645 my $centralDirSize = shift;
3646 my $commonMessage = shift ;
3647 my $messageOffset = shift;
3648 my $expectedSignature = shift ;
3649 my $fatal = shift // 0;
3650 my $dereferencePointer = shift // 1;
3652 my $keepOFFSET = $OFFSET ;
3654 my $message = offsetIsValid($offset, $headerStart, $centralDirSize, $commonMessage, $expectedSignature, $dereferencePointer);
3672 my $offset = shift ;
3673 my $message = shift;
3680 my $offset = shift ;
3681 my $message = shift;
3713 my $message = shift ;
3727 my $offset = shift ;
3728 my $message = shift;
3750 my $offset = shift ;
3751 my $message = shift;
3781 my $offset = shift ;
3782 my $message = shift;
3813 my $offset = shift ;
3814 my $message = shift;
3837 my $message = shift;
3852 my $delta = shift // $PREFIX_DELTA ;
3862 my $offset = shift;
3863 my $message = shift;
3894 my $XLEN = shift;
3895 my $entry = shift;
3899 my $buff ;
3900 my $offset = 0 ;
3902 my $id;
3903 my $subLen;
3904 my $payload ;
3906 my $count = 0 ;
3907 my $endExtraOffset = $FH->tell() + $XLEN ;
3916 my $remaining = $XLEN - $offset;
3923 my $data = hexDump($payload);
3942 my $lookID = unpack "v", $id ;
3946 my $here = $FH->tell();
3947 my $rest;
3951 my $len = length ($id . $rest) ;
3960 my ($who, $decoder, $local_min, $local_max, $central_min, $central_max) = @{ $Extras{$lookID} // ['', undef, undef, undef, undef, undef ] };
3962 my $idString = Value_v($lookID) ;
3991 my $data = hexDump16($payload);
4000 my $endExtraOffset = $FH->tell() + $subLen;
4007 my $here = $FH->tell() ;
4033 my $lookID = shift;
4034 my $size = shift;
4035 my $inCentralDir = shift;
4037 my ($who, undef, $local_min, $local_max, $central_min, $central_max) = @{ $Extras{$lookID} // ['', undef, undef, undef, undef, undef ] };
4039 my ($min, $max) = $inCentralDir
4095 my $extraID = shift ;
4096 my $len = shift;
4097 my $entry = shift;
4099 myRead(my $payload, $len);
4113 my $extraID = shift ;
4114 my $zip64Extended = shift;
4115 my $entry = shift;
4116 my $display = shift // 1 ;
4118 my $fieldStart = $FH->tell() - length $zip64Extended;
4119 my $fieldOffset = $fieldStart ;
4130 my $assumeLengthsPresent = (length($zip64Extended) == 16) ;
4131 my $assumeAllFieldsPresent = (length($zip64Extended) == 28) ;
4138 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(8) . " bytes for 'Uncompressed Size': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4145 my $data = substr($zip64Extended, 0, 8, "") ;
4155 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(8) . " bytes for 'Compressed Size': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4163 my $data = substr($zip64Extended, 0, 8, "") ;
4176 my $data = substr($zip64Extended, 0, 8, "") ;
4177 my $localHeaderOffset = unpack "Q<", $data;
4186 my $data = substr($zip64Extended, 0, 4, "") ;
4187 my $diskNumber = unpack "v", $data;
4205 my $extraID = shift ;
4206 my $zip64Extended = shift;
4207 my $entry = shift;
4208 my $display = shift // 1 ;
4210 my $fieldStart = $FH->tell() - length $zip64Extended;
4211 my $fieldOffset = $fieldStart ;
4222 my $assumeAllFieldsPresent = (length($zip64Extended) == 28) ;
4228 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(8) . " bytes for 'Uncompressed Size': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4235 my $data = substr($zip64Extended, 0, 8, "") ;
4245 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(8) . " bytes for 'Compressed Size': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4253 my $data = substr($zip64Extended, 0, 8, "") ;
4263 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(8) . " bytes for 'Offset to Local Dir': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4271 my $here = $FH->tell();
4272 my $data = substr($zip64Extended, 0, 8, "") ;
4277 my $commonMessage = "'Offset to Local Dir' field in 'Zip64 Extra Field' is invalid";
4285 my $message = extraFieldIdentifier($extraID) . ": Expected " . decimalHex0x(4) . " bytes for 'Disk Number': only " . decimalHex0x(length $zip64Extended) . " bytes present";
4293 my $here = $FH->tell();
4294 my $data = substr($zip64Extended, 0, 4, "") ;
4313 my $m = shift;
4314 my $v = shift;
4318 my $hex = Value_Q($v) ;
4326 my $ns = ($v % 10000000) * 100;
4327 my $elapse = int ($v/10000000);
4334 my $extraID = shift ;
4335 my $len = shift;
4336 my $entry = shift;
4342 my ($m, $s1) = read_Q;
4345 my ($a, $s3) = read_Q;
4348 my ($c, $s2) = read_Q;
4354 my $ix = shift;
4355 my $tag = shift;
4356 my $size = shift;
4361 my ($data, $value) = read_Q();
4363 my $datetime = "No Date Time'";
4366 my $v = $value - 0x007C95674C3DA5C0 ;
4367 my $ns = ($v % 10000000) * 100 ;
4368 my $seconds = int($v / 10000000) ;
4378 my $ix = shift;
4379 my $tag = shift;
4380 my $size = shift;
4382 myRead(my $data, $size);
4390 my $ix = shift;
4391 my $tag = shift;
4392 my $size = shift;
4394 my ($data, $value) = read_V();
4401 my $ix = shift;
4402 my $tag = shift;
4403 my $size = shift;
4427 my ($data, $value) = read_V();
4431 for my $bit ( sort { $a <=> $b } keys %{ $FCH } )
4443 my $ix = shift;
4444 my $tag = shift;
4445 my $size = shift;
4447 my ($data, $value) = read_v();
4454 my $ix = shift;
4455 my $tag = shift;
4456 my $size = shift;
4458 my ($data, $value) = read_v();
4465 my $extraID = shift ;
4466 my $len = shift;
4467 my $entry = shift;
4487 my $ix = 1;
4490 my ($data, $tag) = read_v();
4491 my $tagname = 'Unknown Tag';
4492 my $decoder = undef;
4500 my $size = out_v " Size";
4519 my $time = shift ;
4529 my $time = shift ;
4539 my $value = shift ;
4549 my $dt = shift;
4555 my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
4556 my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1;
4557 my $mday = ( ( $dt >> 16 ) & 0x1f );
4559 my $hour = ( ( $dt >> 11 ) & 0x1f );
4560 my $min = ( ( $dt >> 5 ) & 0x3f );
4561 my $sec = ( ( $dt << 1 ) & 0x3e );
4564 my $time_t;
4572 my $dosDecode = $year+1900 . sprintf "-%02u-%02u %02u:%02u:%02u", $mon, $mday, $hour, $min, $sec;
4585 my $extraID = shift ;
4586 my $len = shift;
4587 my $entry = shift;
4598 my $full = ($len == 13) ;
4600 my $remaining = $len;
4602 my ($data, $flags) = read_C();
4604 my $v = Value_C $flags;
4605 my @f ;
4641 my ($data, $time) = read_V();
4672 my ($data, $time) = read_V();
4701 my ($data, $time) = read_V();
4713 my $extraID = shift ;
4714 my $len = shift;
4715 my $entry = shift;
4737 my $extraID = shift ;
4738 my $len = shift;
4739 my $entry = shift;
4747 my $remaining = $len;
4751 my ($data, $alg) = read_v();
4752 my $algorithm = $Algorithm->{$alg} // "Unknown";
4760 my ($d, $digestSize) = read_v();
4791 my $extraID = shift ;
4792 my $len = shift;
4793 my $entry = shift;
4798 my $size = out_Q " Entries";
4808 my $extraID = shift ;
4809 my $len = shift;
4810 my $entry = shift;
4814 my $validAES = 1;
4817 my $vendorVersion = out_v " Vendor Version", sub { $lookup->{$_[0]} || "Unknown" } ;
4824 my $id ;
4826 my $idValue = out $id, " Vendor ID", unpackValue_v($id) . " '$id'";
4839 my $strength = out_C " Encryption Strength", sub {$strengths->{$_[0]} || "Unknown" } ;
4847 my ($bmethod, $method) = read_v();
4863 my $len = shift;
4864 my $entry = shift;
4867 myRead(my $uuid, 16);
4879 my $extraID = shift ;
4880 my $len = shift;
4881 my $entry = shift;
4890 my $extraID = shift ;
4891 my $len = shift;
4892 my $entry = shift;
4899 my $padding;
4914 my $extraID = shift ;
4915 my $len = shift;
4916 my $entry = shift;
4918 my $inCentralHdr = $entry->inCentralDir ;
4922 my ($data, $alignment) = read_v();
4926 my $recompress_value = $alignment & 0x8000 ? 1 : 0;
4928 my $recompressing = $recompress_value ? "True" : "False";
4930 my $hexAl = sprintf("%X", $alignment);
4937 my $padding;
4947 my $extraID = shift ;
4948 my $len = shift;
4949 my $entry = shift;
4951 my $inCentralHdr = $entry->inCentralDir ;
4955 my ($data, $time) = read_V();
4969 my $extraID = shift ;
4970 my $len = shift;
4971 my $entry = shift;
4980 my $value = shift ;
5006 my $extraID = shift ;
5007 my $len = shift;
5008 my $entry = shift;
5014 my $version = out_C " Version" ;
5018 my $available = $len - 1 ;
5020 my $uidSize = out_C " UID Size";
5034 myRead(my $data, $uidSize);
5047 my $gidSize = out_C " GID Size";
5060 myRead(my $data, $gidSize);
5069 my $extraID = shift ;
5070 my $len = shift;
5071 my $entry = shift;
5079 my $extraID = shift ;
5080 my $len = shift;
5081 my $entry = shift;
5088 myRead(my $data, $len - 5);
5096 my $extraID = shift ;
5097 my $len = shift;
5098 my $entry = shift;
5100 # https://stackoverflow.com/questions/76581811/why-does-unzip-ignore-my-zip64-end-of-central-directory-record
5103 my $native_attrib = out_v " Mode";
5120 my $rwx = ($native_attrib & 0777);
5124 my $output = '';
5137 my $not_rwx = (($native_attrib >> 12) & 0xF);
5150 my $got = $masks->{$not_rwx} // 'Unknown Unix attrib' ;
5157 my $s = out_V " SizDev";
5167 my $extraID = shift ;
5168 my $len = shift;
5169 my $entry = shift;
5176 myRead(my $data, $len - 5);
5186 my $extraID = shift ;
5187 my $len = shift;
5188 my $entry = shift;
5190 my $data ;
5191 my $remaining = $len;
5218 my ($idb, $id) = read_V();
5221 my $outid = decimalHex0x($id);
5229 my $filenameLength = out_v " Filename Length";
5233 my $commentLength = 0;
5296 my $extraID = shift ;
5297 my $len = shift;
5298 my $entry = shift;
5300 my $remaining = $len;
5302 myRead(my $signature, 13);
5308 myRead(my $payload, $remaining);
5309 my $data = hexDump16($signature . $payload);
5317 my $kvPairs = out_C " KV Count";
5320 for my $index (1 .. $kvPairs)
5322 my $key;
5323 my $klen = out_v " Key size #$index";
5330 my $value;
5331 my $vlen = out_v " Value size #$index";
5348 my $extraID = shift ;
5349 my $len = shift;
5350 my $entry = shift;
5352 my $inCentralHdr = $entry->inCentralDir ;
5364 my $plen = $len - 4 - 1 - 2 - 4;
5372 my $extraID = shift ;
5373 my $len = shift;
5374 my $entry = shift;
5377 myRead(my $data, $len);
5378 my $ID = unpack("N", $data);
5382 my $d = substr($data, 0, 4, '') ;
5393 my $extraID = shift ;
5394 my $len = shift;
5395 my $entry = shift;
5404 my $recipients = out_V " Recipients";
5406 my $available = $len - 12;
5427 my $HSize = out_v " HSize" ;
5438 my $ix = 1;
5441 myRead(my $payload, $HSize);
5442 my $data = hexDump16($payload);
5455 my $entry = shift;
5460 my %saltSize = (
5466 myRead(my $salt, $saltSize{$entry->aesStrength } // 0);
5468 myRead(my $pwv, 2);
5476 my $len = 0;
5478 my $b1;
5479 my $b2;
5480 my $buffer;
5483 my ($verHi, $verLow) = unpack ("CC", $b1);
5486 my $LzmaPropertiesSize = out_v "LZMA Properties Size";
5489 my $LzmaInfo = out_C "LZMA Info", sub { $_[0] == 93 ? "(Default)" : ""};
5491 my $PosStateBits = 0;
5492 my $LiteralPosStateBits = 0;
5493 my $LiteralContextBits = 0;
5516 # my $fh = shift;
5517 my $offset = shift;
5518 my $len = shift;
5520 my $here = $FH->tell();
5524 my $buffer;
5536 # my $fh = shift;
5537 my $offset = shift;
5538 my $len = shift;
5542 my $buffer;
5553 my $offset = shift ;
5560 my $here = $FH->tell();
5561 my $buffer = readFromOffset($offset, 4);
5562 my $gotSig = unpack("V", $buffer) ;
5571 my $fh = shift;
5572 my $cdOffset = shift;
5573 my $cdSize = shift;
5592 my $magicOffset = $cdOffset - 16;
5593 my $buffer = readFromOffset($magicOffset, 16);
5601 my $len2 = unpack("Q<", $buffer);
5609 my $startApkOffset = $cdOffset - 8 - $len2 ;
5612 my $len1 = unpack("Q<", $buffer);
5640 my $ix = 1;
5644 my ($bytes, $id, $len);
5658 my $magic ;
5666 my $here = $FH->tell();
5673 my $delta = $START_APK - $here;
5674 my $padding = peekAtOffset($here, $delta);
5688 my $fh = shift;
5690 my $here = $fh->tell();
5696 my ($offset, $size) = findCentralDirectoryOffset($fh);
5706 my $buffer ;
5707 my $cdIndex = 0;
5708 my $cdEntryOffset = 0;
5713 my $startHeader = $fh->tell() - ZIP_CD_FILENAME_OFFSET;
5715 my $cdEntryOffset = $fh->tell() - ZIP_CD_FILENAME_OFFSET;
5720 my $extractVer = unpack("v", substr($buffer, 6, 1));
5721 my $gpFlag = unpack("v", substr($buffer, 8, 2));
5722 my $lastMod = unpack("V", substr($buffer, 10, 4));
5723 my $crc = unpack("V", substr($buffer, 16, 4));
5724 my $compressedSize = unpack("V", substr($buffer, 20, 4));
5725 my $uncompressedSize = unpack("V", substr($buffer, 24, 4));
5726 my $filename_length = unpack("v", substr($buffer, 28, 2));
5727 my $extra_length = unpack("v", substr($buffer, 30, 2));
5728 my $comment_length = unpack("v", substr($buffer, 32, 2));
5729 my $diskNumber = unpack("v", substr($buffer, 34, 2));
5730 my $locHeaderOffset = unpack("V", substr($buffer, 42, 4));
5732 my $cdZip64 = 0;
5733 my $zip64Sizes = 0;
5742 my $commonMessage = "'Local Header Offset' field in '" . Signatures::name(ZIP_CENTRAL_HDR_SIG) . "' is invalid";
5748 $fh->read(my $filename, $filename_length) ;
5750 my $cdEntry = CentralDirectoryEntry->new();
5773 $fh->read(my $extraField, $extra_length) ;
5776 my $zip64Extended = findID(0x0001, $extraField);
5815 my $fh = shift ;
5816 my $here = shift;
5817 my $eocdSize = shift;
5829 my $buffer;
5830 my $got = 0;
5833 my $gotSig = unpack("V", $buffer);
5840 my $cd64 = unpack "Q<", substr($buffer, 8, 8);
5841 my $totalDisks = unpack "V", substr($buffer, 16, 4);
5847 my $commonMessage = "'Offset to Zip64 End of Central Directory Record' field in '" . Signatures::name(ZIP64_END_CENTRAL_LOC_HDR_SIG) . "' is invalid";
5851 my $delta = $here - $cd64;
5855 my $zip64eocd_name = "'" . Signatures::name(ZIP64_END_CENTRAL_REC_HDR_SIG) . "'";
5856 my $zip64eocd_name_value = Signatures::nameAndHex(ZIP64_END_CENTRAL_REC_HDR_SIG);
5857 my $zip64eocd_value = Signatures::hexValue(ZIP64_END_CENTRAL_REC_HDR_SIG);
5870 my $sig = unpack("V", substr($buffer, 0, 4)) ;
5880 my $extractSpec = unpack "C", substr($buffer, 14, 1);
5881 my $diskNumber = unpack "V", substr($buffer, 16, 4);
5882 my $cdDiskNumber = unpack "V", substr($buffer, 20, 4);
5883 my $entriesOnThisDisk = unpack "Q<", substr($buffer, 24, 8);
5884 my $totalEntries = unpack "Q<", substr($buffer, 32, 8);
5885 my $centralDirSize = unpack "Q<", substr($buffer, 40, 8);
5886 my $centralDirOffset = unpack "Q<", substr($buffer, 48, 8);
5896 my $commonMessage = "'Offset to Central Directory' field in $zip64eocd_name is invalid";
5909 my $fh = shift ;
5918 my $here = $fh->tell();
5920 my $is64bit = $here > MAX32;
5921 my $over64bit = $here & (~ MAX32);
5923 my $buffer;
5926 my $zip64 = 0;
5927 my $diskNumber ;
5928 my $cdDiskNumber ;
5929 my $entriesOnThisDisk ;
5930 my $totalEntries ;
5931 my $centralDirSize ;
5932 my $centralDirOffset ;
5933 my $commentLength = 0;
5934 my $trailingBytes = 0;
5951 my $fileLen = $fh->tell();
5952 my $want = 0 ;
5956 my $seekTo = $fileLen - $want;
5963 my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG);
5977 my $expectedEof = $fileLen - $want + $pos + ZIP_EOCD_MIN_SIZE + $commentLength ;
6018 my $commonMessage = "'Offset to Central Directory' field in '" . Signatures::name(ZIP_END_CENTRAL_HDR_SIG) . "' is invalid";
6035 my $id_want = shift ;
6036 my $data = shift;
6038 my $XLEN = length $data ;
6040 my $offset = 0 ;
6046 my $id = substr($data, $offset, ZIP_EXTRA_SUBFIELD_ID_SIZE);
6050 my $subLen = unpack("v", substr($data, $offset,
6069 my @nibbles = (
6087 my $value = shift ;
6089 for my $pair (@nibbles)
6091 my ($count, $limit) = @{ $pair };
6103 my $class = shift ;
6104 my $offset = shift ;
6105 my $signature = shift;
6113 my $self = shift;
6119 my $self = shift;
6125 my $self = shift;
6138 my $class = shift ;
6140 my %object = (
6154 my $self = shift ;
6158 my $ix = 0;
6165 my $self = shift ;
6166 my $offset = shift ;
6167 my $signature = shift ;
6175 my $self = shift ;
6176 my $offset = shift ;
6177 my $signature = shift ;
6179 my $name = Signatures::name($signature);
6190 my $self = shift ;
6191 my $offset = shift ;
6200 my $self = shift ;
6201 my $offset = shift ;
6208 my $self = shift;
6212 for my $x ( @{ $self->{offsetIndex} } )
6214 my ($offset, $sig) = @$x;
6221 my $self = shift ;
6222 my $need = shift;
6224 my $needOffset = $FH->tell() + $need;
6226 for my $hdrOffset (@{ $self->{offsetIndex} })
6228 my $delta = $hdrOffset - $needOffset;
6245 my $classname = shift;
6246 my $object = shift;
6247 my $fields = shift ;
6248 my $no_handler = shift // {};
6253 while (my ($name, $value) = each %$fields)
6255 my $method = "${classname}::$name";
6292 my $class = shift ;
6296 my %fields = (
6309 my $self = bless {}, $class;
6318 my $self = shift;
6330 my $class = shift ;
6332 my $self = $class->SUPER::new();
6335 my %fields = (
6392 my $class = shift ;
6394 my $self = $class->SUPER::new();
6397 my %fields = (
6433 my $class = shift ;
6434 my $offset = shift;
6440 my $self = $class->SUPER::new();
6442 my %fields = (
6462 my $class = shift ;
6464 my %object = (
6485 my $self = shift ;
6486 my $entry = shift ;
6488 my $localHeaderOffset = $entry->localHeaderOffset ;
6489 my $CentralDirectoryOffset = $entry->centralHeaderOffset ;
6490 my $filename = $entry->filename ;
6495 my $ldEntry = Nesting::getLdEntryByOffset($localHeaderOffset);
6509 my $existing = $self->{byName}{$filename} ;
6521 my $existingNormalizedEntry = $self->normalize_filename($entry, $filename);
6550 my $self = shift ;
6557 my $self = shift ;
6565 my $self = shift ;
6566 my $offset = shift ;
6569 my $entry = $self->{byLocalOffset}{$offset - $PREFIX_DELTA} ;
6575 my $self = shift ;
6576 my $offset = shift ;
6584 my $self = shift ;
6585 my $offset = shift ;
6587 my $index = $self->{offset2Index} ;
6599 my $self = shift ;
6605 my $self = shift ;
6613 my $self = shift ;
6620 my $self = shift ;
6626 my $self = shift ;
6635 my $self = shift ;
6636 my $entry = shift;
6637 my $filename = shift;
6639 my $nFilename = lc $filename;
6641 my $lookup = $self->{normalized_filenames}{$nFilename};
6673 my $class = shift ;
6675 my $self = $class->SUPER::new();
6677 my %fields = (
6694 my $self = shift ;
6695 my $entry = shift;
6708 my $self = shift ;
6718 my $self = shift ;
6728 my $class = shift ;
6730 my %object = (
6749 my $self = shift ;
6750 my $localEntry = shift;
6758 my $self = shift ;
6759 my $localEntry = shift ;
6761 my $filename = $localEntry->filename ;
6762 my $localHeaderOffset = $localEntry->localHeaderOffset;
6763 my $payloadOffset = $localEntry->payloadOffset ;
6765 my $existingEntry = $self->{byName}{$filename} ;
6767 my $endSurfaceArea = $payloadOffset + ($localEntry->compressedSize // 0) ;
6779 my ($existing_filename, $offset) = $self->normalize_filename($filename);
6803 my $self = shift ;
6810 my $self = shift ;
6818 my $self = shift ;
6819 my $offset = shift ;
6826 my $self = shift ;
6827 my $offset = shift ;
6830 my $entry = $self->{byLocalOffset}{$offset} ;
6836 my $self = shift ;
6837 my $offset = shift ;
6839 my $index = $self->{offset2Index} ;
6851 my $self = shift ;
6852 my $offset = shift ;
6854 for my $entry ( reverse @{ $self->{entries} } )
6868 my $self = shift ;
6874 my $self = shift ;
6882 my $self = shift ;
6888 my $self = shift ;
6897 my $self = shift ;
6898 my $filename = shift;
6900 my $nFilename = lc $filename;
6902 my $lookup = $self->{normalized_filenames}{$nFilename};
6920 my $class = shift ;
6922 my %object = (
6934 my $filename = shift;
6945 my $nativeLocaleEncoding = getNativeLocale();
6946 my $opt_EncodingFrom = $nativeLocaleEncoding;
6947 my $opt_EncodingTo = $nativeLocaleEncoding ;
6948 my $opt_Encoding_Enabled;
6949 my $opt_Debug_Encoding;
6950 my $opt_use_LanguageEncodingFlag;
6971 my $encoding = encoding::_get_locale_encoding() ;
6994 my $enc = getNativeLocale();
7010 my $opt_name = shift;
7011 my $opt_value = shift;
7013 my $enc = Encode::find_encoding($opt_value) ;
7033 my $opt_name = shift;
7034 my $opt_value = shift;
7041 my $opt_name = shift;
7042 my $opt_value = shift;
7062 my $enc = TextEncoding::getNativeLocaleName();
7063 my $from = $opt_EncodingFrom->name();
7064 my $to = $opt_EncodingTo->name();
7081 my $name = shift ;
7082 my $type = shift ;
7083 my $LanguageEncodingFlag = shift ;
7111 my $name = shift ;
7112 my $type = shift ;
7113 my $LanguageEncodingFlag = shift ;
7140 my @nestingStack = ();
7141 my %encapsulations;
7142 my %inner2outer;
7143 my $encapsulationCount = 0;
7144 my %index2entry ;
7145 my %offset2entry ;
7147 # my %localOffset2cdEntry;
7161 my $indent = shift // 0;
7163 for my $offset (sort {$a <=> $b} keys %offset2entry)
7165 my $leading = " " x $indent ;
7173 my $entry = shift;
7183 my $entry = shift;
7185 my $filename = $entry->filename;
7190 my $match = undef;
7220 my $offsetStart = shift;
7221 my $offsetEnd = shift;
7226 for my $entry (@nestingStack)
7235 my @copy = @nestingStack ;
7247 my $entry = shift;
7249 my $outerIndex = $inner2outer{ $entry->index } ;
7259 my $entry = shift;
7266 my $entry = shift;
7268 my $got = $encapsulations{ $entry->index } ;
7287 my $entry = shift;
7289 for my $child (@{ $encapsulations{$entry->index} } )
7303 my $index = shift;
7309 my $offset = shift;
7315 my $offset = shift;
7316 my $entry = $offset2entry{$offset};
7337 my $class = shift;
7339 my %object = (
7350 my $self = shift;
7357 my $self = shift;
7365 my $self = shift;
7372 my $self = shift;
7375 my @colW = (0) x $self->{columns} ;
7376 for my $row (@{ $self->{data} }, @{ $self->{header} })
7378 my @r = @$row;
7379 for my $ix (0 .. $self->{columns} -1)
7387 my $width = sum(@colW) ; #+ @colW ;
7388 my @template ;
7389 for my $w (@colW)
7396 for my $row (@{ $self->{header} })
7398 my @outputRow = @template;
7401 for my $ix (0 .. $self->{columns} -1)
7403 my $field = $template[$ix] ;
7413 for my $row (@{ $self->{data} })
7415 my @outputRow = @template;
7418 for my $ix (0 .. $self->{columns} -1)
7420 my $field = $template[$ix] ;
7434 my $enc = TextEncoding::getNativeLocaleName();
7436 my $message = <<EOM;