classes.pl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. # classes.pl - A perl program to generate most of the contents of
  2. # javaprims.h automatically.
  3. # Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
  4. #
  5. # This file is part of libjava.
  6. #
  7. # This software is copyrighted work licensed under the terms of the
  8. # Libjava License. Please consult the file "LIBJAVA_LICENSE" for
  9. # details.
  10. # Usage: cd <top-srcdir> ; perl classes.pl.
  11. # Can also be run from the `include' directory; this lets us
  12. # more easily insert the output into javaprims.h (which is where it goes).
  13. use DirHandle;
  14. if (-d 'java')
  15. {
  16. # Ok here.
  17. }
  18. elsif (-d '../java')
  19. {
  20. chdir ('..');
  21. }
  22. else
  23. {
  24. die "couldn't find java directory\n";
  25. }
  26. &scan ('java', 2);
  27. exit 0;
  28. sub scan
  29. {
  30. local ($dir, $indent) = @_;
  31. local (@subdirs) = ();
  32. local (%classes) = ();
  33. local ($d) = new DirHandle $dir;
  34. local (*JFILE);
  35. local ($name);
  36. if (defined $d)
  37. {
  38. while (defined ($name = $d->read))
  39. {
  40. next if $name eq 'CVS';
  41. next if $name eq '.';
  42. next if $name eq '..';
  43. if ($dir eq 'java'
  44. && $name ne 'lang'
  45. && $name ne 'util'
  46. && $name ne 'io')
  47. {
  48. # We only generate decls for java.lang, java.io, and
  49. # java.util.
  50. next;
  51. }
  52. if (-d ($dir . '/' . $name))
  53. {
  54. push (@subdirs, $name);
  55. next;
  56. }
  57. next unless $name =~ /\.java$/;
  58. open (FILE, "< $dir/$name");
  59. local ($outer, $classname);
  60. while (<FILE>)
  61. {
  62. s,//.*$,,;
  63. # NOTE: we don't skip `/*' comments. However, we do
  64. # skip lines with a `*' with leading whitespace. This
  65. # catches the most important cases.
  66. s,^\s*\*.*$,,;
  67. # For now assume that class names start with upper
  68. # case letter.
  69. next unless /\b(class|interface) ([A-Z][A-Za-z0-9]+)/;
  70. $classname = $2;
  71. # We assume the code is properly indented, so that we
  72. # can print inner classes properly.
  73. if (/^\s/)
  74. {
  75. die "no outer class for $classname in $dir/$name"
  76. unless $outer;
  77. $classes{$outer . "\$" . $classname} = 1;
  78. }
  79. else
  80. {
  81. $classes{$classname} = 1;
  82. $outer = $classname;
  83. }
  84. }
  85. close (FILE);
  86. }
  87. undef $d;
  88. }
  89. local ($spaces) = ' ' x $indent;
  90. local ($classname);
  91. ($classname = $dir) =~ s/^.*\///;
  92. print $spaces, "namespace ", $classname, "\n";
  93. print $spaces, "{\n";
  94. foreach (sort keys %classes)
  95. {
  96. print $spaces, " class ", $_, ";\n";
  97. }
  98. print "\n" if scalar @classes > 0 && scalar @subdirs > 0;
  99. local ($first) = 1;
  100. foreach (sort @subdirs)
  101. {
  102. print "\n" unless $first;
  103. $first = 0;
  104. &scan ("$dir/$_", $indent + 2);
  105. }
  106. print $spaces, "};\n";
  107. }