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