8 my $include="@includeflag@@f2cflags@";
10 foreach my $fortran (@ARGV) {
11 my $output = $fortran;
14 #print "F2C INPUT : ".$fortran."\n";
15 #print "F2C OUTPUT: ".$output."\n";
17 my$outputdir = $output;
18 $outputdir=~s/[^\/]*\.c$//g;
19 #print "F2C DIR : ".$outputdir."\n";
21 my $tmp = new File::Temp;
23 #print "f2c -d$outputdir $include -w -a $fortran\n";
24 `f2c -d$outputdir $include -w -a $fortran`;
25 die "F2C failed\n" if $?;
26 open F2C,"<$output" or die "Unable to open file $output";
29 print $tmp "#ifndef INTEGER_STAR_8\n";
30 print $tmp "#define INTEGER_STAR_8\n";
31 print $tmp "#endif\n";
32 print $tmp "#include <stdlib.h>\n";
33 print $tmp "#include <smpif.h>\n";
36 if(/\/\* Common Block Declarations \*\//) {
41 $_ = "}* __attribute__((weak)) $1 = NULL;\n";
42 } elsif(/^#define\s*(\S*)\s*\(?([^.]*)(\..*?)?\)?$/) {
43 $_ = "#define $1 $2\[smpi_current_rank\]";
48 $_ .= "\nvoid __attribute__((weak,constructor)) __preinit_$1(void) {\n if(!$2) $2 = malloc(smpi_global_size() * sizeof(*$2));\n}\n";
49 $_ .= "\nvoid __attribute__((weak,destructor)) __postfini_$1(void) {\n free($2);\n $2 = NULL;\n}\n";
52 if(/\/\* Table of constant values \*\// || /MAIN__/) {
55 if(/extern \/\* Subroutine \*\//) {
58 $_ =~ s/(mpi_[\w]*_)_/$1/g;
65 if(/\/* Main program alias \*\/\s*int\s+.*\s*\(\s*\)\s*{(.*)}/) {
66 $_ = "int smpi_simulated_main_(int argc, char** argv) { smpi_process_init(&argc, &argv); $1 }\n";
71 copy($tmp->filename,$output) or die "Copy failed: $!\n";