79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/perl -w
 | 
						|
# Generate Fortran 2003 wrappers (which translate MPI_Comm from f2c) from
 | 
						|
# function declarations of the form (one per line):
 | 
						|
#     extern <type> fftw_mpi_<name>(...args...)
 | 
						|
#     extern <type> fftw_mpi_<name>(...args...)
 | 
						|
#     ...
 | 
						|
# with no line breaks within a given function.  (It's too much work to
 | 
						|
# write a general parser, since we just have to handle FFTW's header files.)
 | 
						|
# Each declaration has at least one MPI_Comm argument.
 | 
						|
 | 
						|
sub canonicalize_type {
 | 
						|
    my($type);
 | 
						|
    ($type) = @_;
 | 
						|
    $type =~ s/ +/ /g;
 | 
						|
    $type =~ s/^ //;
 | 
						|
    $type =~ s/ $//;
 | 
						|
    $type =~ s/([^\* ])\*/$1 \*/g;
 | 
						|
    $type =~ s/double/R/;
 | 
						|
    $type =~ s/fftw_([A-Za-z0-9_]+)/X(\1)/;
 | 
						|
    return $type;
 | 
						|
}
 | 
						|
 | 
						|
while (<>) {
 | 
						|
    next if /^ *$/;
 | 
						|
    if (/^ *extern +([a-zA-Z_0-9 ]+[ \*]) *fftw_mpi_([a-zA-Z_0-9]+) *\((.*)\) *$/) {
 | 
						|
	$ret = &canonicalize_type($1);
 | 
						|
	$name = $2;
 | 
						|
 | 
						|
	$args = $3;
 | 
						|
 | 
						|
	
 | 
						|
	print "\n$ret XM(${name}_f03)(";
 | 
						|
 | 
						|
	$comma = "";
 | 
						|
	foreach $arg (split(/ *, */, $args)) {
 | 
						|
            $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
 | 
						|
            $argtype = &canonicalize_type($1);
 | 
						|
            $argname = $2;
 | 
						|
	    print $comma;
 | 
						|
	    if ($argtype eq "MPI_Comm") {
 | 
						|
		print "MPI_Fint f_$argname";
 | 
						|
	    }
 | 
						|
	    else {
 | 
						|
		print "$argtype $argname";
 | 
						|
	    }
 | 
						|
	    $comma = ", ";
 | 
						|
        }
 | 
						|
	print ")\n{\n";
 | 
						|
 | 
						|
	print "     MPI_Comm ";
 | 
						|
	$comma = "";
 | 
						|
	foreach $arg (split(/ *, */, $args)) {
 | 
						|
            $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
 | 
						|
            $argtype = &canonicalize_type($1);
 | 
						|
            $argname = $2;
 | 
						|
	    if ($argtype eq "MPI_Comm") {
 | 
						|
		print "$comma$argname";
 | 
						|
		$comma = ", ";
 | 
						|
	    }
 | 
						|
        }
 | 
						|
	print ";\n\n";
 | 
						|
 | 
						|
	foreach $arg (split(/ *, */, $args)) {
 | 
						|
            $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
 | 
						|
            $argtype = &canonicalize_type($1);
 | 
						|
            $argname = $2;
 | 
						|
            if ($argtype eq "MPI_Comm") {
 | 
						|
                print "     $argname = MPI_Comm_f2c(f_$argname);\n";
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
	$argnames = $args;
 | 
						|
	$argnames =~ s/([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) */$2/g;
 | 
						|
	print "     ";
 | 
						|
	print "return " if ($ret ne "void");
 | 
						|
	print "XM($name)($argnames);\n}\n";
 | 
						|
    }
 | 
						|
}
 |