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