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