#!/usr/bin/perl


























($Pgm = $0) =~ s|.*/||;
&main();
exit(0);




sub main {
  local($going);
  if ($#ARGV<2) {
    print STDERR"usage: bspfpp  realname infile outfile\n";
    exit(1);
  } else {
    $going=1;
    $realname = $ARGV[0];
    $infile   = $ARGV[1];
    $outfile  = $ARGV[2];
    &insertProfileInfo($realname,$infile,$outfile); 
  }
}



sub insertProfileInfo {
  local($realname,$convin,$convout) = @_;
  local($argument,$brackets,$seen,$lastbracket);

  if (!open(INFILE,$convin)) {
    printf STDERR "$Pgm:insertProf: unable to open $convin for reading\n";
    exit(1);
  }

  if (!open(OUTFILE,"> ". $convout)) {
    printf STDERR "$Pgm: unable to open $convout for writing\n";
    exit(1);
  } 
  while($line = <INFILE>) {
    if (($line =~ /^\s*CALL\s+bspsync\s*$/i) ||
        ($line =~ /^\s*CALL\s+bspsync\s*\(\s*\)\s*$/i)) {
      print OUTFILE "        CALL cppsync($.,'$realname')\n";

    } elsif ($line =~ /^\s*CALL\s+bsp\_sstep\_end\s*\(.*\)\s*$/i) {
      print OUTFILE "        CALL cppsync($.,'$realname')\n";

    } elsif ($line=~/^\s*CALL\s+bsp(sync\_number|put|get|hpput|hpget|pushregister|popregister|settagsize|gettagsize|send|move)\(/i) {
      $seen        = "        CALL cpp$1(";
      $lastbracket = "";
      $argument    = $';
      $brackets    = 1;
      while ($brackets>0) {
        if ($argument =~ /(\(|\))/) {
          $brackets++ if ($1 eq "(");
          $brackets-- if ($1 eq ")");
          $seen       .= $lastbracket . $`;
          $lastbracket = $1;
          $argument    = $';
        } else {
          print OUTFILE $seen , $lastbracket, $argument;
          ($line= <INFILE>) || ($brackets=0);
          $argument    = $line;
          $seen        = "";
          $lastbracket = "";
        }
      }
      print OUTFILE "$seen,\n",
                    "     + $.,'$realname')$argument\n";
        
    } else {
      print OUTFILE $line; 
    }
  }
  close(INFILE);
  close(OUTFILE);
}



sub grabArguments {
   local($line)=$_[0];
   local($after_close);
   local($inside_brackets);
   local($level) = 1;
   local($char);
   
   while ($level != 0) {
     if      ($line =~ /\(|\)/ ) {
       if ($& eq "(") {
         $level++;
       } else {
         $level--;
       }
       $inside_brackets .= $` . $&;
       $line = $';
     } else { 
       $inside_brackets .= $line;
       $line = <INFILE>;
       $linenumber++;
     }
   }
   chop($inside_brackets);
   $after_close = $line;

   $level            =0;
   local(@arguments) =();
   local($word)      ="";
   
   foreach $char (split(//,$inside_brackets)) {
      if ("$char" eq "(") {
         $level++;
         $word .= "$char";
      } elsif ("$char" eq ")") {
         $level--;
         $word .= "$char";
      } elsif (("$char" eq ",") && ($level==0)) {
        push(@arguments,$word);
        $word="";
      } else {
        $word .= "$char";
      }        
   }
   push(@arguments,$word);
   push(@arguments,$after_close);
   return(@arguments);
}

