Hello everybody, today I've got three things on my mind: 1. The bug database on www.kaffe.org still seems to be broken, browsing to www.kaffe.org and clicking on the Bug Database link in the navigational frame just opens another navigational bar and kaffe homepage in my browser. 2. Since I'm needing JDBC 2.0 I'll probably enhance Kaffe's JDBC support. Are there any objections in generating the needed interfaces by using reflection on Sun's classes? Or is that "too close to Sun's source" to be cleanroom. If I'm just supposed to read the docs only, how am I supposed to find out the values for static constants? By the way, last week I've thrown together a perl script that reads JavaDoc and creates interfaces/class skeletons from what it finds. I'll append it below in case anybody finds it useful. 3. The ChangeLog for Kaffe seems to be maintained manually. Do you know there's a nice Perl script which generates ChangeLog files from CVS' commit messages? Have a look at it at http://www.red-bean.com/~kfogel/cvs2cl.shtml Froh And here's the skeleton generator, have fun with it. #!/usr/bin/perl -w # # Parseapidoc # # A simple, fast hack to parse openly available Java documentation and generate # interfaces from it. There's no warranty attached to this, if it breaks you # keep the pieces. Use, copy and modify this as much as you like. # # In case Sun changes javadoc's output this script has to be changed ;-) # foreach $file (@ARGV) { undef $@; if ($file !~ m/package-/) # filter out package-tree etc. { eval { open(IN, "<$file") || die("Cannot open $file: $!\n"); $in = \*IN; $outfile = $file; $outfile =~ s|/|.|g; $outfile =~ s|\.html|.java|; open (OUT, ">$outfile") || die("Cannot open $outfile for writing: $!\n"); $out = \*OUT; # $out = \*STDOUT; print $out ("/* Automatically generated from $file by parseapidoc.pl */\n\n"); classdecl(); fields(); print $out "}\n\n"; }; } warn ("$@\t... propagated for $file\n") if ($@); close(IN); close(OUT); } sub classdecl() { while (<$in>) { chomp; last if m/======== START OF CLASS DATA ========/; } <$in> || die "premature EOF"; # Eat the <H2> <$in> || die "premature EOF"; # Eat the <FONT SIZE> $pkg=<$in> || die "premature EOF"; # Contains pack.age.foo</FONT> chomp $pkg; $pkg = removetags($pkg); print $out "package $pkg;\n\n"; while (<$in>) { last if m/<HR>/; } <$in> || die "premature EOF"; # Eat the <DL> $cls = <$in> || die "premature EOF"; # contains the declaration. chomp $cls; $cls = removetags($cls); $cls =~ s/abstract interface/interface/g; $cls =~ s/ *extends/\n extends/g; $cls =~ s/ *implements/\n implements/g; print $out "$cls\n{\n"; } # Also handles constructors and methods ... sub fields() { while (<$in>) { chomp; last if m/FIELD DETAIL/; } while (1) { while (<$in>) { last if m/<PRE>/i; return if m/END OF CLASS DATA/; } my $done = 0; my $val = ""; while (!$done) { chomp; $done = 1 if m|</PRE>|i; $_ = removetags($_); $val .= $_; $_ = <$in> || die "premature EOF"; } $val =~ s| *, *|, |g; $val =~ s| *\( *|(|g; $val =~ s| *throws| throws|g; print $out " $val;\n"; } } sub removetags { my ($s) = @_; $s =~ s/<.*?>/ /g; $s =~ s/ / /g; $s =~ s/ +/ /g; $s =~ s/^ *//; $s =~ s/ *$//; return $s; }