checkapi.prl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
- #
- # Released to public domain by Donald Anderson dda@world.std.com
- # No warranties.
- #
- # Perl script to check for matching of JNI interfaces to implementation.
- # We check all .cpp arguments and .h arguments and make sure that for
- # each .h declaration (marked by JNIEXPORT keyword), there is a .cpp
- # definition for the same function (also marked by JNIEXPORT keyword),
- # and vice versa. Definitions and declarations are determined solely
- # by whether they are in a .h or .cpp file - we don't do any further
- # analysis.
- #
- # Some additions made to help with Berkeley DB sources:
- #
- # Berkeley DB Java sources use JAVADB_*_ACCESS #defines
- # to quickly define routine access functions.
- foreach $file (<@ARGV>) { # glob allows direct use from Win* makefiles
- open (FILE, $file) || die "$file: cannot openn";
- $dot_h = 0;
- if ($file =~ /.*[hH]$/) {
- $dot_h = 1;
- }
- $in_def = 0;
- nextline:
- while (<FILE>) {
- chop;
- if (/JNIEXPORT/ || /^JAVADB_.*_ACCESS/) {
- $in_def = 1;
- $def = "";
- }
- if ($in_def == 1) {
- $def .= $_;
- }
- if (/)/) {
- $line = "";
- $in_def = 0;
- if ($def eq "") {
- next nextline;
- }
- $_ = $def;
- # remove comments
- s@/*[^*]**/@@g;
- s@[ ][ ]*@ @g;
- s@JNIEnv ** *@JNIEnv @g;
- s@([,*()]) @1@g;
- s@ ([,*()])@1@g;
- s/JAVADB_WO_ACCESS_METHOD/JAVADB_WO_ACCESS/;
- if (/^JAVADB_.*_ACCESS/) {
- s@ *@ @g;
- s@_ACCESS_STRING(([^,]*),@_ACCESS(1,jstring,@;
- s@_ACCESS_BEFORE_APPINIT@_ACCESS@;
- s@_ACCESS(@,normal,@;
- s@JAVADB_@@;
- s@)@,@;
- @vars = split(/,/);
- $get = 0;
- $set = 0;
- if (@vars[0] eq "RW") {
- $get = 1;
- $set = 1;
- }
- if (@vars[0] eq "RO") {
- $get = 1;
- }
- if (@vars[0] eq "WO") {
- $set = 1;
- }
- if ($get == 0 && $set == 0) {
- print "Invalid use of JAVADB_ macron";
- }
- if ($set == 1) {
- $line = "JNIEXPORT void JNICALL Java_com_sleepycat_db_@vars[2]_set_1@vars[4](JNIEnv,jobject,@vars[3])";
- }
- if ($get == 1) {
- $line2 = "JNIEXPORT @vars[3] JNICALL Java_com_sleepycat_db_@vars[2]_get_1@vars[4](JNIEnv,jobject)";
- }
- }
- else {
- s@([,(][a-zA-Z0-9_]*) [a-zA-Z0-9_]*@1@g;
- s@;$@@g;
- $line = $_;
- }
- $def = "";
- if ($line ne "") {
- if ($lines{$line} eq "") {
- $lines{$line} = 0;
- }
- if ($dot_h == 1) {
- $lines{$line} += 1;
- }
- else {
- $lines{$line} -= 1;
- }
- $line = "";
- }
- if ($line2 ne "") {
- if ($lines{$line2} eq "") {
- $lines{$line2} = 0;
- }
- if ($dot_h == 1) {
- $lines{$line2} += 1;
- }
- else {
- $lines{$line2} -= 1;
- }
- $line2 = "";
- }
- }
- }
- close (FILE);
- }
- $status = 0;
- foreach $key (sort keys %lines) {
- if ($lines{$key} != 0) {
- if ($lines{$key} > 0) {
- print "Missing .cpp implementation: $lines${key}n";
- $status = 1;
- }
- else {
- print "Missing .h declaration: $lines${key}n";
- $status = 1;
- }
- }
- }
- exit ($status);