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