Mercurial > hg > sv-dependency-builds
diff src/fftw-3.3.3/mpi/genf03-wrap.pl @ 10:37bf6b4a2645
Add FFTW3
author | Chris Cannam |
---|---|
date | Wed, 20 Mar 2013 15:35:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/fftw-3.3.3/mpi/genf03-wrap.pl Wed Mar 20 15:35:50 2013 +0000 @@ -0,0 +1,78 @@ +#!/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"; + } +}