#!/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);