#!/usr/bin/perl -w # Combine source and template into a single script use strict; use constant SOURCE => "mobuko9.pl"; use constant TEMPLATE => "template/mobuko.txt.keep"; use Compress::Zlib; # Load source my $file; open $file, "<".SOURCE or die $!; my @lines = <$file>; close $file; $#lines == 2 or die; my $code = $lines[2]; # Compress source my $p = compress($code); my $q = pack 'u*', $p; $q =~ s/\s//sg; print STDERR "Code size = ", length($code), "\n", "Compressed size = ", length($p), "\n", "UUencode size = ", length($q), "\n"; # Add wrapper my $encoded = 'use Compress::Zlib;' . '($c=q{' . $q . '})=~s/\s//sg;' . 'eval uncompress(unpack"u*",$c);'; $encoded =~ s/\s//sg; # Load template open $file, "<".TEMPLATE or die $!; my $template = join '', <$file>; close $file; my $code_ptr = 0; my $template_ptr = 0; for(; $template_ptr < length($template); $template_ptr++) { my $c = substr($template, $template_ptr, 1); if( $c =~ /\s/s ) { print $c; } else { if( $code_ptr >= length($encoded) ) { die "Template too long, excess = " . (length($encoded) - $code_ptr) . "\n"; } print substr($encoded, $code_ptr, 1); $code_ptr++; } } if( $code_ptr != length($encoded) ) { die "Template too short, need = " . ($code_ptr - length($encoded)) . "\n"; }