Update IO-Compress to CPAN version 2.044
authorChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Sat, 3 Dec 2011 23:59:33 +0000 (23:59 +0000)
committerChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Sun, 4 Dec 2011 01:02:00 +0000 (01:02 +0000)
  [DELTA]

  2.044 2 December 2011

      * Moved FAQ.pod under the lib directory so it can get installed

      * Added bin/zipdetails

      * IO::Compress::Zip
        - In one-shot mode enable Zip64 mode if the input file/buffer
          >= 0xFFFFFFFF bytes.

      * IO::Compress::FAQ
        - Updates

48 files changed:
INSTALL
MANIFEST
Porting/Maintainers.pl
configure.com
cpan/IO-Compress/Changes
cpan/IO-Compress/Makefile.PL
cpan/IO-Compress/README
cpan/IO-Compress/bin/zipdetails [new file with mode: 0644]
cpan/IO-Compress/lib/Compress/Zlib.pm
cpan/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
cpan/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
cpan/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
cpan/IO-Compress/lib/IO/Compress/Base.pm
cpan/IO-Compress/lib/IO/Compress/Base/Common.pm
cpan/IO-Compress/lib/IO/Compress/Bzip2.pm
cpan/IO-Compress/lib/IO/Compress/Deflate.pm
cpan/IO-Compress/lib/IO/Compress/FAQ.pod [moved from cpan/IO-Compress/pod/FAQ.pod with 87% similarity]
cpan/IO-Compress/lib/IO/Compress/Gzip.pm
cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm
cpan/IO-Compress/lib/IO/Compress/Zip.pm
cpan/IO-Compress/lib/IO/Compress/Zip/Constants.pm
cpan/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
cpan/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
cpan/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
cpan/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
cpan/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
cpan/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
cpan/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
cpan/IO-Compress/lib/IO/Uncompress/Base.pm
cpan/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
cpan/IO-Compress/lib/IO/Uncompress/Gunzip.pm
cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm
cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm
cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm
cpan/IO-Compress/t/000prereq.t
cpan/IO-Compress/t/105oneshot-zip-bzip2-only.t
installperl
pod/perldelta.pod
pod/perlutil.pod
t/porting/known_pod_issues.dat
utils.lst
utils/Makefile
utils/Makefile.SH
utils/zipdetails.PL [new file with mode: 0644]
vms/descrip_mms.template
win32/Makefile
win32/makefile.mk

diff --git a/INSTALL b/INSTALL
index 079cc4e..06a9c59 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -2122,6 +2122,7 @@ make install will install the following:
        shasum          A tool to print or check SHA checksums.
        splain          Describe Perl warnings and errors.
        xsubpp          Compiler to convert Perl XS code into C code.
+       zipdetails              display the internal structure of zip files
 
     library files
 
index 8f6deb0..388ac2f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1219,6 +1219,7 @@ cpan/HTTP-Tiny/t/cases/redirect-07.txt
 cpan/HTTP-Tiny/t/cases/redirect-08.txt
 cpan/HTTP-Tiny/t/cases/redirect-09.txt
 cpan/HTTP-Tiny/t/Util.pm
+cpan/IO-Compress/bin/zipdetails                                IO::Compress
 cpan/IO-Compress/Changes                               IO::Compress
 cpan/IO-Compress/examples/compress-zlib/filtdef                IO::Compress
 cpan/IO-Compress/examples/compress-zlib/filtinf                IO::Compress
@@ -1242,6 +1243,7 @@ cpan/IO-Compress/lib/IO/Compress/Base/Common.pm           IO::Compress
 cpan/IO-Compress/lib/IO/Compress/Base.pm               IO::Compress
 cpan/IO-Compress/lib/IO/Compress/Bzip2.pm              IO::Compress
 cpan/IO-Compress/lib/IO/Compress/Deflate.pm            IO::Compress
+cpan/IO-Compress/lib/IO/Compress/FAQ.pod               IO::Compress
 cpan/IO-Compress/lib/IO/Compress/Gzip/Constants.pm     IO::Compress
 cpan/IO-Compress/lib/IO/Compress/Gzip.pm               IO::Compress
 cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm         IO::Compress
@@ -1261,7 +1263,6 @@ cpan/IO-Compress/lib/IO/Uncompress/Inflate.pm             IO::Compress
 cpan/IO-Compress/lib/IO/Uncompress/RawInflate.pm       IO::Compress
 cpan/IO-Compress/lib/IO/Uncompress/Unzip.pm            IO::Compress
 cpan/IO-Compress/Makefile.PL                           IO::Compress
-cpan/IO-Compress/pod/FAQ.pod                           IO::Compress
 cpan/IO-Compress/private/MakeUtil.pm                   IO::Compress
 cpan/IO-Compress/README                                        IO::Compress
 cpan/IO-Compress/t/000prereq.t                         IO::Compress
@@ -5470,6 +5471,7 @@ utils/ptar.PL                     The ptar utility
 utils/shasum.PL                        filter for computing SHA digests (analogous to md5sum)
 utils/splain.PL                        Stand-alone version of diagnostics.pm
 utils/xsubpp.PL                        External subroutine preprocessor
+utils/zipdetails.PL                    display the internal structure of zip files
 uts/sprintf_wrap.c             sprintf wrapper for UTS
 uts/strtol_wrap.c              strtol wrapper for UTS
 vmesa/Makefile                 VM/ESA Makefile
index f466ab2..8abc028 100755 (executable)
@@ -1035,7 +1035,7 @@ use File::Glob qw(:case);
     'IO-Compress' =>
        {
        'MAINTAINER'    => 'pmqs',
-       'DISTRIBUTION'  => 'PMQS/IO-Compress-2.043.tar.gz',
+       'DISTRIBUTION'  => 'PMQS/IO-Compress-2.044.tar.gz',
        'FILES'         => q[cpan/IO-Compress],
        'EXCLUDED'      => [ qr{t/Test/} ],
        'UPSTREAM'      => 'cpan',
index 5da5973..e51c3e6 100644 (file)
@@ -7330,6 +7330,7 @@ $ WRITE CONFIG "$ ptargrep   == """ + perl_setup_perl + " ''vms_prefix':[utils]p
 $ WRITE CONFIG "$ shasum     == """ + perl_setup_perl + " ''vms_prefix':[utils]shasum.com"""
 $ WRITE CONFIG "$ splain     == """ + perl_setup_perl + " ''vms_prefix':[utils]splain.com"""
 $ WRITE CONFIG "$ xsubpp     == """ + perl_setup_perl + " ''vms_prefix':[utils]xsubpp.com"""
+$ WRITE CONFIG "$ zipdetails == """ + perl_setup_perl + " ''vms_prefix':[utils]zipdetails.com"""
 $ CLOSE CONFIG
 $!
 $ echo  ""
index 9f2d070..d8c82c6 100644 (file)
@@ -1,6 +1,19 @@
 CHANGES
 -------
 
+  2.044 2 December 2011
+
+      * Moved FAQ.pod under the lib directory so it can get installed
+
+      * Added bin/zipdetails
+
+      * IO::Compress::Zip
+        - In one-shot mode enable Zip64 mode if the input file/buffer 
+          >= 0xFFFFFFFF bytes.
+
+      * IO::Compress::FAQ
+        - Updates 
+
   2.043 20 November 2011
 
       * IO::Compress::Base
index bfe40a5..71809ac 100644 (file)
@@ -3,7 +3,7 @@
 use strict ;
 require 5.004 ;
 
-$::VERSION = '2.043' ;
+$::VERSION = '2.044' ;
 
 use private::MakeUtil;
 use ExtUtils::MakeMaker 5.16 ;
@@ -40,6 +40,8 @@ WriteMakefile(
     ),
 
     INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
+
+    EXE_FILES => ['bin/zipdetails'],
     
     (
     $] >= 5.009 && $] <= 5.011001 && ! $ENV{PERL_CORE}
index b1090dc..d72d9b9 100644 (file)
@@ -1,9 +1,9 @@
 
                              IO-Compress
 
-                             Version 2.043
+                             Version 2.044
 
-                            20th November 2011
+                            3rd December 2011
 
        Copyright (c) 1995-2011 Paul Marquess. All rights reserved.
           This program is free software; you can redistribute it
@@ -89,7 +89,7 @@ To help me help you, I need all of the following information:
         If you haven't installed IO-Compress then search IO::Compress::Gzip.pm
         for a line like this:
 
-          $VERSION = "2.043" ;
+          $VERSION = "2.044" ;
 
  2. If you are having problems building IO-Compress, send me a
     complete log of what happened. Start by unpacking the IO-Compress
