diff -r a600c1a596f7 -r 8b87ea768cb8 williamr/find_public_apis.pl --- a/williamr/find_public_apis.pl Mon Jun 01 15:26:59 2009 +0100 +++ b/williamr/find_public_apis.pl Wed Jun 03 18:33:51 2009 +0100 @@ -20,6 +20,9 @@ use strict; my $debug = 0; +my @public_included = (); +my $reason; + sub is_public_api($$) { my ($file,$name) = @_; @@ -27,34 +30,70 @@ if ($name =~ /^epoc32\/include\/platform\//) { # /epoc32/include/platform files are "Platform by export" + $reason = "Platform by export"; return 0; # Not public } + if ($name =~ /\./ && $name !~ /\.(h|rh|hrh|inl|c|hpp)$/i) + { + # Not a file which contains APIs anyway + $reason = "Wrong extension"; + return 0; # not public + } + open FILE, "<$file" or print "ERROR: Cannot open $file: $!\n" and return 1; # assume Public my @lines = ; # they are all of a modest size close FILE; + my @includelines = grep /^\s*#include\s+/, @lines; + my @includefiles = (); + foreach my $includeline (@includelines) + { + if ($includeline =~ /^\s*#include\s+["<](.*\.([^.]+))[">]/) + { + my $filename = $1; + my $extension = $2; + + # print "++ $filename ($extension)\n"; + if ($extension =~ /mbg|rsg|rls|ra/i) + { + # generated file referenced by #include + push @includefiles, $filename; + print STDERR "** $file - $includeline"; + } + } + } + my @apitaglines = grep /\@published|\@internal/, @lines; if (scalar @apitaglines == 0) { # no API classification tags - must be "Public by export" - return 1; # Public API - } - - if ($debug) - { - print join("\n\t", $file, @apitaglines), "\n"; + $reason = "Public by export"; } - my @publishedAll = grep /\@publishedAll/, @apitaglines; - if (scalar @publishedAll == 0) + else { - # the API classification tags are all @publishedPartner or @internal - return 0; # not public + if ($debug) + { + print join("\n\t", $file, @apitaglines), "\n"; + } + my @publishedAll = grep /\@publishedAll/, @apitaglines; + if (scalar @publishedAll == 0) + { + # the API classification tags are all @publishedPartner or @internal + $reason = "Platform by tag"; + return 0; # not public + } + # contains at least one @publishedAll element - must be "Public by tag" + $reason = "Public by tag"; } - # contains at least one @publishedAll element - must be "Public by tag" + push @public_included, @includefiles; # #included files are therefore also public return 1; # Public API } +my %classification; +my %origin; +my %ignoring_case; + sub scan_directory($$) { my ($path, $name) = @_; @@ -76,13 +115,50 @@ if (is_public_api($newpath,$newname)) { - print "$newname\n"; + # print "PUBLIC\t$newname\t$reason\n"; } else { - # print "PARTNER\t$newname\n"; + # print "PARTNER\t$newname\t$reason\n"; + } + $classification{$newname} = $reason; + $origin{$newname} = "Symbian^2"; + $ignoring_case{lc $newname} = $newname; + } + } + +scan_directory("/epoc32/include", "epoc32/include"); + +foreach my $file (@public_included) + { + # print "PUBLIC\tepoc32/include/$file\tIncluded\n"; + my $newname = "epoc32/include/$file"; + $newname = $ignoring_case{lc $newname}; + $classification{$newname} = "Public by Inclusion"; + } + +# Read list of Symbian^1 files +my $line; +while ($line = <>) + { + chomp $line; + $line =~ s/\\/\//g; # Unix separators please + if ($line =~ /(epoc32\/include\/.*)\s*$/) + { + my $name = $1; + $origin{$name} = "Symbian^1"; + if (!defined $ignoring_case{lc $name}) + { + $classification{$name} = "Deleted"; } } } -scan_directory("/epoc32/include", "epoc32/include"); +print "Filename\tClassification\tReason\tOrigin\n"; +foreach my $file (sort keys %classification) + { + my $reason = $classification{$file}; + my $type = "Platform"; + $type = "Public" if ($reason =~ /Public/); + print "$file\t$type\t$reason\t$origin{$file}\n"; + } \ No newline at end of file