Compress::Zlib becomes zlib agnostic
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / lib / IO / Uncompress / Inflate.pm
CommitLineData
642e522c 1package IO::Uncompress::Inflate ;
2# for RFC1950
3
4use strict ;
5use warnings;
642e522c 6
1a6a8453 7use Compress::Zlib::Common qw(createSelfTiedObject);
8use Compress::Zlib::FileConstants;
9
10use IO::Uncompress::RawInflate ;
642e522c 11
12require Exporter ;
13our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
14
1a6a8453 15$VERSION = '2.000_07';
642e522c 16$InflateError = '';
17
1a6a8453 18@ISA = qw( Exporter IO::Uncompress::RawInflate );
642e522c 19@EXPORT_OK = qw( $InflateError inflate ) ;
1a6a8453 20%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ;
642e522c 21push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
22Exporter::export_ok_tags('all');
23
24
25sub new
26{
1a6a8453 27 my $class = shift ;
28 my $obj = createSelfTiedObject($class, \$InflateError);
29
30 $obj->_create(undef, 0, @_);
642e522c 31}
32
33sub inflate
34{
1a6a8453 35 my $obj = createSelfTiedObject(undef, \$InflateError);
36 return $obj->_inf(@_);
37}
38
39sub getExtraParams
40{
41 return ();
42}
43
44sub ckParams
45{
46 my $self = shift ;
47 my $got = shift ;
48
49 # gunzip always needs adler32
50 $got->value('ADLER32' => 1);
51
52 return 1;
53}
54
55sub ckMagic
56{
57 my $self = shift;
58
59 my $magic ;
60 $self->smartReadExact(\$magic, ZLIB_HEADER_SIZE);
61
62 *$self->{HeaderPending} = $magic ;
63
64 return $self->HeaderError("Header size is " .
65 ZLIB_HEADER_SIZE . " bytes")
66 if length $magic != ZLIB_HEADER_SIZE;
67
68 return $self->HeaderError("CRC mismatch.")
69 if ! isZlibMagic($magic) ;
70
71 *$self->{Type} = 'rfc1950';
72 return $magic;
73}
74
75sub readHeader
76{
77 my $self = shift;
78 my $magic = shift ;
79
80 return $self->_readDeflateHeader($magic) ;
81}
82
83sub chkTrailer
84{
85 my $self = shift;
86 my $trailer = shift;
87
88 my $ADLER32 = unpack("N", $trailer) ;
89 *$self->{Info}{ADLER32} = $ADLER32;
90 return $self->TrailerError("CRC mismatch")
91 if *$self->{Strict} && $ADLER32 != *$self->{Uncomp}->adler32() ;
92
93 return 1;
94}
95
96
97
98sub isZlibMagic
99{
100 my $buffer = shift ;
101 return 0 if length $buffer < ZLIB_HEADER_SIZE ;
102 my $hdr = unpack("n", $buffer) ;
103 return $hdr % 31 == 0 ;
642e522c 104}
105
1a6a8453 106sub bits
107{
108 my $data = shift ;
109 my $offset = shift ;
110 my $mask = shift ;
111
112 ($data >> $offset ) & $mask & 0xFF ;
113}
114
115
116sub _readDeflateHeader
117{
118 my ($self, $buffer) = @_ ;
119
120# if (! $buffer) {
121# $self->smartReadExact(\$buffer, ZLIB_HEADER_SIZE);
122#
123# *$self->{HeaderPending} = $buffer ;
124#
125# return $self->HeaderError("Header size is " .
126# ZLIB_HEADER_SIZE . " bytes")
127# if length $buffer != ZLIB_HEADER_SIZE;
128#
129# return $self->HeaderError("CRC mismatch.")
130# if ! isZlibMagic($buffer) ;
131# }
132
133 my ($CMF, $FLG) = unpack "C C", $buffer;
134 my $FDICT = bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ),
135
136 my $cm = bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS) ;
137 $cm == ZLIB_CMF_CM_DEFLATED
138 or return $self->HeaderError("Not Deflate (CM is $cm)") ;
139
140 my $DICTID;
141 if ($FDICT) {
142 $self->smartReadExact(\$buffer, ZLIB_FDICT_SIZE)
143 or return $self->TruncatedHeader("FDICT");
144
145 $DICTID = unpack("N", $buffer) ;
146 }
147
148 *$self->{Type} = 'rfc1950';
149
150 return {
151 'Type' => 'rfc1950',
152 'FingerprintLength' => ZLIB_HEADER_SIZE,
153 'HeaderLength' => ZLIB_HEADER_SIZE,
154 'TrailerLength' => ZLIB_TRAILER_SIZE,
155 'Header' => $buffer,
156
157 CMF => $CMF ,
158 CM => bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS ),
159 CINFO => bits($CMF, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS ),
160 FLG => $FLG ,
161 FCHECK => bits($FLG, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS),
162 FDICT => bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ),
163 FLEVEL => bits($FLG, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS ),
164 DICTID => $DICTID ,
165
166 };
167}
168
169
170
171
642e522c 1721 ;
173
174__END__
175
176
177=head1 NAME
178
179IO::Uncompress::Inflate - Perl interface to read RFC 1950 files/buffers
180
181=head1 SYNOPSIS
182
183 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
184
185 my $status = inflate $input => $output [,OPTS]
186 or die "inflate failed: $InflateError\n";
187
188 my $z = new IO::Uncompress::Inflate $input [OPTS]
189 or die "inflate failed: $InflateError\n";
190
191 $status = $z->read($buffer)
192 $status = $z->read($buffer, $length)
193 $status = $z->read($buffer, $length, $offset)
194 $line = $z->getline()
195 $char = $z->getc()
196 $char = $z->ungetc()
197 $status = $z->inflateSync()
198 $z->trailingData()
199 $data = $z->getHeaderInfo()
200 $z->tell()
201 $z->seek($position, $whence)
202 $z->binmode()
203 $z->fileno()
204 $z->eof()
205 $z->close()
206
207 $InflateError ;
208
209 # IO::File mode
210
211 <$z>
212 read($z, $buffer);
213 read($z, $buffer, $length);
214 read($z, $buffer, $length, $offset);
215 tell($z)
216 seek($z, $position, $whence)
217 binmode($z)
218 fileno($z)
219 eof($z)
220 close($z)
221
222
223=head1 DESCRIPTION
224
225
226
227B<WARNING -- This is a Beta release>.
228
229=over 5
230
231=item * DO NOT use in production code.
232
233=item * The documentation is incomplete in places.
234
235=item * Parts of the interface defined here are tentative.
236
237=item * Please report any problems you find.
238
239=back
240
241
242
243
244
1a6a8453 245This module provides a Perl interface that allows the reading of
642e522c 246files/buffers that conform to RFC 1950.
247
1a6a8453 248For writing RFC 1950 files/buffers, see the companion module IO::Compress::Deflate.
642e522c 249
250
251
252=head1 Functional Interface
253
1a6a8453 254A top-level function, C<inflate>, is provided to carry out
255"one-shot" uncompression between buffers and/or files. For finer
256control over the uncompression process, see the L</"OO Interface">
257section.
642e522c 258
259 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
260
261 inflate $input => $output [,OPTS]
262 or die "inflate failed: $InflateError\n";
263
1a6a8453 264
642e522c 265
266The functional interface needs Perl5.005 or better.
267
268
269=head2 inflate $input => $output [, OPTS]
270
1a6a8453 271
272C<inflate> expects at least two parameters, C<$input> and C<$output>.
642e522c 273
274=head3 The C<$input> parameter
275
276The parameter, C<$input>, is used to define the source of
277the compressed data.
278
279It can take one of the following forms:
280
281=over 5
282
283=item A filename
284
285If the C<$input> parameter is a simple scalar, it is assumed to be a
286filename. This file will be opened for reading and the input data
287will be read from it.
288
289=item A filehandle
290
291If the C<$input> parameter is a filehandle, the input data will be
292read from it.
293The string '-' can be used as an alias for standard input.
294
295=item A scalar reference
296
297If C<$input> is a scalar reference, the input data will be read
298from C<$$input>.
299
300=item An array reference
301
1a6a8453 302If C<$input> is an array reference, each element in the array must be a
303filename.
304
305The input data will be read from each file in turn.
306
642e522c 307The complete array will be walked to ensure that it only
1a6a8453 308contains valid filenames before any data is uncompressed.
309
310
642e522c 311
312=item An Input FileGlob string
313
314If C<$input> is a string that is delimited by the characters "<" and ">"
315C<inflate> will assume that it is an I<input fileglob string>. The
316input is the list of files that match the fileglob.
317
318If the fileglob does not match any files ...
319
320See L<File::GlobMapper|File::GlobMapper> for more details.
321
322
323=back
324
325If the C<$input> parameter is any other type, C<undef> will be returned.
326
327
328
329=head3 The C<$output> parameter
330
331The parameter C<$output> is used to control the destination of the
332uncompressed data. This parameter can take one of these forms.
333
334=over 5
335
336=item A filename
337
1a6a8453 338If the C<$output> parameter is a simple scalar, it is assumed to be a
339filename. This file will be opened for writing and the uncompressed
340data will be written to it.
642e522c 341
342=item A filehandle
343
1a6a8453 344If the C<$output> parameter is a filehandle, the uncompressed data
345will be written to it.
642e522c 346The string '-' can be used as an alias for standard output.
347
348
349=item A scalar reference
350
1a6a8453 351If C<$output> is a scalar reference, the uncompressed data will be
352stored in C<$$output>.
642e522c 353
642e522c 354
355
356=item An Array Reference
357
1a6a8453 358If C<$output> is an array reference, the uncompressed data will be
359pushed onto the array.
642e522c 360
361=item An Output FileGlob
362
363If C<$output> is a string that is delimited by the characters "<" and ">"
364C<inflate> will assume that it is an I<output fileglob string>. The
365output is the list of files that match the fileglob.
366
367When C<$output> is an fileglob string, C<$input> must also be a fileglob
368string. Anything else is an error.
369
370=back
371
372If the C<$output> parameter is any other type, C<undef> will be returned.
373
642e522c 374
642e522c 375
376=head2 Notes
377
378When C<$input> maps to multiple files/buffers and C<$output> is a single
1a6a8453 379file/buffer the uncompressed input files/buffers will all be stored
380in C<$output> as a single uncompressed stream.
642e522c 381
382
383
384=head2 Optional Parameters
385
386Unless specified below, the optional parameters for C<inflate>,
387C<OPTS>, are the same as those used with the OO interface defined in the
388L</"Constructor Options"> section below.
389
390=over 5
391
392=item AutoClose =E<gt> 0|1
393
1a6a8453 394This option applies to any input or output data streams to
395C<inflate> that are filehandles.
642e522c 396
397If C<AutoClose> is specified, and the value is true, it will result in all
398input and/or output filehandles being closed once C<inflate> has
399completed.
400
401This parameter defaults to 0.
402
403
404
1a6a8453 405=item BinModeOut =E<gt> 0|1
406
407When writing to a file or filehandle, set C<binmode> before writing to the
408file.
409
410Defaults to 0.
411
412
413
414
415
642e522c 416=item -Append =E<gt> 0|1
417
418TODO
419
1a6a8453 420=item -MultiStream =E<gt> 0|1
421
422Creates a new stream after each file.
423
424Defaults to 1.
425
642e522c 426
427
428=back
429
430
431
432
433=head2 Examples
434
435To read the contents of the file C<file1.txt.1950> and write the
436compressed data to the file C<file1.txt>.
437
438 use strict ;
439 use warnings ;
440 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
441
442 my $input = "file1.txt.1950";
443 my $output = "file1.txt";
444 inflate $input => $output
445 or die "inflate failed: $InflateError\n";
446
447
448To read from an existing Perl filehandle, C<$input>, and write the
449uncompressed data to a buffer, C<$buffer>.
450
451 use strict ;
452 use warnings ;
453 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
454 use IO::File ;
455
456 my $input = new IO::File "<file1.txt.1950"
457 or die "Cannot open 'file1.txt.1950': $!\n" ;
458 my $buffer ;
459 inflate $input => \$buffer
460 or die "inflate failed: $InflateError\n";
461
462To uncompress all files in the directory "/my/home" that match "*.txt.1950" and store the compressed data in the same directory
463
464 use strict ;
465 use warnings ;
466 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
467
468 inflate '</my/home/*.txt.1950>' => '</my/home/#1.txt>'
469 or die "inflate failed: $InflateError\n";
470
471and if you want to compress each file one at a time, this will do the trick
472
473 use strict ;
474 use warnings ;
475 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
476
477 for my $input ( glob "/my/home/*.txt.1950" )
478 {
479 my $output = $input;
480 $output =~ s/.1950// ;
481 inflate $input => $output
482 or die "Error compressing '$input': $InflateError\n";
483 }
484
485=head1 OO Interface
486
487=head2 Constructor
488
489The format of the constructor for IO::Uncompress::Inflate is shown below
490
491
492 my $z = new IO::Uncompress::Inflate $input [OPTS]
493 or die "IO::Uncompress::Inflate failed: $InflateError\n";
494
495Returns an C<IO::Uncompress::Inflate> object on success and undef on failure.
496The variable C<$InflateError> will contain an error message on failure.
497
1a6a8453 498If you are running Perl 5.005 or better the object, C<$z>, returned from
499IO::Uncompress::Inflate can be used exactly like an L<IO::File|IO::File> filehandle.
500This means that all normal input file operations can be carried out with
501C<$z>. For example, to read a line from a compressed file/buffer you can
502use either of these forms
642e522c 503
504 $line = $z->getline();
505 $line = <$z>;
506
507The mandatory parameter C<$input> is used to determine the source of the
508compressed data. This parameter can take one of three forms.
509
510=over 5
511
512=item A filename
513
514If the C<$input> parameter is a scalar, it is assumed to be a filename. This
515file will be opened for reading and the compressed data will be read from it.
516
517=item A filehandle
518
519If the C<$input> parameter is a filehandle, the compressed data will be
520read from it.
521The string '-' can be used as an alias for standard input.
522
523
524=item A scalar reference
525
526If C<$input> is a scalar reference, the compressed data will be read from
527C<$$output>.
528
529=back
530
531=head2 Constructor Options
532
533
534The option names defined below are case insensitive and can be optionally
535prefixed by a '-'. So all of the following are valid
536
537 -AutoClose
538 -autoclose
539 AUTOCLOSE
540 autoclose
541
542OPTS is a combination of the following options:
543
544=over 5
545
546=item -AutoClose =E<gt> 0|1
547
548This option is only valid when the C<$input> parameter is a filehandle. If
549specified, and the value is true, it will result in the file being closed once
550either the C<close> method is called or the IO::Uncompress::Inflate object is
551destroyed.
552
553This parameter defaults to 0.
554
555=item -MultiStream =E<gt> 0|1
556
557
558
559Allows multiple concatenated compressed streams to be treated as a single
560compressed stream. Decompression will stop once either the end of the
561file/buffer is reached, an error is encountered (premature eof, corrupt
562compressed data) or the end of a stream is not immediately followed by the
563start of another stream.
564
565This parameter defaults to 0.
566
567
568
569=item -Prime =E<gt> $string
570
571This option will uncompress the contents of C<$string> before processing the
572input file/buffer.
573
574This option can be useful when the compressed data is embedded in another
575file/data structure and it is not possible to work out where the compressed
1a6a8453 576data begins without having to read the first few bytes. If this is the
577case, the uncompression can be I<primed> with these bytes using this
578option.
642e522c 579
580=item -Transparent =E<gt> 0|1
581
582If this option is set and the input file or buffer is not compressed data,
583the module will allow reading of it anyway.
584
585This option defaults to 1.
586
587=item -BlockSize =E<gt> $num
588
1a6a8453 589When reading the compressed input data, IO::Uncompress::Inflate will read it in
590blocks of C<$num> bytes.
642e522c 591
592This option defaults to 4096.
593
594=item -InputLength =E<gt> $size
595
1a6a8453 596When present this option will limit the number of compressed bytes read
597from the input file/buffer to C<$size>. This option can be used in the
598situation where there is useful data directly after the compressed data
599stream and you know beforehand the exact length of the compressed data
600stream.
642e522c 601
1a6a8453 602This option is mostly used when reading from a filehandle, in which case
603the file pointer will be left pointing to the first byte directly after the
642e522c 604compressed data stream.
605
606
607
608This option defaults to off.
609
610=item -Append =E<gt> 0|1
611
612This option controls what the C<read> method does with uncompressed data.
613
1a6a8453 614If set to 1, all uncompressed data will be appended to the output parameter
615of the C<read> method.
642e522c 616
1a6a8453 617If set to 0, the contents of the output parameter of the C<read> method
618will be overwritten by the uncompressed data.
642e522c 619
620Defaults to 0.
621
622=item -Strict =E<gt> 0|1
623
624
625
626This option controls whether the extra checks defined below are used when
1a6a8453 627carrying out the decompression. When Strict is on, the extra tests are
628carried out, when Strict is off they are not.
642e522c 629
630The default for this option is off.
631
632
633
634
635
636=over 5
637
638=item 1
639
640The ADLER32 checksum field must be present.
641
642=item 2
643
644The value of the ADLER32 field read must match the adler32 value of the
645uncompressed data actually contained in the file.
646
647=back
648
649
650
651
652
653
654
655
656
657=back
658
659=head2 Examples
660
661TODO
662
663=head1 Methods
664
665=head2 read
666
667Usage is
668
669 $status = $z->read($buffer)
670
671Reads a block of compressed data (the size the the compressed block is
672determined by the C<Buffer> option in the constructor), uncompresses it and
1a6a8453 673writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
674set in the constructor, the uncompressed data will be appended to the
675C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
642e522c 676
1a6a8453 677Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
678or a negative number on error.
642e522c 679
680=head2 read
681
682Usage is
683
684 $status = $z->read($buffer, $length)
685 $status = $z->read($buffer, $length, $offset)
686
687 $status = read($z, $buffer, $length)
688 $status = read($z, $buffer, $length, $offset)
689
690Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
691
1a6a8453 692The main difference between this form of the C<read> method and the
693previous one, is that this one will attempt to return I<exactly> C<$length>
694bytes. The only circumstances that this function will not is if end-of-file
695or an IO error is encountered.
642e522c 696
1a6a8453 697Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
698or a negative number on error.
642e522c 699
700
701=head2 getline
702
703Usage is
704
705 $line = $z->getline()
706 $line = <$z>
707
708Reads a single line.
709
710This method fully supports the use of of the variable C<$/>
711(or C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
712determine what constitutes an end of line. Both paragraph mode and file
713slurp mode are supported.
714
715
716=head2 getc
717
718Usage is
719
720 $char = $z->getc()
721
722Read a single character.
723
724=head2 ungetc
725
726Usage is
727
728 $char = $z->ungetc($string)
729
730
731=head2 inflateSync
732
733Usage is
734
735 $status = $z->inflateSync()
736
737TODO
738
739=head2 getHeaderInfo
740
741Usage is
742
1a6a8453 743 $hdr = $z->getHeaderInfo();
744 @hdrs = $z->getHeaderInfo();
642e522c 745
1a6a8453 746This method returns either a hash reference (in scalar context) or a list
747or hash references (in array context) that contains information about each
748of the header fields in the compressed data stream(s).
642e522c 749
750
751
752
753=head2 tell
754
755Usage is
756
757 $z->tell()
758 tell $z
759
760Returns the uncompressed file offset.
761
762=head2 eof
763
764Usage is
765
766 $z->eof();
767 eof($z);
768
769
770
771Returns true if the end of the compressed input stream has been reached.
772
773
774
775=head2 seek
776
777 $z->seek($position, $whence);
778 seek($z, $position, $whence);
779
780
781
782
783Provides a sub-set of the C<seek> functionality, with the restriction
784that it is only legal to seek forward in the input file/buffer.
785It is a fatal error to attempt to seek backward.
786
787
788
789The C<$whence> parameter takes one the usual values, namely SEEK_SET,
790SEEK_CUR or SEEK_END.
791
792Returns 1 on success, 0 on failure.
793
794=head2 binmode
795
796Usage is
797
798 $z->binmode
799 binmode $z ;
800
801This is a noop provided for completeness.
802
803=head2 fileno
804
805 $z->fileno()
806 fileno($z)
807
808If the C<$z> object is associated with a file, this method will return
809the underlying filehandle.
810
811If the C<$z> object is is associated with a buffer, this method will
812return undef.
813
814=head2 close
815
816 $z->close() ;
817 close $z ;
818
819
820
821Closes the output file/buffer.
822
823
824
825For most versions of Perl this method will be automatically invoked if
826the IO::Uncompress::Inflate object is destroyed (either explicitly or by the
827variable with the reference to the object going out of scope). The
828exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
829these cases, the C<close> method will be called automatically, but
830not until global destruction of all live objects when the program is
831terminating.
832
833Therefore, if you want your scripts to be able to run on all versions
834of Perl, you should call C<close> explicitly and not rely on automatic
835closing.
836
837Returns true on success, otherwise 0.
838
839If the C<AutoClose> option has been enabled when the IO::Uncompress::Inflate
840object was created, and the object is associated with a file, the
841underlying file will also be closed.
842
843
844
845
846=head1 Importing
847
848No symbolic constants are required by this IO::Uncompress::Inflate at present.
849
850=over 5
851
852=item :all
853
854Imports C<inflate> and C<$InflateError>.
855Same as doing this
856
857 use IO::Uncompress::Inflate qw(inflate $InflateError) ;
858
859=back
860
861=head1 EXAMPLES
862
863
864
865
866=head1 SEE ALSO
867
868L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Uncompress::AnyInflate>
869
870L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
871
872L<File::GlobMapper|File::GlobMapper>, L<Archive::Tar|Archive::Zip>,
873L<IO::Zlib|IO::Zlib>
874
875For RFC 1950, 1951 and 1952 see
876F<http://www.faqs.org/rfcs/rfc1950.html>,
877F<http://www.faqs.org/rfcs/rfc1951.html> and
878F<http://www.faqs.org/rfcs/rfc1952.html>
879
880The primary site for the gzip program is F<http://www.gzip.org>.
881
882=head1 AUTHOR
883
884The I<IO::Uncompress::Inflate> module was written by Paul Marquess,
885F<pmqs@cpan.org>. The latest copy of the module can be
886found on CPAN in F<modules/by-module/Compress/Compress-Zlib-x.x.tar.gz>.
887
888The I<zlib> compression library was written by Jean-loup Gailly
889F<gzip@prep.ai.mit.edu> and Mark Adler F<madler@alumni.caltech.edu>.
890
891The primary site for the I<zlib> compression library is
892F<http://www.zlib.org>.
893
894=head1 MODIFICATION HISTORY
895
896See the Changes file.
897
898=head1 COPYRIGHT AND LICENSE
899
900
1a6a8453 901Copyright (c) 2005-2006 Paul Marquess. All rights reserved.
642e522c 902This program is free software; you can redistribute it and/or
903modify it under the same terms as Perl itself.
904
905
906