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