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