#!@PERL@
#
# mkcollections.pl - small perl script to convert GNU Classpath's
#                    Collection classes into its own package for java 1.1
#
# USAGE: mkcollections.pl <Destination-Path>
#
# Copyright (C) 2000 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301  USA

my $destpath=@COLLECTIONS_PREFIX@;
my $classpath=pop;
my @javalangclasses=qw(UnsupportedOperationException
		       Comparable
		       Iterable);
my @javautilclasses=qw(AbstractCollection
		       AbstractList
		       AbstractMap
		       AbstractSequentialList
		       AbstractSet
		       ArrayList
		       Arrays
		       List
		       Collection
		       Collections
		       Comparator
		       ConcurrentModificationException
		       HashMap
		       HashSet
		       Hashtable
		       Iterator
		       LinkedList
		       ListIterator
		       Map
		       NoSuchElementException
		       Random
		       RandomAccess
		       Set
		       SortedMap
		       SortedSet
		       TreeMap
		       TreeSet
		       Vector);

my $destPkg = $destpath;
$destPkg  =~ s!/!.!g;

my %imports = ( "Collections" => [ "Enumeration" ],
		"Hashtable" => [ "Dictionary", "Enumeration" ],
		"Vector" => [ "Enumeration" ]);


sub mymkdir ($)
  {
    my ($dir) = @_;
    if ($dir =~ /^(.*)\/\w+$/)
      {
	$parentdir = "$1";
	if (! (-d $parentdir))
	  { 
	    mymkdir ($parentdir);
	  }
      }
    print "$dir";
    mkdir ($dir, 0777);
  }

sub convert($$$) {
    my ($file, $infile, $outfile) = @_;

    open (INPUT, "<$infile") || die "Could not open ", $infile, " for reading\n";

    my $dir = "$outfile";
    $dir =~ /^(.*)\/\S+\.java$/ and
	$dir = "$1";
    if (! (-d $dir)) { 
	mymkdir ($dir); 
    }
 
    open (OUTPUT, ">$outfile") || die "Could not open ", $outfile, " for writing\n";
    print OUTPUT <<'EOF';
/* This file was converted from the GNU Classpath Project by a
 * perl script, written by Jochen Hoenicke <jochen\@gnu.org>.
 */
EOF
    while (<INPUT>) {
	$_ = "package $destPkg;\n" if ($_ =~ /^package java.(lang|util);$/);

	next if $_ =~ /^import java.io.Object.*putStream.*Field;$/;
	next if $_ =~ /^import java.io.ObjectStreamField;$/;

	for $clazz (@javalangclasses) {
	    $_ =~ s/java.lang.$clazz/$clazz/g;
	}
	for $clazz (@javautilclasses) {
	    $_ =~ s/java.util.$clazz/$clazz/g;
	}

	$_ =~ s/abstract (interface)/$1/g;

	print OUTPUT $_;
	if ($_ =~ /^package $destPkg;$/
	    && exists $imports{$file}) {
	    for $imp (@{$imports{$file}}) {
		print OUTPUT "import java.util.$imp;\n";
	    }
	}
    }
    close (OUTPUT);
    close (INPUT);
}

my $file;

for $file (@javalangclasses) {
    my $infile = "$classpath/java/lang/$file.java";
    my $outfile = "$destpath/$file.java";
    print "$outfile\n";
    convert ($file, $infile, $outfile);
}

for $file (@javautilclasses) {
    my $infile = "$classpath/java/util/$file.java";
    my $outfile = "$destpath/$file.java";
    print "$outfile\n";
    convert ($file, $infile, $outfile);
}
