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