diff --git a/cpan/IO-Compress/bin/zipdetails b/cpan/IO-Compress/bin/zipdetails
new file mode 100644 (file)
index 0000000..5cb3a96
--- /dev/null
@@ -0,0 +1,2088 @@
+#!/usr/bin/perl
+
+# zipdetails
+#
+# Display info on the contents of a Zip file
+#
+
+use strict;
+use warnings ;
+
+use IO::File;
+use Encode;
+
+# Compression types 
+use constant ZIP_CM_STORE                      => 0 ;
+use constant ZIP_CM_IMPLODE                    => 6 ;
+use constant ZIP_CM_DEFLATE                    => 8 ;
+use constant ZIP_CM_BZIP2                      => 12 ;
+use constant ZIP_CM_LZMA                       => 14 ;
+use constant ZIP_CM_PPMD                       => 98 ; 
+
+# General Purpose Flag
+use constant ZIP_GP_FLAG_ENCRYPTED_MASK        => (1 << 0) ;
+use constant ZIP_GP_FLAG_STREAMING_MASK        => (1 << 3) ;
+use constant ZIP_GP_FLAG_PATCHED_MASK          => (1 << 5) ;
+use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK => (1 << 6) ;
+use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT      => (1 << 1) ;
+use constant ZIP_GP_FLAG_LANGUAGE_ENCODING     => (1 << 11) ;
+
+# Internal File Attributes
+use constant ZIP_IFA_TEXT_MASK                 => 1;
+
+# Signatures for each of the headers
+use constant ZIP_LOCAL_HDR_SIG                 => 0x04034b50;
+use constant ZIP_DATA_HDR_SIG                  => 0x08074b50;
+use constant ZIP_CENTRAL_HDR_SIG               => 0x02014b50;
+use constant ZIP_END_CENTRAL_HDR_SIG           => 0x06054b50;
+use constant ZIP64_END_CENTRAL_REC_HDR_SIG     => 0x06064b50;
+use constant ZIP64_END_CENTRAL_LOC_HDR_SIG     => 0x07064b50;
+use constant ZIP64_ARCHIVE_EXTRA_SIG           => 0x08064b50;
+use constant ZIP64_DIGITAL_SIGNATURE_SIG       => 0x05054b50;
+
+use constant ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG => 0x08064b50;
+
+# Extra sizes
+use constant ZIP_EXTRA_HEADER_SIZE          => 2 ;
+use constant ZIP_EXTRA_MAX_SIZE             => 0xFFFF ;
+use constant ZIP_EXTRA_SUBFIELD_ID_SIZE     => 2 ;
+use constant ZIP_EXTRA_SUBFIELD_LEN_SIZE    => 2 ;
+use constant ZIP_EXTRA_SUBFIELD_HEADER_SIZE => ZIP_EXTRA_SUBFIELD_ID_SIZE +
+                                               ZIP_EXTRA_SUBFIELD_LEN_SIZE;
+use constant ZIP_EXTRA_SUBFIELD_MAX_SIZE    => ZIP_EXTRA_MAX_SIZE - 
+                                               ZIP_EXTRA_SUBFIELD_HEADER_SIZE;
+
+my %ZIP_CompressionMethods =
+    (
+          0 => 'Stored',
+          1 => 'Shrunk',
+          2 => 'Reduced compression factor 1',
+          3 => 'Reduced compression factor 2',
+          4 => 'Reduced compression factor 3',
+          5 => 'Reduced compression factor 4',
+          6 => 'Imploded',
+          7 => 'Reserved for Tokenizing compression algorithm',
+          8 => 'Deflated',
+          9 => 'Enhanced Deflating using Deflate64(tm)',
+         10 => 'PKWARE Data Compression Library Imploding',
+         11 => 'Reserved by PKWARE',
+         12 => 'BZIP2 ',
+         13 => 'Reserved by PKWARE',
+         14 => 'LZMA',
+         15 => 'Reserved by PKWARE',
+         16 => 'Reserved by PKWARE',
+         17 => 'Reserved by PKWARE',
+         18 => 'File is compressed using IBM TERSE (new)',
+         19 => 'IBM LZ77 z Architecture (PFS)',
+         96 => 'WinZip JPEG Compression',
+         97 => 'WavPack compressed data',
+         98 => 'PPMd version I, Rev 1',
+         99 => 'AES Encryption',
+     );
+
+my %OS_Lookup = (
+    0   => "MS-DOS",
+    1   => "Amiga",
+    2   => "OpenVMS",
+    3   => "Unix",
+    4   => "VM/CMS",
+    5   => "Atari ST",
+    6   => "HPFS (OS/2, NT 3.x)",
+    7   => "Macintosh",
+    8   => "Z-System",
+    9   => "CP/M",
+    10  => "Windoxs NTFS or TOPS-20",
+    11  => "MVS or NTFS",
+    12  => "VSE or SMS/QDOS",
+    13  => "Acorn RISC OS",
+    14  => "VFAT",
+    15  => "alternate MVS",
+    16  => "BeOS",
+    17  => "Tandem",
+    18  => "OS/400",
+    19  => "OS/X (Darwin)",
+    30  => "AtheOS/Syllable",
+    );
+
+
+my %Lookup = (
+    ZIP_LOCAL_HDR_SIG,             \&LocalHeader,
+    ZIP_DATA_HDR_SIG,              \&DataHeader,
+    ZIP_CENTRAL_HDR_SIG,           \&CentralHeader,
+    ZIP_END_CENTRAL_HDR_SIG,       \&EndCentralHeader,
+    ZIP64_END_CENTRAL_REC_HDR_SIG, \&Zip64EndCentralHeader,
+    ZIP64_END_CENTRAL_LOC_HDR_SIG, \&Zip64EndCentralLocator,
+    
+    # TODO - Archive Encryption Headers
+    #ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG
+);
+
+my %Extras = (
+      0x0001,  ['ZIP64', \&decode_Zip64],
+      0x0007,  ['AV Info', undef],
+      0x0008,  ['Extended Language Encoding', undef],
+      0x0009,  ['OS/2 extended attributes', undef],
+      0x000a,  ['NTFS FileTimes', \&decode_NTFS_Filetimes],
+      0x000c,  ['OpenVMS', undef],
+      0x000d,  ['Unix', undef],
+      0x000e,  ['Stream & Fork Descriptors', undef],
+      0x000f,  ['Patch Descriptor', undef],
+      0x0014,  ['PKCS#7 Store for X.509 Certificates', undef],
+      0x0015,  ['X.509 Certificate ID and Signature for individual file', undef],
+      0x0016,  ['X.509 Certificate ID for Central Directory', undef],
+      0x0017,  ['Strong Encryption Header', undef],
+      0x0018,  ['Record Management Controls', undef],
+      0x0019,  ['PKCS#7 Encryption Recipient Certificate List', undef],
+      
+
+      #The Header ID mappings defined by Info-ZIP and third parties are:
+
+      0x0065,  ['IBM S/390 attributes - uncompressed', undef],
+      0x0066,  ['IBM S/390 attributes - compressed', undef],
+      0x07c8,  ['Info-ZIP Macintosh (old, J. Lee)', undef],
+      0x2605,  ['ZipIt Macintosh (first version)', undef],
+      0x2705,  ['ZipIt Macintosh v 1.3.5 and newer (w/o full filename)', undef],
+      0x2805,  ['ZipIt Macintosh v 1.3.5 and newer ', undef],
+      0x334d,  ["Info-ZIP Macintosh (new, D. Haase's 'Mac3' field)", undef],
+      0x4154,  ['Tandem NSK', undef],
+      0x4341,  ['Acorn/SparkFS (David Pilling)', undef],
+      0x4453,  ['Windows NT security descriptor', \&decode_NT_security],
+      0x4690,  ['POSZIP 4690', undef],
+      0x4704,  ['VM/CMS', undef],
+      0x470f,  ['MVS', undef],
+      0x4854,  ['Theos, old inofficial port', undef],
+      0x4b46,  ['FWKCS MD5 (see below)', undef],
+      0x4c41,  ['OS/2 access control list (text ACL)', undef],
+      0x4d49,  ['Info-ZIP OpenVMS (obsolete)', undef],
+      0x4d63,  ['Macintosh SmartZIP, by Macro Bambini', undef],
+      0x4f4c,  ['Xceed original location extra field', undef],
+      0x5356,  ['AOS/VS (binary ACL)', undef],
+      0x5455,  ['Extended Timestamp', \&decode_UT],
+      0x554e,  ['Xceed unicode extra field', \&decode_Xceed_unicode],
+      0x5855,  ['Info-ZIP Unix (original; also OS/2, NT, etc.)', \&decode_UX],
+      0x5a4c,  ['ZipArchive Unicode Filename', undef],
+      0x5a4d,  ['ZipArchive Offsets Array', undef],
+      0x6375,  ["Info-ZIP Unicode Comment", \&decode_up ],
+      0x6542,  ['BeOS (BeBox, PowerMac, etc.)', undef],
+      0x6854,  ['Theos', undef],
+      0x7075,  ["Info-ZIP Unicode Path", \&decode_up ],
+      0x756e,  ['ASi Unix', undef],
+      0x7441,  ['AtheOS (AtheOS/Syllable attributes)', undef],
+      0x7855,  ["Unix Extra type 2", \&decode_Ux],
+      0x7875,  ["Unix Extra Type 3", \&decode_ux],
+      0x9901,  ['AES Encryption', \&decode_AES],
+      0xA220,  ["Microsoft Microsoft Open Packaging Growth Hint", undef ],
+      0xCAFE,  ["Java Executable", \&decode_Java_exe],
+      0xfb4a,  ['SMS/QDOS', undef],
+
+       );
+
+my $VERSION = "1.04" ;
+
+my $FH;
+
+my $ZIP64 = 0 ;
+my $NIBBLES = 8;
+my $LocalHeaderCount = 0;
+my $CentralHeaderCount = 0;
+
+my $START;
+my $OFFSET = new U64 0;
+my $TRAILING = 0 ;
+
+sub prOff
+{
+    my $offset = shift;
+    my $s = offset($OFFSET);
+    $OFFSET->add($offset);
+    return $s;
+}
+
+sub offset
+{
+    my $v = shift ;
+
+    if (ref $v eq 'U64') {
+        my $hi = $v->getHigh();
+        my $lo = $v->getLow();
+
+        if ($hi)
+        {
+            my $hiNib = $NIBBLES - 8 ;
+            sprintf("%0${hiNib}X", $hi) .
+            sprintf("%08X", $lo);
+        }
+        else
+        {
+            sprintf("%0${NIBBLES}X", $lo);
+        }
+    }
+    else {
+        sprintf("%0${NIBBLES}X", $v);
+    }
+
+}
+
+my ($OFF,  $LENGTH,  $CONTENT, $TEXT, $VALUE) ;
+
+my $FMT1 ;
+my $FMT2 ;
+
+sub setupFormat
+{
+    my $wantVerbose = shift ;
+    my $nibbles = shift;
+    
+    my $width = '@' . ('>' x ($nibbles -1));
+    my $space = " " x length($width);
+
+    my $fmt ;
+    
+    if ($wantVerbose) {
+        
+        $FMT1 = "
+        format STDOUT =
+$width $width ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF,     \$LENGTH,  \$CONTENT, \$TEXT,               \$VALUE
+$space $space ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+                    \$CONTENT, \$TEXT,               \$VALUE
+.                    
+";
+                    
+        $FMT2 = "
+        format STDOUT =
+$width $width ^<<<<<<<<<<<  ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF,     \$LENGTH,  \$CONTENT, \$TEXT,               \$VALUE
+$space $space ^<<<<<<<<<<<  ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+              \$CONTENT, \$TEXT,               \$VALUE
+.  " ;
+
+    }
+    else {
+
+        $FMT1 = "
+        format STDOUT =
+$width ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF,      \$TEXT,               \$VALUE
+$space ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+                    \$TEXT,               \$VALUE
+.
+";
+
+        $FMT2 = "
+    format STDOUT =
+$width   ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+\$OFF,     \$TEXT,               \$VALUE
+$space   ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
+                    \$TEXT,               \$VALUE
+.
+" ;
+    }
+
+    eval "$FMT1";
+    
+    $| = 1;
+
+}
+
+sub mySpr
+{    
+    my $format = shift ;
+    
+    return "" if ! defined $format;
+    return $format unless @_ ;
+    return sprintf $format, @_ ;
+}
+
+sub out0
+{
+    my $size = shift;
+    my $text = shift;
+    my $format = shift;
+    
+    $OFF     = prOff($size);
+    $LENGTH  = offset($size) ;
+    $CONTENT = '...';
+    $TEXT    = $text;
+    $VALUE   = mySpr $format,  @_;
+       
+    write;
+
+    skip($FH, $size);
+}
+
+sub xDump
+{
+    my $input = shift;
+
+    $input =~ tr/\0-\37\177-\377/./;
+    return $input;
+}
+
+sub hexDump
+{
+    my $input = shift;
+
+    my $out = unpack('H*', $input) ;   
+    $out =~ s#(..)# $1#g ;
+    $out =~ s/^ //;
+    $out = uc $out;  
+
+    return $out;
+}
+
+sub out
+{
+    my $data = shift;
+    my $text = shift;
+    my $format = shift;
+    
+    my $size = length($data) ;
+
+    $OFF     = prOff($size);
+    $LENGTH  = offset($size) ;
+    $CONTENT = hexDump($data);
+    $TEXT    = $text;
+    $VALUE   = mySpr $format,  @_;
+       
+    write;
+}
+
+sub out1
+{
+    my $text = shift;
+    my $format = shift;
+      
+    $OFF     = '';
+    $LENGTH  = '' ;
+    $CONTENT = '';
+    $TEXT    = $text;    
+    $VALUE   = mySpr $format,  @_; 
+
+    write;
+}
+
+sub out2
+{
+    my $data = shift ;
+    my $text = shift ;
+    my $format = shift;
+      
+    my $size = length($data) ;
+    $OFF     = prOff($size);
+    $LENGTH  = offset($size);
+    $CONTENT = hexDump($data);
+    $TEXT    = $text;    
+    $VALUE   = mySpr $format,  @_; 
+
+    no warnings;
+    eval "$FMT2";
+    write ;
+    eval "$FMT1";
+}
+
+sub Value
+{
+    my $letter = shift;
+    my @value = @_;
+
+    if ($letter eq 'C')
+      { return Value_C(@value) }
+    elsif ($letter eq 'v')
+      { return Value_v(@value) }
+    elsif ($letter eq 'V')
+      { return Value_V(@value) }
+    elsif ($letter eq 'VV')
+      { return Value_VV(@value) }
+}
+
+sub outer
+{
+    my $name = shift ;
+    my $unpack = shift ;
+    my $size = shift ;
+    my $cb1  = shift ;
+    my $cb2  = shift ;
+
+
+    myRead(my $buff, $size);    
+    my (@value) = unpack $unpack, $buff;
+    my $hex = Value($unpack,  @value);
+
+    if (defined $cb1) {
+        my $v ;
+        if (ref $cb1 eq 'CODE') {
+            $v = $cb1->(@value) ;
+        }
+        else {
+            $v = $cb1 ;
+        }
+
+        $v = "'" . $v unless $v =~ /^'/;
+        $v .= "'"  unless $v =~ /'$/;
+        $hex .= " $v" ;
+    }
+
+    out $buff, $name, $hex ;
+
+    $cb2->(@value)
+        if defined $cb2 ;
+    
+    return $value[0];
+}
+
+sub out_C
+{
+    my $name = shift ;
+    my $cb1  = shift ;
+    my $cb2  = shift ;
+
+    outer($name, 'C', 1, $cb1, $cb2);
+}
+
+sub out_v
+{
+    my $name = shift ;
+    my $cb1  = shift ;
+    my $cb2  = shift ;
+
+    outer($name, 'v', 2, $cb1, $cb2);
+}
+
+sub out_V
+{
+    my $name = shift ;
+    my $cb1  = shift ;
+    my $cb2  = shift ;
+
+    outer($name, 'V', 4, $cb1, $cb2);
+}
+
+sub out_VV
+{
+    my $name = shift ;
+    my $cb1  = shift ;
+    my $cb2  = shift ;
+
+    outer($name, 'VV', 8, $cb1, $cb2);
+}
+
+sub outSomeData
+{
+    my $size = shift;
+    my $message = shift;
+
+    my $size32 = $size;
+    if (ref $size eq 'U64') {
+        $size32 = $size->getLow();
+    }
+
+    if ($size > 0) {
+        if ($size > 64) {
+            out0 $size, $message;
+        } else {
+            myRead(my $buffer, $size32 );
+            out $buffer, $message, xDump $buffer ;
+        }
+    }
+}
+
+sub unpackValue_C
+{
+    Value_v(unpack "C", $_[0]);
+}
+
+sub Value_C
+{
+    sprintf "%02X", $_[0];
+}
+
+
+sub unpackValue_v
+{
+    Value_v(unpack "v", $_[0]);
+}
+
+sub Value_v
+{
+    sprintf "%04X", $_[0];
+}
+
+sub unpackValue_V
+{
+    Value_V(unpack "V", $_[0]);
+}
+
+sub Value_V
+{
+    my $v = defined $_[0] ? $_[0] : 0;
+    sprintf "%08X", $v;
+}
+
+sub unpackValue_VV
+{
+    my ($lo, $hi) = unpack ("V V", $_[0]);
+    Value_VV($lo, $hi);
+}
+
+sub Value_U64
+{
+    my $u64 = shift ;
+    Value_VV($u64->getLow(), $u64->getHigh());
+}
+
+sub Value_VV
+{
+    my $lo = defined $_[0] ? $_[0] : 0;
+    my $hi = defined $_[1] ? $_[1] : 0;
+
+    if ($hi == 0)
+    {
+        sprintf "%016X", $lo;
+    }
+    else
+    {
+        sprintf("%08X", $hi) .
+        sprintf "%08X", $lo;
+    }
+}
+
+sub Value_VV64
+{
+    my $buffer = shift;
+
+    my ($lo, $hi) = unpack ("V V" , $buffer);
+    no warnings 'uninitialized';
+    return $hi * (0xFFFFFFFF+1) + $lo;
+}
+
+sub read_U64
+{
+    my $b ;
+    myRead($b, 8);    
+    my ($lo, $hi) = unpack ("V V" , $b);
+    no warnings 'uninitialized';
+    return ($b, new U64 $hi, $lo);
+}
+
+sub read_VV
+{
+    my $b ;
+    myRead($b, 8);    
+    my ($lo, $hi) = unpack ("V V" , $b);
+    no warnings 'uninitialized';
+    return ($b, $hi * (0xFFFFFFFF+1) + $lo);
+}
+
+sub read_V
+{
+    my $b ;
+    myRead($b, 4);
+    return ($b, unpack ("V", $b));
+}
+
+sub read_v
+{
+    my $b ;
+    myRead($b, 2);
+    return ($b, unpack "v", $b);
+}
+
+
+sub read_C
+{
+    my $b ;
+    myRead($b, 1);
+    return ($b, unpack "C", $b);
+}
+
+
+my $opt_verbose = 0;
+while (@ARGV && $ARGV[0] =~ /^-/)
+{
+    my $opt = shift;
+    
+    if ($opt =~ /^-h/i)
+    {
+        Usage();
+        exit;
+    }
+    elsif ($opt =~ /^-v/i)
+    {
+        $opt_verbose = 1;
+    }
+    else {
+        Usage();
+    }
+}
+
+Usage() unless @ARGV == 1;
+
+my $filename = shift @ARGV;
+
+die "$filename does not exist\n"
+    unless -e $filename ;
+
+die "$filename not a standard file\n"
+    unless -f $filename ;
+
+$FH = new IO::File "<$filename"
+    or die "Cannot open $filename: $!\n";
+
+
+my $FILELEN = -s $filename ;    
+$TRAILING = -s $filename ;    
+$NIBBLES = U64::nibbles(-s $filename) ; 
+#$NIBBLES = int ($NIBBLES / 4) + ( ($NIBBLES % 4) ? 1 : 0 );
+#$NIBBLES = 4 * $NIBBLES;
+# Minimum of 4 nibbles
+$NIBBLES = 4 if $NIBBLES < 4 ;
+
+die "$filename too short to be a zip file\n"
+    if $FILELEN <  100 ;
+
+setupFormat($opt_verbose, $NIBBLES);
+
+if(0)
+{
+    # Sanity check that this is a Zip file
+    my ($buffer, $signature) = read_V();
+
+    warn "$filename doesn't look like a zip file\n"
+        if $signature != ZIP_LOCAL_HDR_SIG ;
+    $FH->seek(0, SEEK_SET) ;
+}
+
+
+our  @CentralDirectory = scanCentralDirectory($FH);
+die "No Central Directory found\n"
+    if ! @CentralDirectory ;
+
+$OFFSET->reset();
+$FH->seek(0, SEEK_SET) ;
+
+outSomeData($START, "PREFIX DATA")
+    if defined $START && $START > 0 ;
+
+while (1)
+{
+    last if $FH->eof();
+
+    if ($FH->tell() >= $TRAILING) {
+        print "\n" ;
+        outSomeData($FILELEN - $TRAILING, "TRAILING DATA");
+        last;
+
+    }
+
+    my ($buffer, $signature) = read_V();
+
+    my $handler = $Lookup{$signature};
+
+    if (!defined $handler)
+    {
+        my $offset = $FH->tell() - 4;
+        printf "\n\nUnexpecded END at offset %08X, value %s\n", $offset, Value_V($signature);
+        last;        
+    }
+
+    $ZIP64 = 0 if $signature != ZIP_DATA_HDR_SIG ;
+    $handler->($signature, $buffer);
+}
+
+print "Done\n";
+
+exit ;
+
+sub compressionMethod
+{
+    my $id = shift ;
+    Value_v($id) . " '" . ($ZIP_CompressionMethods{$id} || "Unknown Method") . "'" ;
+}
+
+sub LocalHeader
+{
+    my $signature = shift ;  
+    my $data = shift ;  
+        
+    print "\n";
+    ++ $LocalHeaderCount;
+    out $data, "LOCAL HEADER #" . sprintf("%X", $LocalHeaderCount) , Value_V($signature);
+
+    my $buffer;
+
+    my ($loc, $CDcompressedLength) = @{ shift @CentralDirectory };
+    # TODO - add test to check that the loc from central header matches
+
+    out_C  "Extract Zip Spec", \&decodeZipVer;
+    out_C  "Extract OS", \&decodeOS;
+
+    my ($bgp, $gpFlag) = read_v();
+    my ($bcm, $compressedMethod) = read_v();
+
+    out $bgp, "General Purpose Flag", Value_v($gpFlag) ;
+    GeneralPurposeBits($compressedMethod, $gpFlag);    
+
+    out $bcm, "Compression Method",   compressionMethod($compressedMethod) ;
+
+    out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) };
+
+    my $crc                = out_V "CRC";
+    my $compressedLength   = out_V "Compressed Length";
+    my $uncompressedLength = out_V "Uncompressed Length";
+    my $filenameLength     = out_v "Filename Length";
+    my $extraLength        = out_v "Extra Length";
+
+    my $filename ;
+    myRead($filename, $filenameLength);
+    out $filename, "Filename",  "'". $filename . "'";
+
+    my $cl64 = new U64 $compressedLength ;
+    my %ExtraContext = ();
+    if ($extraLength)
+    {
+        my @z64 = ($uncompressedLength, $compressedLength, 1, 1);
+        $ExtraContext{Zip64} = \@z64 ;
+        $ExtraContext{InCentralDir} = 0;
+        walkExtra($extraLength, \%ExtraContext);
+    }
+
+    my $size = 0;
+    $size = printAes(\%ExtraContext)
+        if $compressedMethod == 99 ;
+
+    $size += printLzmaProperties()
+        if $compressedMethod == ZIP_CM_LZMA ;
+
+    $CDcompressedLength->subtract($size)
+        if $size ;
+        
+    if ($CDcompressedLength->getHigh() || $CDcompressedLength->getLow()) {
+        outSomeData($CDcompressedLength, "PAYLOAD") ;
+    }
+
+    if ($compressedMethod == 99) {
+        my $auth ;
+        myRead($auth, 10);
+        out $auth, "AES Auth",  hexDump($auth);
+    }
+}
+
+
+sub CentralHeader
+{
+    my $signature = shift ;
+    my $data = shift ;  
+        
+    ++ $CentralHeaderCount;
+    print "\n";
+    out $data, "CENTRAL HEADER #" . sprintf("%X", $CentralHeaderCount) . "", Value_V($signature);
+    my $buffer;
+
+    out_C "Created Zip Spec", \&decodeZipVer;
+    out_C "Created OS", \&decodeOS;
+    out_C  "Extract Zip Spec", \&decodeZipVer;
+    out_C  "Extract OS", \&decodeOS;
+
+    my ($bgp, $gpFlag) = read_v();
+    my ($bcm, $compressedMethod) = read_v();
+
+    out $bgp, "General Purpose Flag", Value_v($gpFlag) ;
+    GeneralPurposeBits($compressedMethod, $gpFlag);    
+
+    out $bcm, "Compression Method", compressionMethod($compressedMethod) ;
+
+    out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) };
+
+    my $crc                = out_V "CRC";
+    my $compressedLength   = out_V "Compressed Length";
+    my $uncompressedLength = out_V "Uncompressed Length";
+    my $filenameLength     = out_v "Filename Length";
+    my $extraLength        = out_v "Extra Length";
+    my $comment_length     = out_v "Comment Length";
+    my $disk_start         = out_v "Disk Start";
+    my $int_file_attrib    = out_v "Int File Attributes";
+
+    out1 "[Bit 0]",  $int_file_attrib & 1 ? "1 Text Data" : "0 'Binary Data'";
+
+    my $ext_file_attrib    = out_V "Ext File Attributes";
+    out1 "[Bit 0]",  "Read-Only" 
+        if $ext_file_attrib & 0x01 ;
+    out1 "[Bit 1]",  "Hidden" 
+        if $ext_file_attrib & 0x02 ;
+    out1 "[Bit 2]",  "System" 
+        if $ext_file_attrib & 0x04 ;
+    out1 "[Bit 3]",  "Label" 
+        if $ext_file_attrib & 0x08 ;
+    out1 "[Bit 4]",  "Directory" 
+        if $ext_file_attrib & 0x10 ;
+    out1 "[Bit 5]",  "Archive" 
+        if $ext_file_attrib & 0x20 ;
+
+    my $lcl_hdr_offset     = out_V "Local Header Offset";
+
+    my $filename ;
+    myRead($filename, $filenameLength);
+    out $filename, "Filename",  "'". $filename . "'";
+
+    my %ExtraContext = ();
+    if ($extraLength)
+    {
+        my @z64 = ($uncompressedLength, $compressedLength, $lcl_hdr_offset, $disk_start);
+        $ExtraContext{Zip64} = \@z64 ;
+        $ExtraContext{InCentralDir} = 1;
+        walkExtra($extraLength, \%ExtraContext);        
+    }
+
+    if ($comment_length)
+    {
+        my $comment ;
+        myRead($comment, $comment_length);
+        out $comment, "Comment",  "'". $comment . "'";
+    }
+}
+
+sub decodeZipVer
+{
+    my $ver = shift ;
+    
+    my $sHi = int($ver /10) ;
+    my $sLo = $ver % 10 ;
+    
+    #out1 "Zip Spec", "$sHi.$sLo";       
+    "$sHi.$sLo";       
+}
+
+sub decodeOS
+{
+    my $ver = shift ;
+    
+    $OS_Lookup{$ver} || "Unknown" ;
+}
+
+sub Zip64EndCentralHeader
+{
+    my $signature = shift ;    
+    my $data = shift ;  
+
+    print "\n";
+    out $data, "ZIP64 END CENTRAL DIR RECORD", Value_V($signature);
+
+    my $buff;
+    myRead($buff, 8);
+
+    out $buff, "Size of record",       unpackValue_VV($buff);    
+
+    my $size  = Value_VV64($buff);
+
+    out_C  "Created Zip Spec", \&decodeZipVer;
+    out_C  "Created OS", \&decodeOS;
+    out_C  "Extract Zip Spec", \&decodeZipVer;
+    out_C  "Extract OS", \&decodeOS;
+    out_V  "Number of this disk";
+    out_V  "Central Dir Disk no";
+    out_VV "Entries in this disk";
+    out_VV "Total Entries";
+    out_VV "Size of Central Dir";
+    out_VV "Offset to Central dir";
+
+    # TODO - 
+    die "Unsupported Size ($size) in Zip64EndCentralHeader\n" 
+        if $size !=  44;
+}
+
+
+sub Zip64EndCentralLocator
+{
+    my $signature = shift ;
+    my $data = shift ;  
+        
+    print "\n";
+    out $data, "ZIP64 END CENTRAL DIR LOCATOR", Value_V($signature);
+    
+    out_V  "Central Dir Disk no";
+    out_VV "Offset to Central dir";
+    out_V  "Total no of Disks";    
+}
+
+sub EndCentralHeader
+{
+    my $signature = shift ;  
+    my $data = shift ;  
+        
+    print "\n";
+    out $data, "END CENTRAL HEADER", Value_V($signature);
+
+    out_v "Number of this disk";
+    out_v "Central Dir Disk no";
+    out_v "Entries in this disk";
+    out_v "Total Entries";
+    out_V "Size of Central Dir";
+    out_V "Offset to Central Dir";
+    my $comment_length = out_v "Comment Length";
+
+    if ($comment_length)
+    {
+        my $comment ;        
+        myRead($comment, $comment_length);
+        out $comment, "Comment", "'$comment'";
+    }    
+}
+
+sub DataHeader
+{
+    my $signature = shift ;  
+    my $data = shift ;  
+        
+    print "\n";
+    out $data, "STREAMING DATA HEADER", Value_V($signature);
+    
+    out_V "CRC";
+    
+    if ($ZIP64)
+    {
+        out_VV "Compressed Length" ;
+        out_VV "Uncompressed Length" ;        
+    }
+    else
+    {
+        out_V "Compressed Length" ;
+        out_V "Uncompressed Length" ;  
+    }
+}
+
+
+sub GeneralPurposeBits
+{
+    my $method = shift;
+    my $gp = shift;
+
+    out1 "[Bit  0]", "1 'Encryption'" if $gp & ZIP_GP_FLAG_ENCRYPTED_MASK;   
+    
+    my %lookup = (
+        0 =>    "Normal Compression",
+        1 =>    "Maximum Compression",
+        2 =>    "Fast Compression",
+        3 =>    "Super Fast Compression");
+
+
+    if ($method == ZIP_CM_DEFLATE)
+    {
+        my $mid = $gp & 0x03;
+        
+        out1 "[Bits 1-2]", "$mid '$lookup{$mid}'";        
+    }
+
+    if ($method == ZIP_CM_LZMA)
+    {
+        if ($gp & ZIP_GP_FLAG_LZMA_EOS_PRESENT) {
+            out1 "[Bit 1]", "1 'LZMA EOS Marker Present'" ;
+        }
+        else {
+            out1 "[Bit 1]", "0 'LZMA EOS Marker Not Present'" ;
+        }
+    }
+    
+    if ($method == ZIP_CM_IMPLODE) # Imploding
+    {
+        out1 "[Bit 1]", ($gp & 1 ? "1 '8k" : "0 '4k") . " Sliding Dictionary'" ;
+        out1 "[Bit 2]", ($gp & 2 ? "1 '3" : "0 '2"  ) . " Shannon-Fano
+        Trees'" ;
+    }    
+    
+    out1 "[Bit  3]", "1 'Streamed'"           if $gp & ZIP_GP_FLAG_STREAMING_MASK;
+    out1 "[Bit  4]", "1 'Enhanced Deflating'" if $gp & 1 << 4;
+    out1 "[Bit  5]", "1 'Compressed Patched'" if $gp & 1 << 5 ;
+    out1 "[Bit  6]", "1 'Strong Encryption'"  if $gp & ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK;
+    out1 "[Bit 11]", "1 'Language Encoding'"  if $gp & ZIP_GP_FLAG_LANGUAGE_ENCODING;  
+    out1 "[Bit 12]", "1 'Pkware Enhanced Compression'"  if $gp & 1 <<12 ; 
+    out1 "[Bit 13]", "1 'Encrypted Central Dir'"  if $gp & 1 <<13 ; 
+    
+    return ();    
+}
+
+
+
+
+sub skip
+{
+    my $fh = $_[0] ;
+    my $size = $_[1];
+
+    use Fcntl qw(SEEK_CUR);
+    if (ref $size eq 'U64') {
+        seek($fh, $size->get64bit(), SEEK_CUR);
+    }
+    else {
+        seek($fh, $size, SEEK_CUR);
+    }
+    
+}
+
+
+sub myRead
+{
+    my $got = \$_[0] ;
+    my $size = $_[1];
+
+    my $wantSize = $size;
+    $$got = '';
+
+    if ($size == 0)
+    {
+        return ;
+    }
+
+    if ($size > 0)
+    {
+        my $buff ;
+        my $status = $FH->read($buff, $size);
+        return $status
+            if $status < 0;
+        $$got .= $buff ;
+    }
+
+    my $len = length $$got;
+    die "Truncated file (got $len, wanted $wantSize): $!\n"
+        if length $$got != $wantSize;
+}
+
+
+
+
+sub walkExtra
+{
+    my $XLEN = shift;
+    my $context = shift; 
+
+    my $buff ;
+    my $offset = 0 ;
+    
+    my $id;
+    my $subLen;
+    my $payload ;
+    
+    my $count = 0 ;
+    
+    while ($offset < $XLEN) {
+
+        ++ $count;
+        
+        return undef
+            if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE  > $XLEN ;
+
+        myRead($id, ZIP_EXTRA_SUBFIELD_ID_SIZE); 
+        $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;
+        my $lookID = unpack "v", $id ;
+        my ($who, $decoder) =  @{ defined $Extras{$lookID} ? $Extras{$lookID} : ['', undef] };
+        #my ($who, $decoder) =  @{ $Extras{unpack "v", $id} || ['', undef] };
+        
+        $who = "$id: $who"
+            if $id =~ /\w\w/ ;
+
+        $who = "'$who'";    
+        out $id, "Extra ID #" . Value_v($count), unpackValue_v($id) . " $who" ;
+        
+        myRead($buff, ZIP_EXTRA_SUBFIELD_LEN_SIZE); 
+        $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE;        
+        
+        $subLen =  unpack("v", $buff);
+        out2 $buff, "Length", Value_v($subLen) ;
+
+        return undef
+            if $offset + $subLen > $XLEN ;
+
+        if (! defined $decoder)
+        {
+            myRead($payload, $subLen);
+            my $data = hexDump($payload);
+        
+            out2 $payload, "Extra Payload", $data;
+        }
+        else
+        {
+            $decoder->($subLen, $context) ;
+        }
+               
+        $offset += $subLen ;
+    }
+        
+    return undef ;
+}
+
+
+sub full32 
+{
+    return $_[0] == 0xFFFFFFFF ;
+}
+
+sub decode_Zip64
+{
+    my $len = shift;
+    my $context = shift;
+    
+    my $z64Data = $context->{Zip64};    
+
+    $ZIP64 = 1;
+
+    if (full32 $z64Data->[0] ) {
+        out_VV "  Uncompressed Size";
+    }
+
+    if (full32 $z64Data->[1] ) {
+        out_VV "  Compressed Size";
+    }
+
+    if (full32 $z64Data->[2] ) {
+        out_VV "  Offset to Central Dir";        
+    }
+
+    if ($z64Data->[3] == 0xFFFF ) {
+        out_V "  Disk Number";        
+    }
+}
+
+sub Ntfs2Unix
+{
+    my $v = shift;
+    my $u64 = shift;
+
+    # NTFS offset is 19DB1DED53E8000
+
+    my $hex = Value_U64($u64) ;
+    my $NTFS_OFFSET = new U64 0x19DB1DE, 0xD53E8000 ;
+    $u64->subtract($NTFS_OFFSET);
+    my $elapse = $u64->get64bit();
+    my $ns = ($elapse % 10000000) * 100;
+    $elapse = int ($elapse/10000000);
+    return "$hex '" . localtime($elapse) . 
+           " " . sprintf("%0dns'", $ns);
+}
+
+sub decode_NTFS_Filetimes
+{
+    my $len = shift;
+    my $context = shift;
+
+    out_V "  Reserved";
+    out_v "  Tag1";
+    out_v "  Size1" ;
+    
+    my ($m, $s1) = read_U64;
+    out $m, "  Mtime", Ntfs2Unix($m, $s1);
+
+    my ($c, $s2) = read_U64;
+    out $c, "  Ctime", Ntfs2Unix($m, $s2);
+
+    my ($a, $s3) = read_U64;
+    out $m, "  Atime", Ntfs2Unix($m, $s3);
+}
+
+sub getTime
+{
+    my $time = shift ;
+
+    return "'" . localtime($time) . "'" ;
+}
+
+sub decode_UT
+{
+    my $len = shift;
+    my $context = shift;
+        
+    my ($data, $flags) = read_C();
+
+    my $f = Value_C $flags;
+    $f .= " mod"    if $flags & 1;
+    $f .= " access" if $flags & 2;
+    $f .= " change" if $flags & 4;
+    
+    out $data, "  Flags", "'$f'";
+    
+    -- $len;
+    
+    if ($flags & 1)
+    {
+        my ($data, $time) = read_V();
+
+        out2 $data, "Mod Time",    Value_V($time) . " " . getTime($time) ;
+        
+        $len -= 4 ;
+    }
+
+
+      if ($flags & 2 && $len > 0 )
+      {
+          my ($data, $time) = read_V();
+  
+          out2 $data, "Access Time",    Value_V($time) . " " . getTime($time) ;
+          $len -= 4 ;
+      }
+  
+      if ($flags & 4 && $len > 0)
+      {
+          my ($data, $time) = read_V();
+  
+          out2 $data, "Change Time",    Value_V($time) . " " . getTime($time) ;
+      }
+}
+
+
+
+sub decode_AES
+{
+    my $len = shift;
+    my $context = shift;
+
+    return if $len == 0 ;
+    
+    my %lookup = ( 1 => "AE-1", 2 => "AE-2");
+    out_v "  Vendor Version", sub {  $lookup{$_[0]} || "Unknown"  } ;
+    
+    my $id ; 
+    myRead($id, 2);
+    out $id, "  Vendor ID", unpackValue_v($id) . " '$id'";
+    
+    my %strengths = (1 => "128-bit encryption key",
+                     2 => "192-bit encryption key",
+                     3 => "256-bit encryption key",
+                    );
+    
+    my $strength = out_C "  Encryption Strength", sub {$strengths{$_[0]} || "Unknown" } ; 
+
+    my ($bmethod, $method) = read_v();
+    out $bmethod, "  Compression Method", compressionMethod($method) ;
+
+    $context->{AesStrength} = $strength ;     
+}
+
+sub decode_UX
+{
+    my $len = shift;
+    my $context = shift;
+    my $inCentralHdr = $context->{InCentralDir} ;
+
+    return if $len == 0 ;    
+
+    my ($data, $time) = read_V();
+    out2 $data, "Access Time",    Value_V($time) . " " . getTime($time) ;
+
+    ($data, $time) = read_V();
+    out2 $data, "Mod Time",    Value_V($time) . " " . getTime($time) ;
+
+    if (! $inCentralHdr ) {
+        out_v "  UID" ;
+        out_v "  GID";    
+    }
+}
+
+sub decode_Ux
+{
+    my $len = shift;
+    my $context = shift;
+
+    return if $len == 0 ;    
+    out_v "  UID" ;
+    out_v "  GID";    
+}
+
+sub decodeLitteEndian
+{
+    my $value = shift ;
+
+    if (length $value == 4)
+    {
+        return Value_V unpack ("V", $value)
+    }
+    else {
+        # TODO - fix this
+        die "unsupported\n";
+    }
+
+    my $got = 0 ;
+    my $shift = 0;
+
+    #hexDump 
+    #reverse
+    #my @a =unpack "C*", $value;
+    #@a = reverse @a;
+    #hexDump(@a);
+
+    for (reverse unpack "C*", $value)
+    {
+        $got = ($got << 8) + $_ ;
+    }
+    
+    return $got ;
+}
+
+sub decode_ux
+{
+    my $len = shift;
+    my $context = shift;
+
+    return if $len == 0 ;    
+    out_C "  Version" ;
+    my $uidSize = out_C "  UID Size";    
+    myRead(my $data, $uidSize);
+    out2 $data, "UID", decodeLitteEndian($data);
+
+    my $gidSize = out_C "  GID Size";    
+    myRead($data, $gidSize);
+    out2 $data, "GID", decodeLitteEndian($data);
+    
+}
+
+sub decode_Java_exe
+{
+    my $len = shift;
+    my $context = shift;
+
+}
+
+sub decode_up
+{
+    my $len = shift;
+    my $context = shift;
+
+    
+    out_C "  Version";
+    out_V "  NameCRC32";
+    
+    myRead(my $data, $len - 5);
+    
+    out $data, "  UnicodeName", $data;     
+}
+
+sub decode_Xceed_unicode
+{
+    my $len = shift;
+    my $context = shift;
+
+    my $data ;
+    
+    # guess the fields used for this one
+    myRead($data, 4);
+    out $data, "  ID", $data;     
+
+    out_v "  Length";
+    out_v "  Null";
+    
+    myRead($data, $len - 8);
+    
+    out $data, "  UTF16LE Name", decode("UTF16LE", $data);     
+}
+
+
+sub decode_NT_security
+{
+    my $len = shift;
+    my $context = shift;
+    my $inCentralHdr = $context->{InCentralDir} ;
+    
+    out_V "  Uncompressed Size" ;
+    
+    if (! $inCentralHdr) {
+  
+        out_C "  Version" ;
+     
+        out_v "  Type";  
+        
+        out_V "  NameCRC32" ;
+        
+        my $plen = $len - 4 - 1 - 2 - 4;        
+        myRead(my $payload, $plen);
+        out $plen, "  Extra Payload", hexDump($payload);
+    }
+}
+
+sub printAes
+{
+    my $context = shift ;
+
+    my %saltSize = (
+                        1 => 8,
+                        2 => 12,
+                        3 => 16,
+                    );
+
+    myRead(my $salt, $saltSize{$context->{AesStrength} });
+    out $salt, "AES Salt", hexDump($salt);
+    myRead(my $pwv, 2);
+    out $pwv, "AES Pwd Ver", hexDump($pwv);  
+
+    return  $saltSize{$context->{AesStrength}} + 2 + 10;
+}
+
+sub printLzmaProperties
+{
+    my $len = 0;
+
+    my $b1;
+    my $b2;
+    my $buffer;
+
+    myRead($b1, 2);
+    my ($verHi, $verLow) = unpack ("CC", $b1);
+
+    out $b1, "LZMA Version", sprintf("%02X%02X", $verHi, $verLow) . " '$verHi.$verLow'";
+    my $LzmaPropertiesSize = out_v "LZMA Properties Size";
+    $len += 4;
+
+    my $LzmaInfo = out_C "LZMA Info",  sub { $_[0] == 93 ? "(Default)" : ""};
+
+    my $PosStateBits = 0;
+    my $LiteralPosStateBits = 0;
+    my $LiteralContextBits = 0;
+    $PosStateBits = int($LzmaInfo / (9 * 5));
+       $LzmaInfo -= $PosStateBits * 9 * 5;
+       $LiteralPosStateBits = int($LzmaInfo / 9);
+       $LiteralContextBits = $LzmaInfo - $LiteralPosStateBits * 9;
+
+    out1 "  PosStateBits",        $PosStateBits;
+    out1 "  LiteralPosStateBits", $LiteralPosStateBits;
+    out1 "  LiteralContextBits",  $LiteralContextBits;
+    
+    out_V "LZMA Dictionary Size";
+
+    # TODO - assumption that this is 5
+    $len += $LzmaPropertiesSize;
+
+    skip($FH, $LzmaPropertiesSize - 5)
+        if  $LzmaPropertiesSize != 5 ;
+
+    return $len;
+}
+
+sub scanCentralDirectory
+{
+    my $fh = shift;
+
+    my $here = $fh->tell();
+
+    # Use cases
+    # 1 32-bit CD
+    # 2 64-bit CD
+
+    my @CD = ();
+    my $offset = findCentralDirectoryOffset($fh);
+
+    return ()
+        if ! defined $offset;
+
+    $fh->seek($offset, SEEK_SET) ;
+
+    # Now walk the Central Directory Records
+    my $buffer ;
+    while ($fh->read($buffer, 46) == 46  && 
+           unpack("V", $buffer) == ZIP_CENTRAL_HDR_SIG) {
+
+        my $compressedLength   = unpack("V", substr($buffer, 20, 4));
+        my $uncompressedLength = unpack("V", substr($buffer, 24, 4));
+        my $filename_length    = unpack("v", substr($buffer, 28, 2));
+        my $extra_length       = unpack("v", substr($buffer, 30, 2));
+        my $comment_length     = unpack("v", substr($buffer, 32, 2));
+        my $locHeaderOffset    = unpack("V", substr($buffer, 42, 4));
+
+        $START = $locHeaderOffset
+            if ! defined $START;
+
+        skip($fh, $filename_length ) ;
+
+        my $v64 = new U64 $compressedLength ;
+        my $loc64 = new U64 $locHeaderOffset ;
+        my $got = [$loc64, $v64] ;
+
+        if (full32 $compressedLength || full32  $locHeaderOffset) {
+            $fh->read($buffer, $extra_length) ;
+            # TODO - fix this
+            die "xxx $offset $comment_length $filename_length $extra_length" . length($buffer) 
+                if length($buffer) != $extra_length;
+            $got = get64Extra($buffer, full32($uncompressedLength),
+                                 $v64,
+                                 $loc64);
+
+            # If not Zip64 extra field, assume size is 0xFFFFFFFF
+            #$v64 = $got if defined $got;
+        }
+        else {
+            skip($fh, $extra_length) ;
+        }
+
+        skip($fh, $comment_length ) ;
+            
+        push @CD, $got ;
+    }
+
+    $fh->seek($here, SEEK_SET) ;
+
+    @CD = sort { $a->[0]->cmp($b->[0]) } @CD ;
+    return @CD;
+}
+
+sub get64Extra
+{
+    my $buffer = shift;
+    my $is_uncomp = shift ;
+    my $comp = shift ;
+    my $loc = shift ;
+
+    my $extra = findID(0x0001, $buffer);
+                                            
+    if ( defined $extra)
+    {
+        my $offset = 0;
+        $offset += 8 if $is_uncomp;
+        if ($comp->max32()) {
+            $comp = U64::newUnpack_V64(substr($extra,  $offset)) ;
+            $offset += 8;
+        }
+        if ($loc->max32()) {
+            $loc = U64::newUnpack_V64(substr($extra,  $offset)) ;
+        }
+    }    
+
+    return [$loc, $comp] ;
+}
+
+sub offsetFromZip64
+{
+    my $fh = shift ;
+    my $here = shift;
+
+    $fh->seek($here - 20, SEEK_SET) 
+    # TODO - fix this
+        or die "xx $!" ;
+
+    my $buffer;
+    my $got = 0;
+    ($got = $fh->read($buffer, 20)) == 20 
+    # TODO - fix this
+        or die "xxx $here $got $!" ;
+
+    if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_LOC_HDR_SIG ) {
+        my $cd64 = Value_VV64 substr($buffer,  8, 8);
+       
+        $fh->seek($cd64, SEEK_SET) ;
+
+        $fh->read($buffer, 4) == 4
+        # TODO - fix this
+            or die "xxx" ;
+
+        if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_REC_HDR_SIG ) {
+
+            $fh->read($buffer, 8) ==  8
+            # TODO - fix this
+                or die "xxx" ;
+            my $size  = Value_VV64($buffer);
+            $fh->read($buffer, $size) ==  $size
+            # TODO - fix this
+                or die "xxx" ;
+
+            my $cd64 =  Value_VV64 substr($buffer,  36, 8);
+
+            return $cd64 ;
+        }
+        
+        # TODO - fix this
+        die "zzz";
+    }
+
+    # TODO - fix this
+    die "zzz";
+}
+
+use constant Pack_ZIP_END_CENTRAL_HDR_SIG => pack("V", ZIP_END_CENTRAL_HDR_SIG);
+
+sub findCentralDirectoryOffset
+{
+    my $fh = shift ;
+
+    # Most common use-case is where there is no comment, so
+    # know exactly where the end of central directory record
+    # should be.
+
+    $fh->seek(-22, SEEK_END) ;
+    my $here = $fh->tell();
+
+    my $buffer;
+    $fh->read($buffer, 22) == 22 
+    # TODO - fix this
+        or die "xxx" ;
+
+    my $zip64 = 0;                             
+    my $centralDirOffset ;
+    if ( unpack("V", $buffer) == ZIP_END_CENTRAL_HDR_SIG ) {
+        $centralDirOffset = unpack("V", substr($buffer, 16,  4));
+    }
+    else {
+        $fh->seek(0, SEEK_END) ;
+
+        my $fileLen = $fh->tell();
+        my $want = 0 ;
+
+        while(1) {
+            $want += 1024 * 32;
+            my $seekTo = $fileLen - $want;
+            if ($seekTo < 0 ) {
+                $seekTo = 0;
+                $want = $fileLen ;
+            }
+            $fh->seek( $seekTo, SEEK_SET) 
+            # TODO - fix this
+                or die "xxx $!" ;
+            my $got;
+            ($got = $fh->read($buffer, $want)) == $want
+            # TODO - fix this
+                or die "xxx $got  $!" ;
+            my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG);
+
+            if ($pos >= 0 && $want - $pos > 22) {
+                $here = $seekTo + $pos ;
+                $centralDirOffset = unpack("V", substr($buffer, $pos + 16,  4));
+                my $commentLength = unpack("V", substr($buffer, $pos + 20,  2));
+                $commentLength = 0 if ! defined $commentLength ;
+
+                my $expectedEof = $fileLen - $want + $pos + 22 + $commentLength  ;
+                # check for trailing data after end of zip
+                if ($expectedEof < $fileLen ) {
+                    $TRAILING = $expectedEof ;
+                }
+                last ;
+            }
+
+            return undef
+                if $want == $fileLen;
+        }
+    }
+
+    $centralDirOffset = offsetFromZip64($fh, $here)
+        if full32 $centralDirOffset ;
+
+    return $centralDirOffset ;
+}
+
+sub findID
+{
+    my $id_want = shift ;
+    my $data    = shift;
+
+    my $XLEN = length $data ;
+
+    my $offset = 0 ;
+    while ($offset < $XLEN) {
+
+        return undef
+            if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE  > $XLEN ;
+
+        my $id = substr($data, $offset, ZIP_EXTRA_SUBFIELD_ID_SIZE);    
+        $id = unpack("v", $id);
+        $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE;
+
+        my $subLen =  unpack("v", substr($data, $offset,
+                                            ZIP_EXTRA_SUBFIELD_LEN_SIZE));
+        $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE ;
+
+        return undef
+            if $offset + $subLen > $XLEN ;
+
+        return substr($data, $offset, $subLen)
+            if $id eq $id_want ;
+
+        $offset += $subLen ;
+    }
+        
+    return undef ;
+}
+
+
+sub _dosToUnixTime
+{
+    my $dt = shift;
+
+    my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
+    my $mon  = ( ( $dt >> 21 ) & 0x0f ) - 1;
+    my $mday = ( ( $dt >> 16 ) & 0x1f );
+
+    my $hour = ( ( $dt >> 11 ) & 0x1f );
+    my $min  = ( ( $dt >> 5 ) & 0x3f );
+    my $sec  = ( ( $dt << 1 ) & 0x3e );
+
+
+    use POSIX 'mktime';
+
+    my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+    return 0 if ! defined $time_t;
+    return $time_t;
+}
+
+
+{
+    package U64;
+
+    use constant MAX32 => 0xFFFFFFFF ;
+    use constant HI_1 => MAX32 + 1 ;
+    use constant LOW   => 0 ;
+    use constant HIGH  => 1;
+
+    sub new
+    {
+        my $class = shift ;
+
+        my $high = 0 ;
+        my $low  = 0 ;
+
+        if (@_ == 2) {
+            $high = shift ;
+            $low  = shift ;
+        }
+        elsif (@_ == 1) {
+            $low  = shift ;
+        }
+
+        bless [$low, $high], $class;
+    }
+
+    sub newUnpack_V64
+    {
+        my $string = shift;
+
+        my ($low, $hi) = unpack "V V", $string ;
+        bless [ $low, $hi ], "U64";
+    }
+
+    sub newUnpack_V32
+    {
+        my $string = shift;
+
+        my $low = unpack "V", $string ;
+        bless [ $low, 0 ], "U64";
+    }
+
+    sub reset
+    {
+        my $self = shift;
+        $self->[HIGH] = $self->[LOW] = 0;
+    }
+
+    sub clone
+    {
+        my $self = shift;
+        bless [ @$self ], ref $self ;
+    }
+
+    sub getHigh
+    {
+        my $self = shift;
+        return $self->[HIGH];
+    }
+
+    sub getLow
+    {
+        my $self = shift;
+        return $self->[LOW];
+    }
+
+    sub get32bit
+    {
+        my $self = shift;
+        return $self->[LOW];
+    }
+
+    sub get64bit
+    {
+        my $self = shift;
+        # Not using << here because the result will still be
+        # a 32-bit value on systems where int size is 32-bits
+        return $self->[HIGH] * HI_1 + $self->[LOW];
+    }
+
+    sub add
+    {
+        my $self = shift;
+        my $value = shift;
+
+        if (ref $value eq 'U64') {
+            $self->[HIGH] += $value->[HIGH] ;
+            $value = $value->[LOW];
+        }
+         
+        my $available = MAX32 - $self->[LOW] ;
+
+        if ($value > $available) {
+           ++ $self->[HIGH] ;
+           $self->[LOW] = $value - $available - 1;
+        }
+        else {
+           $self->[LOW] += $value ;
+        }
+
+    }
+
+    sub subtract
+    {
+        my $self = shift;
+        my $value = shift;
+
+        if (ref $value eq 'U64') {
+
+            if ($value->[HIGH]) {
+                die "unsupport subtract option"
+                    if $self->[HIGH] == 0 ||
+                       $value->[HIGH] > $self->[HIGH] ;
+
+               $self->[HIGH] -= $value->[HIGH] ;
+            }
+
+            $value = $value->[LOW] ;
+        }
+
+        if ($value > $self->[LOW]) {
+           -- $self->[HIGH] ;
+           $self->[LOW] = MAX32 - $value + $self->[LOW] + 1;
+        }
+        else {
+           $self->[LOW] -= $value;
+        }
+    }
+
+    sub rshift
+    {
+        my $self = shift;
+        my $count = shift;
+
+        for (1 .. $count)
+        {
+            $self->[LOW] >>= 1;
+            $self->[LOW] |= 0x80000000
+                if $self->[HIGH] & 1 ; 
+            $self->[HIGH] >>= 1;
+        }
+    }
+
+    sub equal
+    {
+        my $self = shift;
+        my $other = shift;
+
+        return $self->[LOW]  == $other->[LOW] &&
+               $self->[HIGH] == $other->[HIGH] ;
+    }
+
+    sub is64bit
+    {
+        my $self = shift;
+        return $self->[HIGH] > 0 ;
+    }
+
+    sub getPacked_V64
+    {
+        my $self = shift;
+
+        return pack "V V", @$self ;
+    }
+
+    sub getPacked_V32
+    {
+        my $self = shift;
+
+        return pack "V", $self->[LOW] ;
+    }
+
+    sub pack_V64
+    {
+        my $low  = shift;
+
+        return pack "V V", $low, 0;
+    }
+
+    sub max32
+    {
+        my $self = shift;
+        return $self->[HIGH] == 0 && $self->[LOW] == MAX32;
+    }
+    
+    sub cmp
+    {
+        my $self = shift;
+        my $other = shift ;
+
+        if ($self->[HIGH] == $other->[LOW]) {
+            return $self->[HIGH] - $other->[HIGH] ;
+        }
+        else {
+            return $self->[LOW] - $other->[LOW] ;
+        }
+    }
+    
+    sub nibbles
+    {
+        my @nibbles = (
+            [ 16 => HI_1 * 0x10000000 ],
+            [ 15 => HI_1 * 0x1000000 ],
+            [ 14 => HI_1 * 0x100000 ],
+            [ 13 => HI_1 * 0x10000 ],
+            [ 12 => HI_1 * 0x1000 ],
+            [ 11 => HI_1 * 0x100 ],
+            [ 10 => HI_1 * 0x10 ],
+            [  9 => HI_1 * 0x1 ],
+
+            [  8 => 0x10000000 ],
+            [  7 => 0x1000000 ],
+            [  6 => 0x100000 ],
+            [  5 => 0x10000 ],
+            [  4 => 0x1000 ],
+            [  3 => 0x100 ],
+            [  2 => 0x10 ],
+            [  1 => 0x1 ],
+        );
+        my $value = shift ;
+
+        for my $pair (@nibbles)
+        {
+            my ($count, $limit) = @{ $pair };
+
+            return $count
+                if $value >= $limit ;
+        }
+
+    }
+}
+
+sub Usage
+{
+    die <<EOM;
+zipdetails [OPTIONS] file
+
+Display details about the internal structure of a Zip file.
+
+This is zipdetails version $VERSION
+
+OPTIONS
+     -h     display help
+     -v     Verbose - output more stuff
+    
+Copyright (c) 2011 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+EOM
+
+        
+}
+
+__END__
+
+=head1 NAME
+
+zipdetails - display the internal structure of zip files
+
+=head1 SYNOPSIS
+
+    zipdetaile [-v] zipfile.zip
+       zipdetails -h
+
+=head1 DESCRIPTION
+
+Zipdetails displays information about the internal record structure of the
+zip file. It is not concerned with displaying any details of the compressed
+data stored in the zip file.
+
+The program assumes prior understanding of the internal structure of a Zip
+file. You should have a copy of the Zip APPNOTE file at hand to help
+understand the output from this program (L<SEE ALSO> for details).
+
+=head2 OPTIONS
+
+=over 5
+
+=item -v
+
+Enable Verbose mode
+
+=item -h
+
+Display help
+
+=back
+
+
+By default zipdetails will output the details of the zip file in three
+columns.
+
+=over 5
+
+=item Column 1
+
+This contains the offset from the start of the file in hex.
+
+=item Column 2
+
+This contains a textual description of the field.
+
+=item Column 3
+
+If the field contains a numeric value it will be displayed in hex. Zip
+stored most numbers in little-endian format - the value displayed will have
+the little-endian encoding removed.
+
+Next, is an optional description of what the value means.
+
+
+=back
+
+If the C<-v> option is present, column 1 is expanded to include
+
+=over 5
+
+=item *
+
+The offset from the start of the file in hex.
+
+=item *
+
+The length of the filed in hex.
+
+=item *
+
+A hex dump of the bytes in field in the order they are stored in the zip
+file.
+
+=back
+
+
+=head1 TODO 
+
+Error handling is still a work in progress.  If the program encounters a
+problem reading a zip file it is likely to terminate with an unhelpful
+error message. 
+
+
+=head1 SEE ALSO
+
+
+The primary reference for Zip files is the "appnote" document available at
+L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>.
+
+An alternative is the Info-Zip appnote. This is available from
+L<ftp://ftp.info-zip.org/pub/infozip/doc/>
+
+
+The C<zipinfo> program that comes with the info-zip distribution
+(L<http://www.info-zip.org/>) can also display details of the structure of
+a zip file.
+
+See also L<IO::Compress::Zip>, L<IO::Uncompress::Unzip>.
+
+
+=head1 AUTHOR
+
+Paul Marquess F<pmqs@cpan.org>.
+
+=head1 COPYRIGHT 
+
+Copyright (c) 2011 Paul Marquess. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself. 
+
index 2fb2b6a..3b26216 100644 (file)
@@ -7,17 +7,17 @@ use Carp ;
 use IO::Handle ;
 use Scalar::Util qw(dualvar);
 
-use IO::Compress::Base::Common 2.043 ;
-use Compress::Raw::Zlib 2.043 ;
-use IO::Compress::Gzip 2.043 ;
-use IO::Uncompress::Gunzip 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
+use Compress::Raw::Zlib 2.044 ;
+use IO::Compress::Gzip 2.044 ;
+use IO::Uncompress::Gunzip 2.044 ;
 
 use strict ;
 use warnings ;
 use bytes ;
 our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $XS_VERSION = $VERSION; 
 $VERSION = eval $VERSION;
 
@@ -453,7 +453,7 @@ sub inflate
 
 package Compress::Zlib ;
 
-use IO::Compress::Gzip::Constants 2.043 ;
+use IO::Compress::Gzip::Constants 2.044 ;
 
 sub memGzip($)
 {
@@ -1449,7 +1449,7 @@ of I<Compress::Zlib>.
 
 L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 00bae00..05b9153 100644 (file)
@@ -4,13 +4,12 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status);
+use IO::Compress::Base::Common  2.044 qw(:Status);
 
-#use Compress::Bzip2 ;
-use Compress::Raw::Bzip2  2.043 ;
+use Compress::Raw::Bzip2  2.044 ;
 
 our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 sub mkCompObject
 {
@@ -18,11 +17,12 @@ sub mkCompObject
     my $WorkFactor = shift ;
     my $Verbosity  = shift ;
 
+    $BlockSize100K = 1 if ! defined $BlockSize100K ;
+    $WorkFactor    = 0 if ! defined $WorkFactor ;
+    $Verbosity     = 0 if ! defined $Verbosity ;
+
     my ($def, $status) = new Compress::Raw::Bzip2(1, $BlockSize100K,
                                                  $WorkFactor, $Verbosity);
-    #my ($def, $status) = bzdeflateInit();
-                        #-BlockSize100K => $params->value('BlockSize100K'),
-                        #-WorkFactor    => $params->value('WorkFactor');
 
     return (undef, "Could not create Deflate object: $status", $status)
         if $status != BZ_OK ;
@@ -39,7 +39,6 @@ sub compr
 
     my $def   = $self->{Def};
 
-    #my ($out, $status) = $def->bzdeflate(defined ${$_[0]} ? ${$_[0]} : "") ;
     my $status = $def->bzdeflate($_[0], $_[1]) ;
     $self->{ErrorNo} = $status;
 
@@ -49,8 +48,6 @@ sub compr
         return STATUS_ERROR;
     }
 
-    #${ $_[1] } .= $out if defined $out;
-
     return STATUS_OK;    
 }
 
