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