#!/bin/perl
# -*- perl -*-

print "\nDon't forget to run rmtemps and copywrite in src and include! \n\n";

$| = 1;

$one = shift;

$tmpdir = $ENV{'TMPDIR'};
if ( !defined($tmpdir) ) {
    if ( $^O eq 'dos' ) {
        $tmpdir = $ENV{'TMP'};
        if ( !defined($tmpdir) ) {
            $tmpdir = $ENV{'TEMP'};
            if ( !defined($tmpdir) ) {
                mkdir("./tmp");
                $tmpdir = "./tmp";
            }
        }
    } else {
        $tmpdir = "/tmp";
    }
}

$cc = gcc;

open(DIST, "mkdist.bat");
chdir "..";

system "cp readme.1st zips";
system "cp copying* zips";

while (<DIST>) {
    s/[\r\n]+$//;
    last if /goto exit/;
    next unless /^call mkdist1/;
    next if $one && ! /$one/;
    ($call, $mkdist, $file, $desc) = split(' ', $_, 4);

    unlink "zips/$file.zip";

    print "$file...\n";
    $p = "distrib/p/$file";

    system "cp $p/$file.dsm manifest/$file.dsm";

    open(M, "> manifest/$file.ver");
    print M "$file $desc\r\n";
    close(M);

    print "find...\n";
    &dtou("$p/files");
    system "find `cat $tmpdir/d.$$` -type f -print > manifest/$file.mft"
        || die("find");

    if ( -f "$p/skips" ) {
        print "skips...\n";
        &dtou("$p/skips");
        system "sed -f $tmpdir/d.$$ manifest/$file.mft > manifest/$file.tmp"
            || die("sed");
        rename("manifest/$file.tmp", "manifest/$file.mft");
    }

    open(M, ">> manifest/$file.mft");
    print M "manifest/$file.dsm\n";
    print M "manifest/$file.mft\n";
    print M "manifest/$file.ver\n";
    close(M);

    if ( -f "$p/nobins" ) {
        print "nobins...\n";
        if ( !-f "distrib/nobins" ) {
            system "$cc -s -O2 distrib/nobins.c -o distrib/nobins"
                || die("$cc");
        }
        system "distrib/nobins `cat $p/nobins` < manifest/$file.mft > manifest/$file.tmp"
            || die("nobins");
        rename("manifest/$file.tmp", "manifest/$file.mft");
    }

    print "sort...\n";
    system "sort manifest/$file.mft > manifest/$file.tmp"
        || die("sort");
    rename("manifest/$file.tmp", "manifest/$file.mft");

    print "zip...\n";
    system "zip -qq -9 -@ $tmpdir/$file.zip < manifest/$file.mft"
        || die("zip");
    system "cp $tmpdir/$file.zip zips/$file.zip";
    unlink "$tmpdir/$file.zip";

    print "done.\n";
    last unless -f "zips/$file.zip";

    $sz = (stat("zips/$file.zip"))[7];
    0 while $sz =~ s/(.*\d)(\d\d\d)/$1,$2/;
    printf "%12s %s.zip\n\n", $sz, $file;
}

sub dtou {
    local($s) = @_;
    open(S, $s);
    open(D, ">$tmpdir/d.$$");
    while (<S>) {
        s/\r//g;
        print D;
    }
    close(S);
    close(D);
}
unlink "$tmpdir/d.$$";