@@ -60,8 +57,6 @@ sub flush
 
     my $def   = $self->{Def};
 
-    #my ($out, $status) = $def->bzflush($opt);
-    #my $status = $def->bzflush($_[0], $opt);
     my $status = $def->bzflush($_[0]);
     $self->{ErrorNo} = $status;
 
@@ -71,7 +66,6 @@ sub flush
         return STATUS_ERROR;
     }
 
-    #${ $_[0] } .= $out if defined $out ;
     return STATUS_OK;    
     
 }
@@ -82,7 +76,6 @@ sub close
 
     my $def   = $self->{Def};
 
-    #my ($out, $status) = $def->bzclose();
     my $status = $def->bzclose($_[0]);
     $self->{ErrorNo} = $status;
 
@@ -92,7 +85,6 @@ sub close
         return STATUS_ERROR;
     }
 
-    #${ $_[0] } .= $out if defined $out ;
     return STATUS_OK;    
     
 }
index 60c7790..d2d444f 100644 (file)
@@ -4,12 +4,12 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status);
+use IO::Compress::Base::Common  2.044 qw(:Status);
 
-use Compress::Raw::Zlib  2.043 qw(Z_OK Z_FINISH MAX_WBITS) ;
+use Compress::Raw::Zlib  2.044 qw(Z_OK Z_FINISH MAX_WBITS) ;
 our ($VERSION);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 sub mkCompObject
 {
index 7aebede..c14b6fb 100644 (file)
@@ -4,10 +4,10 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status);
+use IO::Compress::Base::Common  2.044 qw(:Status);
 our ($VERSION);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 sub mkCompObject
 {
index cac7610..6d9ba9c 100644 (file)
@@ -6,7 +6,7 @@ require 5.004 ;
 use strict ;
 use warnings;
 
-use IO::Compress::Base::Common 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
 
 use IO::File qw(SEEK_SET SEEK_END); ;
 use Scalar::Util qw(blessed readonly);
@@ -20,7 +20,7 @@ use bytes;
 our (@ISA, $VERSION);
 @ISA    = qw(Exporter IO::File);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 #Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.
 
@@ -414,7 +414,7 @@ sub _singleTarget
     if ($x->{oneInput})
     {
         $obj->getFileInfo($x->{Got}, $input)
-            if isaFilename($input) and $inputIsFilename ;
+            if isaScalar($input) || (isaFilename($input) and $inputIsFilename) ;
 
         my $z = $obj->_create($x->{Got}, @_)
             or return undef ;
@@ -444,7 +444,7 @@ sub _singleTarget
             else
             {
                 $obj->getFileInfo($x->{Got}, $element)
-                    if $isFilename;
+                    if isaScalar($element) || $isFilename;
 
                 $obj->_create($x->{Got}, @_)
                     or return undef ;
@@ -527,7 +527,7 @@ sub addInterStream
     {
         $self->getFileInfo(*$self->{Got}, $input)
             #if isaFilename($input) and $inputIsFilename ;
-            if isaFilename($input) ;
+            if isaScalar($input) || isaFilename($input) ;
 
         # TODO -- newStream needs to allow gzip/zip header to be modified
         return $self->newStream();
@@ -973,7 +973,7 @@ purpose if to to be sub-classed by IO::Compress modules.
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 4113304..6884707 100644 (file)
@@ -11,15 +11,20 @@ use File::GlobMapper;
 require Exporter;
 our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
 @ISA = qw(Exporter);
-$VERSION = '2.043';
+$VERSION = '2.044';
 
-@EXPORT = qw( isaFilehandle isaFilename whatIsInput whatIsOutput 
+@EXPORT = qw( isaFilehandle isaFilename isaScalar
+              whatIsInput whatIsOutput 
               isaFileGlobString cleanFileGlobString oneTarget
               setBinModeInput setBinModeOutput
               ckInOutParams 
               createSelfTiedObject
               getEncoding
 
+              isGeMax32
+
+              MAX32
+
               WANT_CODE
               WANT_EXT
               WANT_UNDEF
@@ -42,7 +47,16 @@ use constant STATUS_OK        => 0;
 use constant STATUS_ENDSTREAM => 1;
 use constant STATUS_EOF       => 2;
 use constant STATUS_ERROR     => -1;
+use constant MAX16            => 0xFFFF ;  
+use constant MAX32            => 0xFFFFFFFF ;  
+use constant MAX32cmp         => 0xFFFFFFFF + 1 - 1; # for 5.6.x on 32-bit need to force an non-IV value 
           
+
+sub isGeMax32
+{
+    return $_[0] >= MAX32cmp ;
+}
+
 sub hasEncode()
 {
     if (! defined $HAS_ENCODE) {
@@ -106,6 +120,11 @@ sub isaFilehandle($)
           )
 }
 
+sub isaScalar
+{
+    return ( defined($_[0]) and ref($_[0]) eq 'SCALAR' and defined ${ $_[0] } ) ;
+}
+
 sub isaFilename($)
 {
     return (defined $_[0] and 
index 5211bef..fea0df9 100644 (file)
@@ -5,16 +5,16 @@ use warnings;
 use bytes;
 require Exporter ;
 
-use IO::Compress::Base 2.043 ;
+use IO::Compress::Base 2.044 ;
 
-use IO::Compress::Base::Common  2.043 qw(createSelfTiedObject);
-use IO::Compress::Adapter::Bzip2 2.043 ;
+use IO::Compress::Base::Common  2.044 qw(createSelfTiedObject);
+use IO::Compress::Adapter::Bzip2 2.044 ;
 
 
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $Bzip2Error = '';
 
 @ISA    = qw(Exporter IO::Compress::Base);
@@ -51,7 +51,7 @@ sub getExtraParams
 {
     my $self = shift ;
 
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
     
     return (
             'BlockSize100K' => [0, 1, Parse_unsigned,  1],
index 1d241d7..a1ed85e 100644 (file)
@@ -6,16 +6,16 @@ use bytes;
 
 require Exporter ;
 
-use IO::Compress::RawDeflate 2.043 ;
+use IO::Compress::RawDeflate 2.044 ;
 
-use Compress::Raw::Zlib  2.043 ;
-use IO::Compress::Zlib::Constants 2.043 ;
-use IO::Compress::Base::Common  2.043 qw(createSelfTiedObject);
+use Compress::Raw::Zlib  2.044 ;
+use IO::Compress::Zlib::Constants 2.044 ;
+use IO::Compress::Base::Common  2.044 qw(createSelfTiedObject);
 
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $DeflateError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $DeflateError = '';
 
 @ISA    = qw(Exporter IO::Compress::RawDeflate);
@@ -884,8 +884,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
 
-    
-
 =head2 Working with Net::FTP
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -894,7 +892,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
similarity index 87%
rename from cpan/IO-Compress/pod/FAQ.pod
rename to cpan/IO-Compress/lib/IO/Compress/FAQ.pod
index 8848439..ee8a2c6 100644 (file)
@@ -96,6 +96,78 @@ can find it on CPAN at
 
     http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz    
 
+=head2 Can I Read/Write Zip files larger the 4 Gig?
+
+Yes, both the C<IO-Compress-Zip> and C<IO-Uncompress-Unzip>  modules
+support the zip feature called I<Zip64>. That allows them to read/write
+files/buffers larger than 4Gig. 
+
+If you are creating a Zip file using the one-shot interface, and any of the
+input files is greater than 4Gig, a zip64 complaint zip file will be
+created. 
+
+    zip "really-large-file" => "my.zip";
+
+Similarly with the one-shot interface, if the input is a buffer larger than
+4 Gig, a zip64 complaint zip file will be created. 
+
+    zip \$really_large_buffer => "my.zip";
+
+The one-shot interface allows you to force the creation of a zip64 zip file
+by including the C<Zip64> option.
+
+    zip $filehandle => "my.zip", Zip64 => 1;
+
+If you want to create a zip64 zip file with the OO interface you must
+specify the C<Zip64> option.
+
+    my $zip = new IO::Compress::Zip "whatever", Zip64 => 1;
+       
+When uncompressing with C<IO-Uncompress-Unzip>, it will automatically
+detect if the zip file is zip64.
+
+If you intend to manipulate the Zip64 zip files created with
+C<IO-Compress-Zip> using an external zip/unzip, make sure that it supports
+Zip64.  
+
+In particular, if you are using Info-Zip you need to have zip version 3.x
+or better to update a Zip64 archive and unzip version 6.x to read a zip64
+archive. 
+
+=head2 What Compression Types do IO::Compress::Zip & IO::Uncompress::Unzip support?
+
+The following compression formats are supported by C<IO::Compress::Zip> and
+C<IO::Uncompress::Unzip>
+
+=over 5
+
+=item * Store (method 0)
+
+NO compression at all.
+
+=item * Deflate (method 8)
+
+This is the default compression used when creating a zip file with
+C<IO::Compress::Zip>.
+
+=item * Bzip2 (method 12)
+
+Only supported if the C<IO-Compress-Bzip2> module is available.
+
+=item * Lzma (method 14)
+
+Only supported if the C<IO-Compress-Lzma> module is available.
+
+=back
+
+=head2 Zip Resources
+
+The primary reference for zip files is the "appnote" document available at
+L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>
+
+An alternatively is the Info-Zip appnote. This is available from
+L<ftp://ftp.info-zip.org/pub/infozip/doc/>
+
 =head2 Compressed files and Net::FTP
 
 The C<Net::FTP> module provides two low-level methods called C<stor> and
@@ -491,7 +563,7 @@ file.
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index fbc6758..6914c15 100644 (file)
@@ -8,12 +8,12 @@ use warnings;
 use bytes;
 
 
-use IO::Compress::RawDeflate 2.043 ;
+use IO::Compress::RawDeflate 2.044 ;
 
-use Compress::Raw::Zlib  2.043 ;
-use IO::Compress::Base::Common  2.043 qw(:Status :Parse createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
+use Compress::Raw::Zlib  2.044 ;
+use IO::Compress::Base::Common  2.044 qw(:Status :Parse isaScalar createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
 
 BEGIN
 {
@@ -27,7 +27,7 @@ require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GzipError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $GzipError = '' ;
 
 @ISA    = qw(Exporter IO::Compress::RawDeflate);
@@ -178,6 +178,8 @@ sub getFileInfo
     my $params = shift;
     my $filename = shift ;
 
+    return if isaScalar($filename);
+
     my $defaultTime = (stat($filename))[9] ;
 
     $params->value('Name' => $filename)
@@ -1196,8 +1198,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
 
-    
-
 =head2 Working with Net::FTP
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -1206,7 +1206,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
 
 L<Compress::Zlib>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 8c78868..2e6d76f 100644 (file)
@@ -9,7 +9,7 @@ require Exporter;
 our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
 our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 @ISA = qw(Exporter);
 
index a316eb6..e21e6ad 100644 (file)
@@ -7,16 +7,16 @@ use warnings;
 use bytes;
 
 
-use IO::Compress::Base 2.043 ;
-use IO::Compress::Base::Common  2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Adapter::Deflate  2.043 ;
+use IO::Compress::Base 2.044 ;
+use IO::Compress::Base::Common  2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Adapter::Deflate  2.044 ;
 
 require Exporter ;
 
 
 our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $RawDeflateError = '';
 
 @ISA = qw(Exporter IO::Compress::Base);
@@ -142,8 +142,8 @@ sub getZlibParams
 {
     my $self = shift ;
 
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
-    use Compress::Raw::Zlib  2.043 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
+    use Compress::Raw::Zlib  2.044 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
 
     
     return (
@@ -971,8 +971,6 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
 
-    
-
 =head2 Working with Net::FTP
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -981,7 +979,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 77630d8..303db18 100644 (file)
@@ -4,28 +4,30 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::RawDeflate 2.043 ;
-use IO::Compress::Adapter::Deflate 2.043 ;
-use IO::Compress::Adapter::Identity 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
-use IO::Compress::Zip::Constants 2.043 ;
+use IO::Compress::Base::Common  2.044 qw(:Status MAX32 isGeMax32 isaScalar createSelfTiedObject);
+use IO::Compress::RawDeflate 2.044 ;
+use IO::Compress::Adapter::Deflate 2.044 ;
+use IO::Compress::Adapter::Identity 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
+use IO::Compress::Zip::Constants 2.044 ;
 
 use File::Spec();
 use Config;
 
-use Compress::Raw::Zlib  2.043 qw(crc32) ;
+use Compress::Raw::Zlib  2.044 qw(crc32) ;
+
 BEGIN
 {
     eval { require IO::Compress::Adapter::Bzip2 ; 
-           import  IO::Compress::Adapter::Bzip2 2.043 ; 
+           import  IO::Compress::Adapter::Bzip2 2.044 ; 
            require IO::Compress::Bzip2 ; 
-           import  IO::Compress::Bzip2 2.043 ; 
+           import  IO::Compress::Bzip2 2.044 ; 
          } ;
+         
     eval { require IO::Compress::Adapter::Lzma ; 
-           import  IO::Compress::Adapter::Lzma 2.043 ; 
+           import  IO::Compress::Adapter::Lzma 2.044 ; 
            require IO::Compress::Lzma ; 
-           import  IO::Compress::Lzma 2.043 ; 
+           import  IO::Compress::Lzma 2.044 ; 
          } ;
 }
 
@@ -34,7 +36,7 @@ require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $ZipError = '';
 
 @ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -248,7 +250,7 @@ sub mkHeader
         if $osCode == ZIP_OS_CODE_UNIX ;
 
     if (*$self->{ZipData}{Zip64}) {
-        $empty = 0xFFFFFFFF;
+        $empty = MAX32;
 
         my $x = '';
         $x .= pack "V V", 0, 0 ; # uncompressedLength   
@@ -368,7 +370,7 @@ sub mkHeader
 
     # offset to local hdr
     if (*$self->{ZipData}{LocalHdrOffset}->is64bit() ) { 
-        $ctl .= pack 'V', 0xFFFFFFFF ;
+        $ctl .= pack 'V', MAX32 ;
     }
     else {
         $ctl .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V32() ; 
@@ -512,8 +514,8 @@ sub mkFinalTrailer
         $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to end zip64 central dir
         $z64e .= pack 'V', 1              ; # Total number of disks 
 
-        $cd_offset = 0xFFFFFFFF ;
-        $cd_len = 0xFFFFFFFF if $cd_len >= 0xFFFFFFFF ;
+        $cd_offset = MAX32 ;
+        $cd_len = MAX32 if isGeMax32 $cd_len ;
         $entries = 0xFFFF if $entries >= 0xFFFF ;
     }
 
@@ -641,15 +643,14 @@ sub getExtraParams
 {
     my $self = shift ;
 
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
-    use Compress::Raw::Zlib  2.043 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
+    use Compress::Raw::Zlib  2.044 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
 
     my @Bzip2 = ();
     
     @Bzip2 = IO::Compress::Bzip2::getExtraParams($self)
         if defined $IO::Compress::Bzip2::VERSION;
 
-    
     return (
             # zlib behaviour
             $self->getZlibParams(),
@@ -704,9 +705,20 @@ sub getFileInfo
     my $params = shift;
     my $filename = shift ;
 
+    if (isaScalar($filename))
+    {
+        $params->value(Zip64 => 1)
+            if isGeMax32 length (${ $filename }) ;
+
+        return ;
+    }
+
     my ($mode, $uid, $gid, $atime, $mtime, $ctime) 
                 = (stat($filename))[2, 4,5, 8,9,10] ;
 
+    $params->value(Zip64 => 1)
+        if isGeMax32 -s $filename ;
+
     $params->value('Name' => $filename)
         if ! $params->parsed('Name') ;
 
@@ -1416,11 +1428,14 @@ The default is 1.
 
 =item C<< Zip64 => 0|1 >>
 
-Create a Zip64 zip file/buffer. This option should only be used if you want
-to store files larger than 4 Gig.
+Create a Zip64 zip file/buffer. This option is used if you want
+to store files larger than 4 Gig. 
+
+C<Zip64> will be automatically set, as needed, if working with the one-shot 
+interface when the input is either a filename or a scalar reference.
 
 If you intend to manipulate the Zip64 zip files created with this module
-using an external zip/unzip make sure that it supports Zip64.  
+using an external zip/unzip, make sure that it supports Zip64.  
 
 In particular, if you are using Info-Zip you need to have zip version 3.x
 or better to update a Zip64 archive and unzip version 6.x to read a zip64
@@ -1855,8 +1870,6 @@ constructor.
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
 
-    
-
 =head2 Working with Net::FTP
 
 See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
@@ -1865,7 +1878,7 @@ See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index c9ed783..10b74f8 100644 (file)
@@ -7,7 +7,7 @@ require Exporter;
 
 our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 @ISA = qw(Exporter);
 
index 55c65c3..5ed370c 100644 (file)
@@ -9,7 +9,7 @@ require Exporter;
 
 our ($VERSION, @ISA, @EXPORT);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 @ISA = qw(Exporter);
 
index a689536..4bae32c 100644 (file)
@@ -8,9 +8,9 @@ use bytes;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
-use IO::Compress::Gzip::Constants 2.043 ;
+use IO::Compress::Gzip::Constants 2.044 ;
 
 sub ExtraFieldError
 {
index 68796b4..2acc835 100644 (file)
@@ -4,12 +4,12 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.043 qw(:Status);
+use IO::Compress::Base::Common 2.044 qw(:Status);
 
-use Compress::Raw::Bzip2 2.043 ;
+use Compress::Raw::Bzip2 2.044 ;
 
 our ($VERSION, @ISA);
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 sub mkUncompObject
 {
index a730ea3..6ced6a7 100644 (file)
@@ -4,14 +4,14 @@ use warnings;
 use strict;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status);
+use IO::Compress::Base::Common  2.044 qw(:Status);
 use IO::Compress::Zip::Constants ;
 
 our ($VERSION);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
-use Compress::Raw::Zlib  2.043 ();
+use Compress::Raw::Zlib  2.044 ();
 
 sub mkUncompObject
 {
index 09d8c51..d407f3d 100644 (file)
@@ -4,11 +4,11 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status);
-use Compress::Raw::Zlib  2.043 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+use IO::Compress::Base::Common  2.044 qw(:Status);
+use Compress::Raw::Zlib  2.044 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
 
 our ($VERSION);
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 
 
index 0522bd7..0b2abba 100644 (file)
@@ -6,22 +6,22 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(createSelfTiedObject);
+use IO::Compress::Base::Common  2.044 qw(createSelfTiedObject);
 
-use IO::Uncompress::Adapter::Inflate  2.043 ();
+use IO::Uncompress::Adapter::Inflate  2.044 ();
 
 
-use IO::Uncompress::Base  2.043 ;
-use IO::Uncompress::Gunzip  2.043 ;
-use IO::Uncompress::Inflate  2.043 ;
-use IO::Uncompress::RawInflate  2.043 ;
-use IO::Uncompress::Unzip  2.043 ;
+use IO::Uncompress::Base  2.044 ;
+use IO::Uncompress::Gunzip  2.044 ;
+use IO::Uncompress::Inflate  2.044 ;
+use IO::Uncompress::RawInflate  2.044 ;
+use IO::Uncompress::Unzip  2.044 ;
 
 require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $AnyInflateError = '';
 
 @ISA = qw( Exporter IO::Uncompress::Base );
@@ -48,7 +48,7 @@ sub anyinflate
 
 sub getExtraParams
 {
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
     return ( 'RawInflate' => [1, 1, Parse_boolean,  0] ) ;
 }
 
@@ -951,7 +951,7 @@ See L<IO::Uncompress::AnyInflate::FAQ|IO::Uncompress::AnyInflate::FAQ/"Compresse
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index acb5fa8..bbc945a 100644 (file)
@@ -4,16 +4,16 @@ use strict;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.043 qw(createSelfTiedObject);
+use IO::Compress::Base::Common 2.044 qw(createSelfTiedObject);
 
-use IO::Uncompress::Base 2.043 ;
+use IO::Uncompress::Base 2.044 ;
 
 
 require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $AnyUncompressError = '';
 
 @ISA = qw( Exporter IO::Uncompress::Base );
@@ -27,22 +27,22 @@ Exporter::export_ok_tags('all');
 
 BEGIN
 {
-   eval ' use IO::Uncompress::Adapter::Inflate 2.043 ;';
-   eval ' use IO::Uncompress::Adapter::Bunzip2 2.043 ;';
-   eval ' use IO::Uncompress::Adapter::LZO 2.043 ;';
-   eval ' use IO::Uncompress::Adapter::Lzf 2.043 ;';
-   eval ' use IO::Uncompress::Adapter::UnLzma 2.043 ;';
-   eval ' use IO::Uncompress::Adapter::UnXz 2.043 ;';
-
-   eval ' use IO::Uncompress::Bunzip2 2.043 ;';
-   eval ' use IO::Uncompress::UnLzop 2.043 ;';
-   eval ' use IO::Uncompress::Gunzip 2.043 ;';
-   eval ' use IO::Uncompress::Inflate 2.043 ;';
-   eval ' use IO::Uncompress::RawInflate 2.043 ;';
-   eval ' use IO::Uncompress::Unzip 2.043 ;';
-   eval ' use IO::Uncompress::UnLzf 2.043 ;';
-   eval ' use IO::Uncompress::UnLzma 2.043 ;';
-   eval ' use IO::Uncompress::UnXz 2.043 ;';
+   eval ' use IO::Uncompress::Adapter::Inflate 2.044 ;';
+   eval ' use IO::Uncompress::Adapter::Bunzip2 2.044 ;';
+   eval ' use IO::Uncompress::Adapter::LZO 2.044 ;';
+   eval ' use IO::Uncompress::Adapter::Lzf 2.044 ;';
+   eval ' use IO::Uncompress::Adapter::UnLzma 2.044 ;';
+   eval ' use IO::Uncompress::Adapter::UnXz 2.044 ;';
+
+   eval ' use IO::Uncompress::Bunzip2 2.044 ;';
+   eval ' use IO::Uncompress::UnLzop 2.044 ;';
+   eval ' use IO::Uncompress::Gunzip 2.044 ;';
+   eval ' use IO::Uncompress::Inflate 2.044 ;';
+   eval ' use IO::Uncompress::RawInflate 2.044 ;';
+   eval ' use IO::Uncompress::Unzip 2.044 ;';
+   eval ' use IO::Uncompress::UnLzf 2.044 ;';
+   eval ' use IO::Uncompress::UnLzma 2.044 ;';
+   eval ' use IO::Uncompress::UnXz 2.044 ;';
 }
 
 sub new
@@ -60,7 +60,7 @@ sub anyuncompress
 
 sub getExtraParams
 {
-    use IO::Compress::Base::Common 2.043 qw(:Parse);
+    use IO::Compress::Base::Common 2.044 qw(:Parse);
     return ( 'RawInflate' => [1, 1, Parse_boolean,  0] ,
              'UnLzma'     => [1, 1, Parse_boolean,  0] ) ;
 }
@@ -995,7 +995,7 @@ Same as doing this
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 988f22e..21acad7 100644 (file)
@@ -9,12 +9,12 @@ our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);
 @ISA    = qw(Exporter IO::File);
 
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 use constant G_EOF => 0 ;
 use constant G_ERR => -1 ;
 
-use IO::Compress::Base::Common 2.043 ;
+use IO::Compress::Base::Common 2.044 ;
 
 use IO::File ;
 use Symbol;
@@ -1043,6 +1043,13 @@ sub streamCount
     return scalar @{ *$self->{InfoList} }  ;
 }
 
+#sub read
+#{
+#    my $status = myRead(@_);
+#    return undef if $status < 0;
+#    return $status;
+#}
+
 sub read
 {
     # return codes
@@ -1496,7 +1503,7 @@ purpose if to to be sub-classed by IO::Uncompress modules.
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index d33b320..659e87e 100644 (file)
@@ -4,15 +4,15 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
 
-use IO::Uncompress::Base 2.043 ;
-use IO::Uncompress::Adapter::Bunzip2 2.043 ;
+use IO::Uncompress::Base 2.044 ;
+use IO::Uncompress::Adapter::Bunzip2 2.044 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $Bunzip2Error = '';
 
 @ISA    = qw( Exporter IO::Uncompress::Base );
@@ -40,7 +40,7 @@ sub getExtraParams
 {
     my $self = shift ;
 
-    use IO::Compress::Base::Common 2.043 qw(:Parse);
+    use IO::Compress::Base::Common 2.044 qw(:Parse);
     
     return (
             'Verbosity'     => [1, 1, Parse_boolean,   0],
index 3129064..d6c1ce4 100644 (file)
@@ -9,12 +9,12 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Uncompress::RawInflate 2.043 ;
+use IO::Uncompress::RawInflate 2.044 ;
 
-use Compress::Raw::Zlib 2.043 qw( crc32 ) ;
-use IO::Compress::Base::Common 2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
+use Compress::Raw::Zlib 2.044 qw( crc32 ) ;
+use IO::Compress::Base::Common 2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
 
 require Exporter ;
 
@@ -28,7 +28,7 @@ Exporter::export_ok_tags('all');
 
 $GunzipError = '';
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 
 sub new
 {
@@ -47,7 +47,7 @@ sub gunzip
 
 sub getExtraParams
 {
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
     return ( 'ParseExtra' => [1, 1, Parse_boolean,  0] ) ;
 }
 
@@ -1075,7 +1075,7 @@ See L<IO::Uncompress::Gunzip::FAQ|IO::Uncompress::Gunzip::FAQ/"Compressed files
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 7451fe5..951fc66 100644 (file)
@@ -5,15 +5,15 @@ use strict ;
 use warnings;
 use bytes;
 
-use IO::Compress::Base::Common  2.043 qw(:Status createSelfTiedObject);
-use IO::Compress::Zlib::Constants 2.043 ;
+use IO::Compress::Base::Common  2.044 qw(:Status createSelfTiedObject);
+use IO::Compress::Zlib::Constants 2.044 ;
 
-use IO::Uncompress::RawInflate  2.043 ;
+use IO::Uncompress::RawInflate  2.044 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $InflateError = '';
 
 @ISA    = qw( Exporter IO::Uncompress::RawInflate );
@@ -946,7 +946,7 @@ See L<IO::Uncompress::Inflate::FAQ|IO::Uncompress::Inflate::FAQ/"Compressed file
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index 078eeec..f24d1da 100644 (file)
@@ -5,16 +5,16 @@ use strict ;
 use warnings;
 use bytes;
 
-use Compress::Raw::Zlib  2.043 ;
-use IO::Compress::Base::Common  2.043 qw(:Status createSelfTiedObject);
+use Compress::Raw::Zlib  2.044 ;
+use IO::Compress::Base::Common  2.044 qw(:Status createSelfTiedObject);
 
-use IO::Uncompress::Base  2.043 ;
-use IO::Uncompress::Adapter::Inflate  2.043 ;
+use IO::Uncompress::Base  2.044 ;
+use IO::Uncompress::Adapter::Inflate  2.044 ;
 
 require Exporter ;
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $RawInflateError = '';
 
 @ISA    = qw( Exporter IO::Uncompress::Base );
@@ -1074,7 +1074,7 @@ See L<IO::Uncompress::RawInflate::FAQ|IO::Uncompress::RawInflate::FAQ/"Compresse
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index acab6b9..89d0703 100644 (file)
@@ -9,14 +9,14 @@ use warnings;
 use bytes;
 
 use IO::File;
-use IO::Uncompress::RawInflate  2.043 ;
-use IO::Compress::Base::Common  2.043 qw(:Status createSelfTiedObject);
-use IO::Uncompress::Adapter::Inflate  2.043 ;
-use IO::Uncompress::Adapter::Identity 2.043 ;
-use IO::Compress::Zlib::Extra 2.043 ;
-use IO::Compress::Zip::Constants 2.043 ;
+use IO::Uncompress::RawInflate  2.044 ;
+use IO::Compress::Base::Common  2.044 qw(:Status createSelfTiedObject);
+use IO::Uncompress::Adapter::Inflate  2.044 ;
+use IO::Uncompress::Adapter::Identity 2.044 ;
+use IO::Compress::Zlib::Extra 2.044 ;
+use IO::Compress::Zip::Constants 2.044 ;
 
-use Compress::Raw::Zlib  2.043 qw(crc32) ;
+use Compress::Raw::Zlib  2.044 qw(crc32) ;
 
 BEGIN
 {
@@ -31,7 +31,7 @@ require Exporter ;
 
 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
 
-$VERSION = '2.043';
+$VERSION = '2.044';
 $UnzipError = '';
 
 @ISA    = qw(Exporter IO::Uncompress::RawInflate);
@@ -64,7 +64,7 @@ sub unzip
 
 sub getExtraParams
 {
-    use IO::Compress::Base::Common  2.043 qw(:Parse);
+    use IO::Compress::Base::Common  2.044 qw(:Parse);
 
     
     return (
@@ -1812,7 +1812,7 @@ skipping to the next one.
 
 L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzma>, L<IO::Uncompress::UnLzma>, L<IO::Compress::Xz>, L<IO::Uncompress::UnXz>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
 
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+L<IO::Compress::FAQ|IO::Compress::FAQ>
 
 L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
 L<Archive::Tar|Archive::Tar>,
index b5ff655..5a44df9 100644 (file)
@@ -25,7 +25,7 @@ BEGIN
         if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
 
 
-    my $VERSION = '2.043';
+    my $VERSION = '2.044';
     my @NAMES = qw(
                        Compress::Raw::Bzip2
                        Compress::Raw::Zlib
index bd7393a..ed3f8c7 100644 (file)
@@ -28,7 +28,7 @@ BEGIN {
     $extra = 1
         if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
 
-    plan tests => 152 + $extra ;
+    plan tests => 248 + $extra ;
 
     #use_ok('IO::Compress::Zip', qw(zip $ZipError :zip_method)) ;
     use_ok('IO::Compress::Zip', qw(:all)) ;
@@ -67,41 +67,55 @@ sub zipGetHeader
 }
 
 
-for my $stream (0, 1)
+for my $input (0, 1)
 {
-    for my $zip64 (0, 1)
+    for my $stream (0, 1)
     {
-        #next if $zip64 && ! $stream;
-
-        for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+        for my $zip64 (0, 1)
         {
-            title "Stream $stream, Zip64 $zip64, Method $method";
+            #next if $zip64 && ! $stream;
 
-            my $lex = new LexFile my $file1;
+            for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+            {
+                title "Input $input, Stream $stream, Zip64 $zip64, Method $method";
 
-            my $content = "hello ";
-            #writeFile($file1, $content);
+                my $lex1 = new LexFile my $file1;
+                my $lex2 = new LexFile my $file2;
+                my $content = "hello ";
+                my $in ;
 
-            ok zip(\$content => $file1 , Method => $method, 
-                                         Zip64  => $zip64,
-                                         Stream => $stream), " zip ok" 
-                or diag $ZipError ;
+                if ($input)
+                {
+                    writeFile($file2, $content);
+                    $in = $file2;
+                }
+                else
+                {
+                    $in = \$content;
+                }
 
-            my $got ;
-            ok unzip($file1 => \$got), "  unzip ok"
-                or diag $UnzipError ;
 
-            is $got, $content, "  content ok";
+                ok zip($in => $file1 , Method => $method, 
+                                       Zip64  => $zip64,
+                                       Stream => $stream), " zip ok" 
+                    or diag $ZipError ;
 
-            my $u = new IO::Uncompress::Unzip $file1
-                or diag $ZipError ;
+                my $got ;
+                ok unzip($file1 => \$got), "  unzip ok"
+                    or diag $UnzipError ;
 
-            my $hdr = $u->getHeaderInfo();
-            ok $hdr, "  got header";
+                is $got, $content, "  content ok";
 
-            is $hdr->{Stream}, $stream, "  stream is $stream" ;
-            is $hdr->{MethodID}, $method, "  MethodID is $method" ;
-            is $hdr->{Zip64}, $zip64, "  Zip64 is $zip64" ;
+                my $u = new IO::Uncompress::Unzip $file1
+                    or diag $ZipError ;
+
+                my $hdr = $u->getHeaderInfo();
+                ok $hdr, "  got header";
+
+                is $hdr->{Stream}, $stream, "  stream is $stream" ;
+                is $hdr->{MethodID}, $method, "  MethodID is $method" ;
+                is $hdr->{Zip64}, $zip64, "  Zip64 is $zip64" ;
+            }
         }
     }
 }
index 7ce56c3..a67cd6d 100755 (executable)
@@ -707,8 +707,9 @@ sub installlib {
     # scripts in lib/ExtUtils, the prove script in lib/Test/Harness,
     # the corelist script from lib/Module/CoreList/bin and ptar* in
     # lib/Archive/Tar/bin, the config_data script in lib/Module/Build/scripts
+    # and zipdetails in cpan/IO-Compress/bin
     # (they're installed later with other utils)
-    return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|cpan2dist|cpanp|cpanp-run-perl|ptardiff|ptargrep|config_data)\z/;
+    return if $name =~ /^(?:cpan|instmodsh|prove|corelist|ptar|cpan2dist|cpanp|cpanp-run-perl|ptardiff|ptargrep|config_data|zipdetails)\z/;
     # ignore the Makefiles
     return if $name =~ /^makefile$/i;
     # ignore the test extensions
index 8a2ed12..f924223 100644 (file)
@@ -119,7 +119,9 @@ L<Compress::Raw::Bzip2> has been upgraded from version 2.042 to version 2.044.
 
 =item *
 
-L<IO::Compress::Base> has been upgraded from version 2.042 to version 2.043.
+L<IO::Compress::Base> has been upgraded from version 2.042 to version 2.044.
+
+Added zipdetails utility.
 
 =item *
 
@@ -260,13 +262,14 @@ here. Most of these are built within the directories F<utils> and F<x2p>.
 entries for each change
 Use L<XXX> with program names to get proper documentation linking. ]
 
-=head3 L<XXX>
+=head3 L<zipdetails>
 
 =over 4
 
 =item *
 
-XXX
+L<zipdetails> displays information about the internal record structure of the zip file.
+It is not concerned with displaying any details of the compressed data stored in the zip file.
 
 =back
 
index c6520ac..1cc381c 100644 (file)
@@ -256,6 +256,11 @@ in a tar archive.
 This utility, that comes with the C<Digest::SHA> module, is used to print
 or verify SHA checksums.
 
+=item L<zipdetails>
+
+L<zipdetails> displays information about the internal record structure of the zip file.
+It is not concerned with displaying any details of the compressed data stored in the zip file.
+
 =back
 
 =head2 Installation
@@ -301,6 +306,6 @@ C<roffitall|roffitall>, L<a2p|a2p>, L<s2p|s2p>, L<find2perl|find2perl>,
 L<File::Find|File::Find>, L<pl2pm|pl2pm>, L<perlbug|perlbug>,
 L<h2ph|h2ph>, L<c2ph|c2ph>, L<h2xs|h2xs>, L<enc2xs>, L<xsubpp>,
 L<cpan>, L<cpanp>, L<cpan2dist>, L<instmodsh>, L<piconv>, L<prove>,
-L<corelist>, L<ptar>, L<ptardiff>, L<shasum>
+L<corelist>, L<ptar>, L<ptardiff>, L<shasum>, L<zipdetails>
 
 =cut
index ae7ca8b..e4f256c 100644 (file)
@@ -191,7 +191,7 @@ ext/vms-dclsym/dclsym.pm    Verbatim line length including indents exceeds 79 by    1
 ext/vms-stdio/stdio.pm Verbatim line length including indents exceeds 79 by    1
 ext/xs-apitest/apitest.pm      Verbatim line length including indents exceeds 79 by    1
 install        ? Should you be using F<...> or maybe L<...> instead of 1
-install        Verbatim line length including indents exceeds 79 by    10
+install        Verbatim line length including indents exceeds 79 by    11
 installhtml    Verbatim line length including indents exceeds 79 by    5
 os2/os2/os2-extattr/extattr.pm ? Should you be using F<...> or maybe L<...> instead of 1
 os2/os2/os2-process/process.pm Verbatim line length including indents exceeds 79 by    27
index 037b3eb..8ce291e 100644 (file)
--- a/utils.lst
+++ b/utils.lst
@@ -41,6 +41,7 @@ utils/cpan2dist
 utils/shasum
 utils/splain
 utils/xsubpp
+utils/zipdetails
 x2p/a2p         # pod = x2p/a2p.pod
 x2p/find2perl
 x2p/s2p         # link = x2p/psed
index a3a5540..bf6bc80 100644 (file)
@@ -10,9 +10,9 @@ RUN =   # Used mainly cross-compilation setups.
 # Files to be built with variable substitution after miniperl is
 # available.  Dependencies handled manually below (for now).
 
-pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL
-plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html
-plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html
+pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL zipdetails.PL
+plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html zipdetails
+plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html ./zipdetails
 
 all: $(plextract) 
 
@@ -69,6 +69,8 @@ enc2xs:               enc2xs.PL ../config.sh
 
 xsubpp:                xsubpp.PL ../config.sh
 
+zipdetails:    zipdetails.PL ../config.sh
+
 pod2html:      pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
 
 clean:
index 1942ec8..ca683c2 100644 (file)
@@ -48,9 +48,9 @@ cat >>Makefile <<'!NO!SUBS!'
 # Files to be built with variable substitution after miniperl is
 # available.  Dependencies handled manually below (for now).
 
-pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL
-plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html
-plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html
+pl = c2ph.PL config_data.PL corelist.PL cpan.PL h2ph.PL h2xs.PL instmodsh.PL json_pp.PL perlbug.PL perldoc.PL perlivp.PL pl2pm.PL prove.PL ptar.PL ptardiff.PL ptargrep.PL cpanp-run-perl.PL cpanp.PL cpan2dist.PL shasum.PL splain.PL libnetcfg.PL piconv.PL enc2xs.PL xsubpp.PL pod2html.PL zipdetails.PL
+plextract = c2ph config_data corelist cpan h2ph h2xs instmodsh json_pp perlbug perldoc perlivp pl2pm prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum splain libnetcfg piconv enc2xs xsubpp pod2html zipdetails
+plextractexe = ./c2ph ./config_data ./corelist ./cpan ./h2ph ./h2xs ./json_pp ./instmodsh ./perlbug ./perldoc ./perlivp ./pl2pm ./prove ./ptar ./ptardiff ./ptargrep ./cpanp-run-perl ./cpanp ./cpan2dist ./shasum ./splain ./libnetcfg ./piconv ./enc2xs ./xsubpp ./pod2html ./zipdetails
 
 all: $(plextract) 
 
@@ -107,6 +107,8 @@ enc2xs:             enc2xs.PL ../config.sh
 
 xsubpp:                xsubpp.PL ../config.sh
 
+zipdetails:    zipdetails.PL ../config.sh
+
 pod2html:      pod2html.PL ../config.sh ../ext/Pod-Html/bin/pod2html
 
 clean:
diff --git a/utils/zipdetails.PL b/utils/zipdetails.PL
new file mode 100644 (file)
index 0000000..a905c4b
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/local/bin/perl
+
+use Config;
+use File::Basename qw(&basename &dirname);
+use Cwd;
+
+# List explicitly here the variables you want Configure to
+# generate.  Metaconfig only looks for shell variables, so you
+# have to mention them as if they were shell variables, not
+# %Config entries.  Thus you write
+#  $startperl
+# to ensure Configure will look for $Config{startperl}.
+
+# This forces PL files to create target in same directory as PL file.
+# This is so that make depend always knows where to find PL derivatives.
+my $origdir = cwd;
+chdir dirname($0);
+my $file = basename($0, '.PL');
+$file .= '.com' if $^O eq 'VMS';
+
+open OUT,">$file" or die "Can't create $file: $!";
+
+print "Extracting $file (with variable substitutions)\n";
+
+# In this section, perl variables will be expanded during extraction.
+# You can use $Config{...} to use Configure variables.
+
+print OUT <<"!GROK!THIS!";
+$Config{startperl}
+    eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
+       if \$running_under_some_shell;
+!GROK!THIS!
+
+use File::Spec;
+
+my $script = File::Spec->catfile(
+            File::Spec->catdir(
+                File::Spec->updir, qw[ cpan IO-Compress bin ]
+            ), "zipdetails");
+
+if (open(IN, $script)) {
+    print OUT <IN>;
+    close IN;
+} else {
+    die "$0: cannot find '$script'\n";
+}
+
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
index f31fe7e..9a3c831 100644 (file)
@@ -313,7 +313,7 @@ utils1 = [.utils]perldoc.com [.lib.ExtUtils]Miniperl.pm [.utils]c2ph.com [.utils
 utils2 = [.utils]h2xs.com [.utils]libnetcfg.com [.lib]perlbug.com [.utils]json_pp.com
 utils3 = [.utils]perlivp.com [.lib]splain.com [.utils]pl2pm.com [.utils]xsubpp.com [.utils]pod2html.com [.utils]instmodsh.com
 utils4 = [.utils]enc2xs.com [.utils]piconv.com [.utils]cpan.com [.utils]prove.com [.utils]ptar.com [.utils]ptardiff.com [.utils]shasum.com
-utils5 = [.utils]corelist.com [.utils]config_data.com [.utils]cpanp.com [.utils]cpan2dist.com [.utils]cpanp-run-perl.com [.utils]ptargrep.com
+utils5 = [.utils]corelist.com [.utils]config_data.com [.utils]cpanp.com [.utils]cpan2dist.com [.utils]cpanp-run-perl.com [.utils]ptargrep.com [.utils]zipdetails.com
 
 .ifdef NOX2P
 all : base extras archcorefiles preplibrary [.pod]perltoc.pod
@@ -561,6 +561,9 @@ nonxsext : $(LIBPREREQ) preplibrary $(MINIPERL_EXE)
 [.utils]xsubpp.com : [.utils]xsubpp.PL $(ARCHDIR)Config.pm nonxsext
        $(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
 
+[.utils]zipdetails.com : [.utils]zipdetails.PL $(ARCHDIR)Config.pm nonxsext
+       $(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
+
 [.utils]pod2html.com : [.utils]pod2html.PL $(ARCHDIR)Config.pm nonxsext
        $(MINIPERL) -"I[-.lib]" $(MMS$SOURCE)
 
index 9063c25..426cbcb 100644 (file)
@@ -583,6 +583,7 @@ UTILS               =                       \
                ..\utils\ptar           \
                ..\utils\ptardiff       \
                ..\utils\ptargrep       \
+               ..\utils\zipdetails     \
                ..\utils\cpanp-run-perl \
                ..\utils\cpanp  \
                ..\utils\cpan2dist      \
@@ -1180,7 +1181,7 @@ distclean: realclean
            perlvos.pod perlwin32.pod
        -cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
            perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
-           xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data
+           xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data zipdetails
        -cd ..\x2p && del /f find2perl s2p psed *.bat
        -del /f ..\config.sh perlmain.c dlutils.c config.h.new \
                perlmainst.c
index fc89ad2..03d7276 100644 (file)
@@ -675,6 +675,7 @@ UTILS               =                       \
                ..\utils\ptar           \
                ..\utils\ptardiff       \
                ..\utils\ptargrep       \
+               ..\utils\zipdetails     \
                ..\utils\cpanp-run-perl \
                ..\utils\cpanp  \
                ..\utils\cpan2dist      \
@@ -1365,7 +1366,7 @@ distclean: realclean
            perlvos.pod perlwin32.pod
        -cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph pstruct h2xs \
            perldoc perlivp libnetcfg enc2xs piconv cpan *.bat \
-           xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data
+           xsubpp pod2html instmodsh json_pp prove ptar ptardiff ptargrep cpanp-run-perl cpanp cpan2dist shasum corelist config_data zipdetails
        -cd ..\x2p && del /f find2perl s2p psed *.bat
        -del /f ..\config.sh perlmain.c dlutils.c config.h.new \
            perlmainst.c