Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Throw unimplemented.
[simgrid.git] / src / smpi / smpif2c.in
index ce1272a..0a48d50 100755 (executable)
@@ -5,23 +5,31 @@ use strict;
 use File::Temp;
 use File::Copy;
 
-my $include="-I@top_srcdir@/include -I@top_srcdir@/include/smpi -I@includedir@ -I@includedir@/smpi";
+my $include="@includeflag@@f2cflags@";
 
 foreach my $fortran (@ARGV) {
    my $output = $fortran;
    $output =~ s/.f$/.c/;
+
+   #print "F2C INPUT : ".$fortran."\n";
+   #print "F2C OUTPUT: ".$output."\n";
+
+   my$outputdir = $output;
+   $outputdir=~s/[^\/]*\.c$//g;
+   #print "F2C DIR   : ".$outputdir."\n";
+
    my $tmp = new File::Temp;
    $tmp->autoflush(1);
-   `f2c $include -w -a $fortran`;
+   #print "f2c -d$outputdir $include -w -a $fortran\n";
+   `f2c -d$outputdir $include -w -a $fortran`;
    die "F2C failed\n" if $?;
-   open F2C,"<$output";
+   open F2C,"<$output" or die "Unable to open file $output";
    my $started = 0;
    print $tmp "#ifndef INTEGER_STAR_8\n";
    print $tmp "#define INTEGER_STAR_8\n";
    print $tmp "#endif\n";
    print $tmp "#include <stdlib.h>\n";
-   print $tmp "#include <smpif.h>\n\n";
-   print $tmp "int __attribute__((weak)) __rank(void) {\n  static __thread int rank = -1;\n\n  if(rank < 0) {\n    rank = smpi_global_rank();\n  }\n  return rank;\n}\n\n";
+   print $tmp "#include <smpif.h>\n";
    while(<F2C>) {
       chomp;
       if(/\/\* Common Block Declarations \*\//) {
@@ -31,7 +39,7 @@ foreach my $fortran (@ARGV) {
          if(/^} (.*?);/) {
             $_ = "}* __attribute__((weak)) $1 = NULL;\n";
          } elsif(/^#define\s*(\S*)\s*\(?([^.]*)(\..*?)?\)?$/) {
-            $_ = "#define $1 $2\[__rank()\]";
+            $_ = "#define $1 $2\[smpi_current_rank\]";
             if(defined $3) {
                $_ .= $3;
             }
@@ -43,8 +51,9 @@ foreach my $fortran (@ARGV) {
       if(/\/\* Table of constant values \*\// || /MAIN__/) {
          $started = 0;
       }
+      $_ =~ s/(mpi_[\w]*_)_/$1/g;
       if(/\/* Main program alias \*\/\s*int\s+.*\s*\(\s*\)\s*{(.*)}/) {
-         $_ = "int smpi_simulated_main(int argc, char** argv) { smpi_process_init(&argc, &argv); $1 }\n";
+         $_ = "int smpi_simulated_main_(int argc, char** argv) { smpi_process_init(&argc, &argv); $1 }\n";
       }
       print $tmp "$_\n";
    }