fast_lzss.pl 747 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/perl
  2. # Fast LZSS compressor/decompressor.
  3. # usage:
  4. # perl script.pl < input.txt > compressed.enc
  5. # perl script.pl -d < compressed.enc > decompressed.txt
  6. use 5.036;
  7. use lib qw(../lib);
  8. use Getopt::Std qw(getopts);
  9. use Compression::Util qw(:all);
  10. use constant {CHUNK_SIZE => 1 << 20};
  11. local $Compression::Util::VERBOSE = 0;
  12. getopts('d', \my %opts);
  13. sub compress ($fh, $out_fh) {
  14. while (read($fh, (my $chunk), CHUNK_SIZE)) {
  15. print $out_fh lzss_compress($chunk, \&create_huffman_entry, \&lzss_encode_fast);
  16. }
  17. }
  18. sub decompress ($fh, $out_fh) {
  19. while (!eof($fh)) {
  20. print $out_fh lzss_decompress($fh);
  21. }
  22. }
  23. $opts{d} ? decompress(\*STDIN, \*STDOUT) : compress(\*STDIN, \*STDOUT);