annotate src/fftw-3.3.5/mpi/genf03-wrap.pl @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 7867fa7e1b6b
children
rev   line source
cannam@127 1 #!/usr/bin/perl -w
cannam@127 2 # Generate Fortran 2003 wrappers (which translate MPI_Comm from f2c) from
cannam@127 3 # function declarations of the form (one per line):
cannam@127 4 # extern <type> fftw_mpi_<name>(...args...)
cannam@127 5 # extern <type> fftw_mpi_<name>(...args...)
cannam@127 6 # ...
cannam@127 7 # with no line breaks within a given function. (It's too much work to
cannam@127 8 # write a general parser, since we just have to handle FFTW's header files.)
cannam@127 9 # Each declaration has at least one MPI_Comm argument.
cannam@127 10
cannam@127 11 sub canonicalize_type {
cannam@127 12 my($type);
cannam@127 13 ($type) = @_;
cannam@127 14 $type =~ s/ +/ /g;
cannam@127 15 $type =~ s/^ //;
cannam@127 16 $type =~ s/ $//;
cannam@127 17 $type =~ s/([^\* ])\*/$1 \*/g;
cannam@127 18 $type =~ s/double/R/;
cannam@127 19 $type =~ s/fftw_([A-Za-z0-9_]+)/X(\1)/;
cannam@127 20 return $type;
cannam@127 21 }
cannam@127 22
cannam@127 23 while (<>) {
cannam@127 24 next if /^ *$/;
cannam@127 25 if (/^ *extern +([a-zA-Z_0-9 ]+[ \*]) *fftw_mpi_([a-zA-Z_0-9]+) *\((.*)\) *$/) {
cannam@127 26 $ret = &canonicalize_type($1);
cannam@127 27 $name = $2;
cannam@127 28
cannam@127 29 $args = $3;
cannam@127 30
cannam@127 31
cannam@127 32 print "\n$ret XM(${name}_f03)(";
cannam@127 33
cannam@127 34 $comma = "";
cannam@127 35 foreach $arg (split(/ *, */, $args)) {
cannam@127 36 $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
cannam@127 37 $argtype = &canonicalize_type($1);
cannam@127 38 $argname = $2;
cannam@127 39 print $comma;
cannam@127 40 if ($argtype eq "MPI_Comm") {
cannam@127 41 print "MPI_Fint f_$argname";
cannam@127 42 }
cannam@127 43 else {
cannam@127 44 print "$argtype $argname";
cannam@127 45 }
cannam@127 46 $comma = ", ";
cannam@127 47 }
cannam@127 48 print ")\n{\n";
cannam@127 49
cannam@127 50 print " MPI_Comm ";
cannam@127 51 $comma = "";
cannam@127 52 foreach $arg (split(/ *, */, $args)) {
cannam@127 53 $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
cannam@127 54 $argtype = &canonicalize_type($1);
cannam@127 55 $argname = $2;
cannam@127 56 if ($argtype eq "MPI_Comm") {
cannam@127 57 print "$comma$argname";
cannam@127 58 $comma = ", ";
cannam@127 59 }
cannam@127 60 }
cannam@127 61 print ";\n\n";
cannam@127 62
cannam@127 63 foreach $arg (split(/ *, */, $args)) {
cannam@127 64 $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/;
cannam@127 65 $argtype = &canonicalize_type($1);
cannam@127 66 $argname = $2;
cannam@127 67 if ($argtype eq "MPI_Comm") {
cannam@127 68 print " $argname = MPI_Comm_f2c(f_$argname);\n";
cannam@127 69 }
cannam@127 70 }
cannam@127 71
cannam@127 72 $argnames = $args;
cannam@127 73 $argnames =~ s/([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) */$2/g;
cannam@127 74 print " ";
cannam@127 75 print "return " if ($ret ne "void");
cannam@127 76 print "XM($name)($argnames);\n}\n";
cannam@127 77 }
cannam@127 78 }