PATCH: 2 vms specific build files in perl @ 27383
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / lib / IO / Compress / Gzip.pm
1
2 package IO::Compress::Gzip ;
3
4 require 5.004 ;
5
6 use strict ;
7 use warnings;
8
9
10 use IO::Compress::RawDeflate;
11
12 use Compress::Zlib 2 ;
13 use Compress::Zlib::Common qw(:Status createSelfTiedObject);
14 use Compress::Gzip::Constants;
15
16 BEGIN
17 {
18     if (defined &utf8::downgrade ) 
19       { *noUTF8 = \&utf8::downgrade }
20     else
21       { *noUTF8 = sub {} }  
22 }
23
24 require Exporter ;
25
26 our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GzipError);
27
28 $VERSION = '2.000_07';
29 $GzipError = '' ;
30
31 @ISA    = qw(Exporter IO::Compress::RawDeflate);
32 @EXPORT_OK = qw( $GzipError gzip ) ;
33 %EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ;
34 push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
35 Exporter::export_ok_tags('all');
36
37 sub new
38 {
39     my $class = shift ;
40
41     my $obj = createSelfTiedObject($class, \$GzipError);
42
43     $obj->_create(undef, @_);
44 }
45
46
47 sub gzip
48 {
49     my $obj = createSelfTiedObject(undef, \$GzipError);
50     return $obj->_def(@_);
51 }
52
53 #sub newHeader
54 #{
55 #    my $self = shift ;
56 #    #return GZIP_MINIMUM_HEADER ;
57 #    return $self->mkHeader(*$self->{Got});
58 #}
59
60 sub getExtraParams
61 {
62     my $self = shift ;
63
64     use Compress::Zlib::ParseParameters;
65     
66     return (
67             # zlib behaviour
68             $self->getZlibParams(),
69
70             # Gzip header fields
71             'Minimal'   => [0, 1, Parse_boolean,   0],
72             'Comment'   => [0, 1, Parse_any,       undef],
73             'Name'      => [0, 1, Parse_any,       undef],
74             'Time'      => [0, 1, Parse_any,       undef],
75             'TextFlag'  => [0, 1, Parse_boolean,   0],
76             'HeaderCRC' => [0, 1, Parse_boolean,   0],
77             'OS_Code'   => [0, 1, Parse_unsigned,  $Compress::Zlib::gzip_os_code],
78             'ExtraField'=> [0, 1, Parse_string,    undef],
79             'ExtraFlags'=> [0, 1, Parse_any,       undef],
80
81         );
82 }
83
84
85 sub ckParams
86 {
87     my $self = shift ;
88     my $got = shift ;
89
90     # gzip always needs crc32
91     $got->value('CRC32' => 1);
92
93     return 1
94         if $got->value('Merge') ;
95
96     my $lax = ! $got->value('Strict') ;
97
98
99     {
100         if (! $got->parsed('Time') ) {
101             # Modification time defaults to now.
102             $got->value('Time' => time) ;
103         }
104
105         # Check that the Name & Comment don't have embedded NULLs
106         # Also check that they only contain ISO 8859-1 chars.
107         if ($got->parsed('Name') && defined $got->value('Name')) {
108             my $name = $got->value('Name');
109                 
110             return $self->saveErrorString(undef, "Null Character found in Name",
111                                                 Z_DATA_ERROR)
112                 if ! $lax && $name =~ /\x00/ ;
113
114             return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Name",
115                                                 Z_DATA_ERROR)
116                 if ! $lax && $name =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ;
117         }
118
119         if ($got->parsed('Comment') && defined $got->value('Comment')) {
120             my $comment = $got->value('Comment');
121
122             return $self->saveErrorString(undef, "Null Character found in Comment",
123                                                 Z_DATA_ERROR)
124                 if ! $lax && $comment =~ /\x00/ ;
125
126             return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Comment",
127                                                 Z_DATA_ERROR)
128                 if ! $lax && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o;
129         }
130
131         if ($got->parsed('OS_Code') ) {
132             my $value = $got->value('OS_Code');
133
134             return $self->saveErrorString(undef, "OS_Code must be between 0 and 255, got '$value'")
135                 if $value < 0 || $value > 255 ;
136             
137         }
138
139         # gzip only supports Deflate at present
140         $got->value('Method' => Z_DEFLATED) ;
141
142         if ( ! $got->parsed('ExtraFlags')) {
143             $got->value('ExtraFlags' => 2) 
144                 if $got->value('Level') == Z_BEST_SPEED ;
145             $got->value('ExtraFlags' => 4) 
146                 if $got->value('Level') == Z_BEST_COMPRESSION ;
147         }
148
149         if ($got->parsed('ExtraField')) {
150
151             my $bad = $self->parseExtraField($got, $lax) ;
152             return $self->saveErrorString(undef, $bad, Z_DATA_ERROR)
153                 if $bad ;
154
155             my $len = length $got->value('ExtraField') ;
156             return $self->saveErrorString(undef, ExtraFieldError("Too Large"), 
157                                                         Z_DATA_ERROR)
158                 if $len > GZIP_FEXTRA_MAX_SIZE;
159         }
160     }
161
162     return 1;
163 }
164
165 sub mkTrailer
166 {
167     my $self = shift ;
168     return pack("V V", *$self->{Compress}->crc32(), 
169                        *$self->{UnCompSize_32bit});
170 }
171
172 sub getInverseClass
173 {
174     return ('IO::Uncompress::Gunzip',
175                 \$IO::Uncompress::Gunzip::GunzipError);
176 }
177
178 sub getFileInfo
179 {
180     my $self = shift ;
181     my $params = shift;
182     my $filename = shift ;
183
184     my $defaultTime = (stat($filename))[9] ;
185
186     $params->value('Name' => $filename)
187         if ! $params->parsed('Name') ;
188
189     $params->value('Time' => $defaultTime) 
190         if ! $params->parsed('Time') ;
191 }
192
193
194 sub mkHeader
195 {
196     my $self = shift ;
197     my $param = shift ;
198
199     # stort-circuit if a minimal header is requested.
200     return GZIP_MINIMUM_HEADER if $param->value('Minimal') ;
201
202     # METHOD
203     my $method = $param->valueOrDefault('Method', GZIP_CM_DEFLATED) ;
204
205     # FLAGS
206     my $flags       = GZIP_FLG_DEFAULT ;
207     $flags |= GZIP_FLG_FTEXT    if $param->value('TextFlag') ;
208     $flags |= GZIP_FLG_FHCRC    if $param->value('HeaderCRC') ;
209     $flags |= GZIP_FLG_FEXTRA   if $param->wantValue('ExtraField') ;
210     $flags |= GZIP_FLG_FNAME    if $param->wantValue('Name') ;
211     $flags |= GZIP_FLG_FCOMMENT if $param->wantValue('Comment') ;
212     
213     # MTIME
214     my $time = $param->valueOrDefault('Time', GZIP_MTIME_DEFAULT) ;
215
216     # EXTRA FLAGS
217     my $extra_flags = $param->valueOrDefault('ExtraFlags', GZIP_XFL_DEFAULT);
218
219     # OS CODE
220     my $os_code = $param->valueOrDefault('OS_Code', GZIP_OS_DEFAULT) ;
221
222
223     my $out = pack("C4 V C C", 
224             GZIP_ID1,   # ID1
225             GZIP_ID2,   # ID2
226             $method,    # Compression Method
227             $flags,     # Flags
228             $time,      # Modification Time
229             $extra_flags, # Extra Flags
230             $os_code,   # Operating System Code
231             ) ;
232
233     # EXTRA
234     if ($flags & GZIP_FLG_FEXTRA) {
235         my $extra = $param->value('ExtraField') ;
236         $out .= pack("v", length $extra) . $extra ;
237     }
238
239     # NAME
240     if ($flags & GZIP_FLG_FNAME) {
241         my $name .= $param->value('Name') ;
242         $name =~ s/\x00.*$//;
243         $out .= $name ;
244         # Terminate the filename with NULL unless it already is
245         $out .= GZIP_NULL_BYTE 
246             if !length $name or
247                substr($name, 1, -1) ne GZIP_NULL_BYTE ;
248     }
249
250     # COMMENT
251     if ($flags & GZIP_FLG_FCOMMENT) {
252         my $comment .= $param->value('Comment') ;
253         $comment =~ s/\x00.*$//;
254         $out .= $comment ;
255         # Terminate the comment with NULL unless it already is
256         $out .= GZIP_NULL_BYTE
257             if ! length $comment or
258                substr($comment, 1, -1) ne GZIP_NULL_BYTE;
259     }
260
261     # HEADER CRC
262     $out .= pack("v", crc32($out) & 0x00FF ) if $param->value('HeaderCRC') ;
263
264     noUTF8($out);
265
266     return $out ;
267 }
268
269 sub ExtraFieldError
270 {
271     return "Error with ExtraField Parameter: $_[0]" ;
272 }
273
274 sub validateExtraFieldPair
275 {
276     my $pair = shift ;
277     my $lax  = shift ;
278
279     return ExtraFieldError("Not an array ref")
280         unless ref $pair &&  ref $pair eq 'ARRAY';
281
282     return ExtraFieldError("SubField must have two parts")
283         unless @$pair == 2 ;
284
285     return ExtraFieldError("SubField ID is a reference")
286         if ref $pair->[0] ;
287
288     return ExtraFieldError("SubField Data is a reference")
289         if ref $pair->[1] ;
290
291     # ID is exactly two chars   
292     return ExtraFieldError("SubField ID not two chars long")
293         unless length $pair->[0] == GZIP_FEXTRA_SUBFIELD_ID_SIZE ;
294
295     # Check that the 2nd byte of the ID isn't 0    
296     return ExtraFieldError("SubField ID 2nd byte is 0x00")
297         if ! $lax && substr($pair->[0], 1, 1) eq "\x00" ;
298
299     return ExtraFieldError("SubField Data too long")
300         if length $pair->[1] > GZIP_FEXTRA_SUBFIELD_MAX_SIZE ;
301
302
303     return undef ;
304 }
305
306 sub parseExtra
307 {
308     my $data = shift ;
309     my $lax = shift ;
310
311     return undef
312         if $lax ;
313
314     my $XLEN = length $data ;
315
316     return ExtraFieldError("Too Large")
317         if $XLEN > GZIP_FEXTRA_MAX_SIZE;
318
319     my $offset = 0 ;
320     while ($offset < $XLEN) {
321
322         return ExtraFieldError("FEXTRA Body")
323             if $offset + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE  > $XLEN ;
324
325         my $id = substr($data, $offset, GZIP_FEXTRA_SUBFIELD_ID_SIZE);    
326         $offset += GZIP_FEXTRA_SUBFIELD_ID_SIZE;
327
328         my $subLen =  unpack("v", substr($data, $offset,
329                                             GZIP_FEXTRA_SUBFIELD_LEN_SIZE));
330         $offset += GZIP_FEXTRA_SUBFIELD_LEN_SIZE ;
331
332         return ExtraFieldError("FEXTRA Body")
333             if $offset + $subLen > $XLEN ;
334
335         my $bad = validateExtraFieldPair( [$id, 
336                                             substr($data, $offset, $subLen)], $lax );
337         return $bad if $bad ;
338
339         $offset += $subLen ;
340     }
341         
342     return undef ;
343 }
344
345 sub parseExtraField
346 {
347     my $self = shift ;
348     my $got  = shift ;
349     my $lax  = shift ;
350
351     # ExtraField can be any of
352     #
353     #    -ExtraField => $data
354     #    -ExtraField => [$id1, $data1,
355     #                    $id2, $data2]
356     #                     ...
357     #                   ]
358     #    -ExtraField => [ [$id1 => $data1],
359     #                     [$id2 => $data2],
360     #                     ...
361     #                   ]
362     #    -ExtraField => { $id1 => $data1,
363     #                     $id2 => $data2,
364     #                     ...
365     #                   }
366
367     
368     return undef
369         unless $got->parsed('ExtraField') ;
370
371     return parseExtra($got->value('ExtraField'), $lax)
372         unless ref $got->value('ExtraField') ;
373
374     my $data = $got->value('ExtraField');
375     my $out = '' ;
376
377     if (ref $data eq 'ARRAY') {    
378         if (ref $data->[0]) {
379
380             foreach my $pair (@$data) {
381                 return ExtraFieldError("Not list of lists")
382                     unless ref $pair eq 'ARRAY' ;
383
384                 my $bad = validateExtraFieldPair($pair, $lax) ;
385                 return $bad if $bad ;
386
387                 $out .= $pair->[0] . pack("v", length $pair->[1]) . 
388                         $pair->[1] ;
389             }   
390         }   
391         else {
392             return ExtraFieldError("Not even number of elements")
393                 unless @$data % 2  == 0;
394
395             for (my $ix = 0; $ix <= length(@$data) -1 ; $ix += 2) {
396                 my $bad = validateExtraFieldPair([$data->[$ix], $data->[$ix+1]], $lax) ;
397                 return $bad if $bad ;
398
399                 $out .= $data->[$ix] . pack("v", length $data->[$ix+1]) . 
400                         $data->[$ix+1] ;
401             }   
402         }
403     }   
404     elsif (ref $data eq 'HASH') {    
405         while (my ($id, $info) = each %$data) {
406             my $bad = validateExtraFieldPair([$id, $info], $lax);
407             return $bad if $bad ;
408
409             $out .= $id .  pack("v", length $info) . $info ;
410         }   
411     }   
412     else {
413         return ExtraFieldError("Not a scalar, array ref or hash ref") ;
414     }
415
416     $got->value('ExtraField' => $out);
417
418     return undef;
419 }
420
421 sub mkFinalTrailer
422 {
423     return '';
424 }
425
426 1; 
427
428 __END__
429
430 =head1 NAME
431
432 IO::Compress::Gzip     - Perl interface to write RFC 1952 files/buffers
433
434 =head1 SYNOPSIS
435
436     use IO::Compress::Gzip qw(gzip $GzipError) ;
437
438
439     my $status = gzip $input => $output [,OPTS] 
440         or die "gzip failed: $GzipError\n";
441
442     my $z = new IO::Compress::Gzip $output [,OPTS]
443         or die "gzip failed: $GzipError\n";
444
445     $z->print($string);
446     $z->printf($format, $string);
447     $z->write($string);
448     $z->syswrite($string [, $length, $offset]);
449     $z->flush();
450     $z->tell();
451     $z->eof();
452     $z->seek($position, $whence);
453     $z->binmode();
454     $z->fileno();
455     $z->newStream( [OPTS] );
456     $z->deflateParams();
457     $z->close() ;
458
459     $GzipError ;
460
461     # IO::File mode
462
463     print $z $string;
464     printf $z $format, $string;
465     syswrite $z, $string [, $length, $offset];
466     flush $z, ;
467     tell $z
468     eof $z
469     seek $z, $position, $whence
470     binmode $z
471     fileno $z
472     close $z ;
473     
474
475 =head1 DESCRIPTION
476
477
478
479 B<WARNING -- This is a Beta release>. 
480
481 =over 5
482
483 =item * DO NOT use in production code.
484
485 =item * The documentation is incomplete in places.
486
487 =item * Parts of the interface defined here are tentative.
488
489 =item * Please report any problems you find.
490
491 =back
492
493
494
495 This module provides a Perl interface that allows writing compressed
496 data to files or buffer as defined in RFC 1952.
497
498
499 All the gzip headers defined in RFC 1952 can be created using
500 this module.
501
502
503
504
505 For reading RFC 1952 files/buffers, see the companion module 
506 L<IO::Uncompress::Gunzip|IO::Uncompress::Gunzip>.
507
508
509 =head1 Functional Interface
510
511 A top-level function, C<gzip>, is provided to carry out
512 "one-shot" compression between buffers and/or files. For finer
513 control over the compression process, see the L</"OO Interface">
514 section.
515
516     use IO::Compress::Gzip qw(gzip $GzipError) ;
517
518     gzip $input => $output [,OPTS] 
519         or die "gzip failed: $GzipError\n";
520
521
522
523 The functional interface needs Perl5.005 or better.
524
525
526 =head2 gzip $input => $output [, OPTS]
527
528
529 C<gzip> expects at least two parameters, C<$input> and C<$output>.
530
531 =head3 The C<$input> parameter
532
533 The parameter, C<$input>, is used to define the source of
534 the uncompressed data. 
535
536 It can take one of the following forms:
537
538 =over 5
539
540 =item A filename
541
542 If the C<$input> parameter is a simple scalar, it is assumed to be a
543 filename. This file will be opened for reading and the input data
544 will be read from it.
545
546 =item A filehandle
547
548 If the C<$input> parameter is a filehandle, the input data will be
549 read from it.
550 The string '-' can be used as an alias for standard input.
551
552 =item A scalar reference 
553
554 If C<$input> is a scalar reference, the input data will be read
555 from C<$$input>.
556
557 =item An array reference 
558
559 If C<$input> is an array reference, each element in the array must be a
560 filename.
561
562 The input data will be read from each file in turn. 
563
564 The complete array will be walked to ensure that it only
565 contains valid filenames before any data is compressed.
566
567
568
569 =item An Input FileGlob string
570
571 If C<$input> is a string that is delimited by the characters "<" and ">"
572 C<gzip> will assume that it is an I<input fileglob string>. The
573 input is the list of files that match the fileglob.
574
575 If the fileglob does not match any files ...
576
577 See L<File::GlobMapper|File::GlobMapper> for more details.
578
579
580 =back
581
582 If the C<$input> parameter is any other type, C<undef> will be returned.
583
584
585
586 In addition, if C<$input> is a simple filename, the default values for
587 two of the gzip header fields created by this function will be sourced
588 from that file -- the NAME gzip header field will be populated with
589 the filename itself, and the MTIME header field will be set to the
590 modification time of the file.
591 The intention here is to mirror part of the behaviour of the gzip
592 executable.
593 If you do not want to use these defaults they can be overridden by
594 explicitly setting the C<Name> and C<Time> options or by setting the
595 C<Minimal> parameter.
596
597
598
599 =head3 The C<$output> parameter
600
601 The parameter C<$output> is used to control the destination of the
602 compressed data. This parameter can take one of these forms.
603
604 =over 5
605
606 =item A filename
607
608 If the C<$output> parameter is a simple scalar, it is assumed to be a
609 filename.  This file will be opened for writing and the compressed
610 data will be written to it.
611
612 =item A filehandle
613
614 If the C<$output> parameter is a filehandle, the compressed data
615 will be written to it.
616 The string '-' can be used as an alias for standard output.
617
618
619 =item A scalar reference 
620
621 If C<$output> is a scalar reference, the compressed data will be
622 stored in C<$$output>.
623
624
625
626 =item An Array Reference
627
628 If C<$output> is an array reference, the compressed data will be
629 pushed onto the array.
630
631 =item An Output FileGlob
632
633 If C<$output> is a string that is delimited by the characters "<" and ">"
634 C<gzip> will assume that it is an I<output fileglob string>. The
635 output is the list of files that match the fileglob.
636
637 When C<$output> is an fileglob string, C<$input> must also be a fileglob
638 string. Anything else is an error.
639
640 =back
641
642 If the C<$output> parameter is any other type, C<undef> will be returned.
643
644
645
646 =head2 Notes
647
648 When C<$input> maps to multiple files/buffers and C<$output> is a single
649 file/buffer the compressed input files/buffers will all be stored
650 in C<$output> as a single compressed stream.
651
652
653
654 =head2 Optional Parameters
655
656 Unless specified below, the optional parameters for C<gzip>,
657 C<OPTS>, are the same as those used with the OO interface defined in the
658 L</"Constructor Options"> section below.
659
660 =over 5
661
662 =item AutoClose =E<gt> 0|1
663
664 This option applies to any input or output data streams to 
665 C<gzip> that are filehandles.
666
667 If C<AutoClose> is specified, and the value is true, it will result in all
668 input and/or output filehandles being closed once C<gzip> has
669 completed.
670
671 This parameter defaults to 0.
672
673
674
675 =item BinModeIn =E<gt> 0|1
676
677 When reading from a file or filehandle, set C<binmode> before reading.
678
679 Defaults to 0.
680
681
682
683
684
685 =item -Append =E<gt> 0|1
686
687 TODO
688
689
690 =back
691
692
693
694 =head2 Examples
695
696 To read the contents of the file C<file1.txt> and write the compressed
697 data to the file C<file1.txt.gz>.
698
699     use strict ;
700     use warnings ;
701     use IO::Compress::Gzip qw(gzip $GzipError) ;
702
703     my $input = "file1.txt";
704     gzip $input => "$input.gz"
705         or die "gzip failed: $GzipError\n";
706
707
708 To read from an existing Perl filehandle, C<$input>, and write the
709 compressed data to a buffer, C<$buffer>.
710
711     use strict ;
712     use warnings ;
713     use IO::Compress::Gzip qw(gzip $GzipError) ;
714     use IO::File ;
715
716     my $input = new IO::File "<file1.txt"
717         or die "Cannot open 'file1.txt': $!\n" ;
718     my $buffer ;
719     gzip $input => \$buffer 
720         or die "gzip failed: $GzipError\n";
721
722 To compress all files in the directory "/my/home" that match "*.txt"
723 and store the compressed data in the same directory
724
725     use strict ;
726     use warnings ;
727     use IO::Compress::Gzip qw(gzip $GzipError) ;
728
729     gzip '</my/home/*.txt>' => '<*.gz>'
730         or die "gzip failed: $GzipError\n";
731
732 and if you want to compress each file one at a time, this will do the trick
733
734     use strict ;
735     use warnings ;
736     use IO::Compress::Gzip qw(gzip $GzipError) ;
737
738     for my $input ( glob "/my/home/*.txt" )
739     {
740         my $output = "$input.gz" ;
741         gzip $input => $output 
742             or die "Error compressing '$input': $GzipError\n";
743     }
744
745
746 =head1 OO Interface
747
748 =head2 Constructor
749
750 The format of the constructor for C<IO::Compress::Gzip> is shown below
751
752     my $z = new IO::Compress::Gzip $output [,OPTS]
753         or die "IO::Compress::Gzip failed: $GzipError\n";
754
755 It returns an C<IO::Compress::Gzip> object on success and undef on failure. 
756 The variable C<$GzipError> will contain an error message on failure.
757
758 If you are running Perl 5.005 or better the object, C<$z>, returned from 
759 IO::Compress::Gzip can be used exactly like an L<IO::File|IO::File> filehandle. 
760 This means that all normal output file operations can be carried out 
761 with C<$z>. 
762 For example, to write to a compressed file/buffer you can use either of 
763 these forms
764
765     $z->print("hello world\n");
766     print $z "hello world\n";
767
768 The mandatory parameter C<$output> is used to control the destination
769 of the compressed data. This parameter can take one of these forms.
770
771 =over 5
772
773 =item A filename
774
775 If the C<$output> parameter is a simple scalar, it is assumed to be a
776 filename. This file will be opened for writing and the compressed data
777 will be written to it.
778
779 =item A filehandle
780
781 If the C<$output> parameter is a filehandle, the compressed data will be
782 written to it.
783 The string '-' can be used as an alias for standard output.
784
785
786 =item A scalar reference 
787
788 If C<$output> is a scalar reference, the compressed data will be stored
789 in C<$$output>.
790
791 =back
792
793 If the C<$output> parameter is any other type, C<IO::Compress::Gzip>::new will
794 return undef.
795
796 =head2 Constructor Options
797
798 C<OPTS> is any combination of the following options:
799
800 =over 5
801
802 =item -AutoClose =E<gt> 0|1
803
804 This option is only valid when the C<$output> parameter is a filehandle. If
805 specified, and the value is true, it will result in the C<$output> being
806 closed once either the C<close> method is called or the C<IO::Compress::Gzip>
807 object is destroyed.
808
809 This parameter defaults to 0.
810
811 =item -Append =E<gt> 0|1
812
813 Opens C<$output> in append mode. 
814
815 The behaviour of this option is dependent on the type of C<$output>.
816
817 =over 5
818
819 =item * A Buffer
820
821 If C<$output> is a buffer and C<Append> is enabled, all compressed data
822 will be append to the end if C<$output>. Otherwise C<$output> will be
823 cleared before any data is written to it.
824
825 =item * A Filename
826
827 If C<$output> is a filename and C<Append> is enabled, the file will be
828 opened in append mode. Otherwise the contents of the file, if any, will be
829 truncated before any compressed data is written to it.
830
831 =item * A Filehandle
832
833 If C<$output> is a filehandle, the file pointer will be positioned to the
834 end of the file via a call to C<seek> before any compressed data is written
835 to it.  Otherwise the file pointer will not be moved.
836
837 =back
838
839 This parameter defaults to 0.
840
841 =item -Merge =E<gt> 0|1
842
843 This option is used to compress input data and append it to an existing
844 compressed data stream in C<$output>. The end result is a single compressed
845 data stream stored in C<$output>. 
846
847
848
849 It is a fatal error to attempt to use this option when C<$output> is not an
850 RFC 1952 data stream.
851
852
853
854 There are a number of other limitations with the C<Merge> option:
855
856 =over 5 
857
858 =item 1
859
860 This module needs to have been built with zlib 1.2.1 or better to work. A
861 fatal error will be thrown if C<Merge> is used with an older version of
862 zlib.  
863
864 =item 2
865
866 If C<$output> is a file or a filehandle, it must be seekable.
867
868 =back
869
870
871 This parameter defaults to 0.
872
873 =item -Level 
874
875 Defines the compression level used by zlib. The value should either be
876 a number between 0 and 9 (0 means no compression and 9 is maximum
877 compression), or one of the symbolic constants defined below.
878
879    Z_NO_COMPRESSION
880    Z_BEST_SPEED
881    Z_BEST_COMPRESSION
882    Z_DEFAULT_COMPRESSION
883
884 The default is Z_DEFAULT_COMPRESSION.
885
886 Note, these constants are not imported by C<IO::Compress::Gzip> by default.
887
888     use IO::Compress::Gzip qw(:strategy);
889     use IO::Compress::Gzip qw(:constants);
890     use IO::Compress::Gzip qw(:all);
891
892 =item -Strategy 
893
894 Defines the strategy used to tune the compression. Use one of the symbolic
895 constants defined below.
896
897    Z_FILTERED
898    Z_HUFFMAN_ONLY
899    Z_RLE
900    Z_FIXED
901    Z_DEFAULT_STRATEGY
902
903 The default is Z_DEFAULT_STRATEGY.
904
905
906
907
908
909 =item -Minimal =E<gt> 0|1
910
911 If specified, this option will force the creation of the smallest possible
912 compliant gzip header (which is exactly 10 bytes long) as defined in
913 RFC 1952.
914
915 See the section titled "Compliance" in RFC 1952 for a definition 
916 of the values used for the fields in the gzip header.
917
918 All other parameters that control the content of the gzip header will
919 be ignored if this parameter is set to 1.
920
921 This parameter defaults to 0.
922
923 =item -Comment =E<gt> $comment
924
925 Stores the contents of C<$comment> in the COMMENT field in
926 the gzip header.
927 By default, no comment field is written to the gzip file.
928
929 If the C<-Strict> option is enabled, the comment can only consist of ISO
930 8859-1 characters plus line feed.
931
932 If the C<-Strict> option is disabled, the comment field can contain any
933 character except NULL. If any null characters are present, the field
934 will be truncated at the first NULL.
935
936 =item -Name =E<gt> $string
937
938 Stores the contents of C<$string> in the gzip NAME header field. If
939 C<Name> is not specified, no gzip NAME field will be created.
940
941 If the C<-Strict> option is enabled, C<$string> can only consist of ISO
942 8859-1 characters.
943
944 If C<-Strict> is disabled, then C<$string> can contain any character
945 except NULL. If any null characters are present, the field will be
946 truncated at the first NULL.
947
948 =item -Time =E<gt> $number
949
950 Sets the MTIME field in the gzip header to $number.
951
952 This field defaults to the time the C<IO::Compress::Gzip> object was created
953 if this option is not specified.
954
955 =item -TextFlag =E<gt> 0|1
956
957 This parameter controls the setting of the FLG.FTEXT bit in the gzip
958 header. It is used to signal that the data stored in the gzip file/buffer
959 is probably text.
960
961 The default is 0. 
962
963 =item -HeaderCRC =E<gt> 0|1
964
965 When true this parameter will set the FLG.FHCRC bit to 1 in the gzip header
966 and set the CRC16 header field to the CRC of the complete gzip header
967 except the CRC16 field itself.
968
969 B<Note> that gzip files created with the C<HeaderCRC> flag set to 1 cannot
970 be read by most, if not all, of the the standard gunzip utilities, most
971 notably gzip version 1.2.4. You should therefore avoid using this option if
972 you want to maximize the portability of your gzip files.
973
974 This parameter defaults to 0.
975
976 =item -OS_Code =E<gt> $value
977
978 Stores C<$value> in the gzip OS header field. A number between 0 and 255 is
979 valid.
980
981 If not specified, this parameter defaults to the OS code of the Operating
982 System this module was built on. The value 3 is used as a catch-all for all
983 Unix variants and unknown Operating Systems.
984
985 =item -ExtraField =E<gt> $data
986
987 This parameter allows additional metadata to be stored in the ExtraField in
988 the gzip header. An RFC1952 compliant ExtraField consists of zero or more
989 subfields. Each subfield consists of a two byte header followed by the
990 subfield data.
991
992 The list of subfields can be supplied in any of the following formats
993
994     -ExtraField => [$id1, $data1,
995                     $id2, $data2,
996                      ...
997                    ]
998     -ExtraField => [ [$id1 => $data1],
999                      [$id2 => $data2],
1000                      ...
1001                    ]
1002     -ExtraField => { $id1 => $data1,
1003                      $id2 => $data2,
1004                      ...
1005                    }
1006
1007 Where C<$id1>, C<$id2> are two byte subfield ID's. The second byte of
1008 the ID cannot be 0, unless the C<Strict> option has been disabled.
1009
1010 If you use the hash syntax, you have no control over the order in which
1011 the ExtraSubFields are stored, plus you cannot have SubFields with
1012 duplicate ID.
1013
1014 Alternatively the list of subfields can by supplied as a scalar, thus
1015
1016     -ExtraField => $rawdata
1017
1018 If you use the raw format, and the C<Strict> option is enabled,
1019 C<IO::Compress::Gzip> will check that C<$rawdata> consists of zero or more
1020 conformant sub-fields. When C<Strict> is disabled, C<$rawdata> can
1021 consist of any arbitrary byte stream.
1022
1023 The maximum size of the Extra Field 65535 bytes.
1024
1025 =item -ExtraFlags =E<gt> $value
1026
1027 Sets the XFL byte in the gzip header to C<$value>.
1028
1029 If this option is not present, the value stored in XFL field will be
1030 determined by the setting of the C<Level> option.
1031
1032 If C<Level =E<gt> Z_BEST_SPEED> has been specified then XFL is set to 2.
1033 If C<Level =E<gt> Z_BEST_COMPRESSION> has been specified then XFL is set to 4.
1034 Otherwise XFL is set to 0.
1035
1036
1037
1038 =item -Strict =E<gt> 0|1
1039
1040
1041
1042 C<Strict> will optionally police the values supplied with other options
1043 to ensure they are compliant with RFC1952.
1044
1045 This option is enabled by default.
1046
1047 If C<Strict> is enabled the following behaviour will be policed:
1048
1049 =over 5
1050
1051 =item * 
1052
1053 The value supplied with the C<Name> option can only contain ISO 8859-1
1054 characters.
1055
1056 =item * 
1057
1058 The value supplied with the C<Comment> option can only contain ISO 8859-1
1059 characters plus line-feed.
1060
1061 =item *
1062
1063 The values supplied with the C<-Name> and C<-Comment> options cannot
1064 contain multiple embedded nulls.
1065
1066 =item * 
1067
1068 If an C<ExtraField> option is specified and it is a simple scalar,
1069 it must conform to the sub-field structure as defined in RFC1952.
1070
1071 =item * 
1072
1073 If an C<ExtraField> option is specified the second byte of the ID will be
1074 checked in each subfield to ensure that it does not contain the reserved
1075 value 0x00.
1076
1077 =back
1078
1079 When C<Strict> is disabled the following behaviour will be policed:
1080
1081 =over 5
1082
1083 =item * 
1084
1085 The value supplied with C<-Name> option can contain
1086 any character except NULL.
1087
1088 =item * 
1089
1090 The value supplied with C<-Comment> option can contain any character
1091 except NULL.
1092
1093 =item *
1094
1095 The values supplied with the C<-Name> and C<-Comment> options can contain
1096 multiple embedded nulls. The string written to the gzip header will
1097 consist of the characters up to, but not including, the first embedded
1098 NULL.
1099
1100 =item * 
1101
1102 If an C<ExtraField> option is specified and it is a simple scalar, the
1103 structure will not be checked. The only error is if the length is too big.
1104
1105 =item * 
1106
1107 The ID header in an C<ExtraField> sub-field can consist of any two bytes.
1108
1109 =back
1110
1111
1112
1113 =back
1114
1115 =head2 Examples
1116
1117 TODO
1118
1119 =head1 Methods 
1120
1121 =head2 print
1122
1123 Usage is
1124
1125     $z->print($data)
1126     print $z $data
1127
1128 Compresses and outputs the contents of the C<$data> parameter. This
1129 has the same behaviour as the C<print> built-in.
1130
1131 Returns true if successful.
1132
1133 =head2 printf
1134
1135 Usage is
1136
1137     $z->printf($format, $data)
1138     printf $z $format, $data
1139
1140 Compresses and outputs the contents of the C<$data> parameter.
1141
1142 Returns true if successful.
1143
1144 =head2 syswrite
1145
1146 Usage is
1147
1148     $z->syswrite $data
1149     $z->syswrite $data, $length
1150     $z->syswrite $data, $length, $offset
1151
1152     syswrite $z, $data
1153     syswrite $z, $data, $length
1154     syswrite $z, $data, $length, $offset
1155
1156 Compresses and outputs the contents of the C<$data> parameter.
1157
1158 Returns the number of uncompressed bytes written, or C<undef> if
1159 unsuccessful.
1160
1161 =head2 write
1162
1163 Usage is
1164
1165     $z->write $data
1166     $z->write $data, $length
1167     $z->write $data, $length, $offset
1168
1169 Compresses and outputs the contents of the C<$data> parameter.
1170
1171 Returns the number of uncompressed bytes written, or C<undef> if
1172 unsuccessful.
1173
1174 =head2 flush
1175
1176 Usage is
1177
1178     $z->flush;
1179     $z->flush($flush_type);
1180     flush $z ;
1181     flush $z $flush_type;
1182
1183 Flushes any pending compressed data to the output file/buffer.
1184
1185 This method takes an optional parameter, C<$flush_type>, that controls
1186 how the flushing will be carried out. By default the C<$flush_type>
1187 used is C<Z_FINISH>. Other valid values for C<$flush_type> are
1188 C<Z_NO_FLUSH>, C<Z_SYNC_FLUSH>, C<Z_FULL_FLUSH> and C<Z_BLOCK>. It is
1189 strongly recommended that you only set the C<flush_type> parameter if
1190 you fully understand the implications of what it does - overuse of C<flush>
1191 can seriously degrade the level of compression achieved. See the C<zlib>
1192 documentation for details.
1193
1194 Returns true on success.
1195
1196
1197 =head2 tell
1198
1199 Usage is
1200
1201     $z->tell()
1202     tell $z
1203
1204 Returns the uncompressed file offset.
1205
1206 =head2 eof
1207
1208 Usage is
1209
1210     $z->eof();
1211     eof($z);
1212
1213
1214
1215 Returns true if the C<close> method has been called.
1216
1217
1218
1219 =head2 seek
1220
1221     $z->seek($position, $whence);
1222     seek($z, $position, $whence);
1223
1224
1225
1226
1227 Provides a sub-set of the C<seek> functionality, with the restriction
1228 that it is only legal to seek forward in the output file/buffer.
1229 It is a fatal error to attempt to seek backward.
1230
1231 Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
1232
1233
1234
1235 The C<$whence> parameter takes one the usual values, namely SEEK_SET,
1236 SEEK_CUR or SEEK_END.
1237
1238 Returns 1 on success, 0 on failure.
1239
1240 =head2 binmode
1241
1242 Usage is
1243
1244     $z->binmode
1245     binmode $z ;
1246
1247 This is a noop provided for completeness.
1248
1249 =head2 fileno
1250
1251     $z->fileno()
1252     fileno($z)
1253
1254 If the C<$z> object is associated with a file, this method will return
1255 the underlying filehandle.
1256
1257 If the C<$z> object is is associated with a buffer, this method will
1258 return undef.
1259
1260 =head2 close
1261
1262     $z->close() ;
1263     close $z ;
1264
1265
1266
1267 Flushes any pending compressed data and then closes the output file/buffer. 
1268
1269
1270
1271 For most versions of Perl this method will be automatically invoked if
1272 the IO::Compress::Gzip object is destroyed (either explicitly or by the
1273 variable with the reference to the object going out of scope). The
1274 exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
1275 these cases, the C<close> method will be called automatically, but
1276 not until global destruction of all live objects when the program is
1277 terminating.
1278
1279 Therefore, if you want your scripts to be able to run on all versions
1280 of Perl, you should call C<close> explicitly and not rely on automatic
1281 closing.
1282
1283 Returns true on success, otherwise 0.
1284
1285 If the C<AutoClose> option has been enabled when the IO::Compress::Gzip
1286 object was created, and the object is associated with a file, the
1287 underlying file will also be closed.
1288
1289
1290
1291
1292 =head2 newStream([OPTS])
1293
1294 Usage is
1295
1296     $z->newStream( [OPTS] )
1297
1298 Closes the current compressed data stream and starts a new one.
1299
1300 OPTS consists of the following sub-set of the the options that are
1301 available when creating the C<$z> object,
1302
1303 =over 5
1304
1305 =item * Level
1306
1307 =item * TODO
1308
1309 =back
1310
1311 =head2 deflateParams
1312
1313 Usage is
1314
1315     $z->deflateParams
1316
1317 TODO
1318
1319 =head1 Importing 
1320
1321 A number of symbolic constants are required by some methods in 
1322 C<IO::Compress::Gzip>. None are imported by default.
1323
1324 =over 5
1325
1326 =item :all
1327
1328 Imports C<gzip>, C<$GzipError> and all symbolic
1329 constants that can be used by C<IO::Compress::Gzip>. Same as doing this
1330
1331     use IO::Compress::Gzip qw(gzip $GzipError :constants) ;
1332
1333 =item :constants
1334
1335 Import all symbolic constants. Same as doing this
1336
1337     use IO::Compress::Gzip qw(:flush :level :strategy) ;
1338
1339 =item :flush
1340
1341 These symbolic constants are used by the C<flush> method.
1342
1343     Z_NO_FLUSH
1344     Z_PARTIAL_FLUSH
1345     Z_SYNC_FLUSH
1346     Z_FULL_FLUSH
1347     Z_FINISH
1348     Z_BLOCK
1349
1350
1351 =item :level
1352
1353 These symbolic constants are used by the C<Level> option in the constructor.
1354
1355     Z_NO_COMPRESSION
1356     Z_BEST_SPEED
1357     Z_BEST_COMPRESSION
1358     Z_DEFAULT_COMPRESSION
1359
1360
1361 =item :strategy
1362
1363 These symbolic constants are used by the C<Strategy> option in the constructor.
1364
1365     Z_FILTERED
1366     Z_HUFFMAN_ONLY
1367     Z_RLE
1368     Z_FIXED
1369     Z_DEFAULT_STRATEGY
1370
1371 =back
1372
1373 For 
1374
1375 =head1 EXAMPLES
1376
1377 TODO
1378
1379
1380
1381
1382
1383
1384 =head1 SEE ALSO
1385
1386 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::Uncompress::AnyInflate>
1387
1388 L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
1389
1390 L<File::GlobMapper|File::GlobMapper>, L<Archive::Tar|Archive::Zip>,
1391 L<IO::Zlib|IO::Zlib>
1392
1393 For RFC 1950, 1951 and 1952 see 
1394 F<http://www.faqs.org/rfcs/rfc1950.html>,
1395 F<http://www.faqs.org/rfcs/rfc1951.html> and
1396 F<http://www.faqs.org/rfcs/rfc1952.html>
1397
1398 The primary site for the gzip program is F<http://www.gzip.org>.
1399
1400 =head1 AUTHOR
1401
1402 The I<IO::Compress::Gzip> module was written by Paul Marquess,
1403 F<pmqs@cpan.org>. The latest copy of the module can be
1404 found on CPAN in F<modules/by-module/Compress/Compress-Zlib-x.x.tar.gz>.
1405
1406 The I<zlib> compression library was written by Jean-loup Gailly
1407 F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
1408
1409 The primary site for the I<zlib> compression library is
1410 F<http://www.zlib.org>.
1411
1412 =head1 MODIFICATION HISTORY
1413
1414 See the Changes file.
1415
1416 =head1 COPYRIGHT AND LICENSE
1417  
1418
1419 Copyright (c) 2005-2006 Paul Marquess. All rights reserved.
1420 This program is free software; you can redistribute it and/or
1421 modify it under the same terms as Perl itself.
1422
1423
1424
1425