/
ColdCore-2.1/
#!/usr/bin/perl
#
# uses perl4
#

$parents = "";
$buffer = "";
select(STDOUT); $| = 1;

sub frobfile {
    local($file) = @_;

    if ($file =~ /[^a-z0-9_]/) {
        print "\nInvalid object name \"\$$file\"";
        $file =~ s/[^a-z0-9_]//g;
        print ", stripping to \"\$$file\".\n";
    }

    return $file;
}

sub saveobj {
    local($object) = @_;
    local($objname) = $object;

    $objname =~ s/^object [\$#]//g;
    chop($objname);

    local($file) = &frobfile($objname);

    local($tmp) = "$file.cdc";
    local($index) = 0;
    while (-e $tmp) {
        print "\nFile \"$tmp\" exists, renaming to ";
        $index++;
        $tmp = "$file-$index.cdc";
        print "\"$tmp\".\n";
    }
    $file = $tmp;

    print ".";
    open(FILE, ">$srcdir/$file") || die("\nUnable to write to \"$srcdir\".\n");

    print FILE $parents;
    print FILE $object;
    print FILE $buffer;

    $buffer = "";
    $parents = "";

    close(FILE);
}

sub split {
    while (<DUMP>) {
        if (/^object /) {
            &saveobj($_);
        } elsif (/^parent /) {
            $parents = "${parents}$_";
        } elsif (/^name /) {
            print NAMES;
        } else {
            $buffer = "${buffer}$_";
        }
    }
}

sub unsplit {
    local($name);

    while (<NAMES>) {
        print DUMP $_;
    }

    print DUMP "\n";

    seek(NAMES, 0, 0);

    while (<NAMES>) {
        chop;
        s/^name //g;
        s/ [0-9]+$//g;
        $file = &frobfile($_);
        print STDERR ".";
        $file = "$srcdir/$file.cdc";
        if (-e $file) {
            open(FILE, $file);
            while (<FILE>) {
                print DUMP;
            }
            close(FILE);
        } else {
            print STDERR "\nAck, unable to find file \"$file\".\n";
        }
    }
}

$USAGE = <<END;

Usage: dumpsplit <option> [<dump> <srcdir>]

    dump defaults to "textdump"
    srcdir defaults to "src"

Options:

    -s   -- split
    -u   -- unsplit

END

$_ = $ARGV[0];
shift;

if ($ARGV[0]) { $textdump = $ARGV[0]; } else { $textdump = "textdump"; }
if ($ARGV[1]) { $srcdir = $ARGV[1]; } else { $srcdir = "src"; }

$names = "$srcdir/names";

if (!(-d $srcdir)) {
    mkdir($srcdir) || (print "Unable to make directory \"$srcdir\"." && exit);
}

if (/^-s/) {
    open(DUMP, "$textdump") ||
        (print "${USAGE}Unable to open textdump \"$textdump\".\n" && exit);
    open(NAMES, ">$names") ||
        (print "${USAGE}Unable to open name file \"$names\".\n" && exit);
    print "Splitting db";
    &split();
} elsif (/^-u/) {
    open(DUMP, ">$textdump") ||
        (print "${USAGE}Unable to open textdump \"$textdump\".\n" && exit);
    open(NAMES, "$names") ||
        (print "${USAGE}Unable to open name file \"$names\".\n" && exit);
    print "Unsplitting db";
    &unsplit();
} else {
    print $USAGE;
    exit(0);
}
print "\n";
close(DUMP);
close(NAMES);