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