#!/usr/bin/perl

# usage: self files... > self-extractable.pl

use strict;
use warnings;

my $BYTES = 1024;

print while (<DATA>);
print "\n__DATA__\n";
foreach my $arg (@ARGV) {
    open(IN, '<', $arg) or die $!;
    my @lines = ();
    while (1) {
        my $count = read IN, $_, $BYTES;
        defined($count) or die $!;
        last if ($count == 0);
        push @lines, $_;
    }
    close IN;
    print "$arg\n";
    my $bytes = 0;
    foreach my $line (@lines) {
        $bytes += length $line;
    }
    print "$bytes\n";
    foreach my $line (@lines) {
        print $line;
    }
    print "\n";
}

__DATA__
#!/usr/bin/perl

use strict;
use warnings;

my $BYTES = 1024;

while (<DATA>) {
    next if (m/^\s+$/o);
    chomp;
    my $filepath = $_;
    $_ = <DATA>;
    defined($_) or die $!;
    chomp;
    m/^\d+$/o or die;
    my $bytes = int($_);
    open(OUT, '>', $filepath) or die $!;
    while ($bytes > 0) {
        my $count = read DATA, $_, ($BYTES < $bytes ? $BYTES : $bytes);
        defined $count or die $!;
        $count > 0 or die "Unexpected EOF";
        print OUT $_;
        $bytes -= $count;
    }
    close OUT;
}
