Newsgroup: it.comp.lang.c++
Titolo: Da Linux a VC++

Devo fare la conversione di un applicativo perl da linux a windows.
Tra le varie cose chiama anche l'interprete linux g++ per far preprocessare
i file i c++.
Il mio problema è convertire la chiamata per farlo girare sotto VC++.
La chiamata in questione è:
ng++ "-E -P -dD -MMD -imacros $file $pincl $psor $file >$fileout
Quele è l'equivalente chiamata sotto VC++?
Il programma in Perl in cui viene utilizzato è il seguente:
N.B. La chiamata in questione viene fatta nelle ultime righe
Grazie comunque per la vostra attenzione.
#! /usr/bin/perl
# Script: 
preprocessa.pl
# invoca il compilatore g++ con l'opzione di preprocessazione
# ed elabora i sorgenti della directory di input
##########################################################
#
#                sub CreaListaSorgenti
#
#
#########################################################
sub CreaListaSorgenti
{
local ($dir,$dirout)=@_;
local ($fincl, @lista,$trovato,$riga,$fileout, $file,@file,@file2,$dir,
$contr,$i);
  @lista=`ls $dir`;
#print"lista file letti :@lista\n";
  chop (@lista);
  foreach $file (@lista)
    {
      $file=$dir.$file;
      #print "file corrente --$file-\n";
      if( -T $file && -r $file)
          {
    if ($file=~ /(\.cxx|\.hxx|\.h|\.cpp|\.c|\.cc|\.hpp)$/i)
      {
               push(@file,$file);
        push(@perhash,$file);
        $file=$file.'.cxx';
        push(@perhash,$file);
      }
   }
    }  # fine foreach
#creo l'hash
%hash=@perhash;
    ## ad ogni file trovato aggiunge i marcatori di inizio e di fine file
    foreach $file (@file)
       {
         open(IN,"<$file");
          $fileout=$dirout.$hash{$file};
  open(OUT,">$fileout");
  print OUT "int INIZIO_DSI___$file\;\n" ;
  while (!eof(IN))
     {
        $riga=<IN>;
               ## bisogna vedere  se #include contiene una libreria standard
        ## con path iniziale tra 'etc, usr, lib, var ecc..
               ## per sorgenti scritti per W95 le cose sono un pò diverse e
sarà necessario, magari,
        ## una modifica soggettiva in base alle applicazione da analizzare
        if ($riga=~
/^(\#\s*include\s*(\"|\<)(\x2f?(\w+\x2f)*)(\w+(\.\w+)+)(\"|\>))/)
       {
         $fincl=$5;
         ($hash{$5} ne '') && ($fincl=$hash{$5});
         $riga='#include'.$2.$fincl.$7."\n";
       }
            if ($riga=~ /^(\#\s*if)/ || $riga =~ /^(\#\s*end)/ || $riga =~
/^(\#\s*else)/)
               {
                }
  else
  {
   print OUT $riga;
  }
     }
  print OUT "int FINE_DSI___$file\;\n";
 close (OUT);
 close(IN);
        push(@file2,$fileout);
       }
return (@file2);
}
#################################################
#                                               #
#           sub   EliminaCancel_Spazi           #
#                                               #
#################################################
sub   EliminaCancel_Spazi
{
  local($file,$dir)=@_;
  local ($riga,$filetrovato,$fileout,@files);
  local ($fileprinc,@righe);
# estrae i file *.hxx da quelli *.cxx, che sono stati uniti
# dal preprocessorore g++
  @files=();
  @righe=();
  $file=~ /\W*(\w+\.\w+)\W*/;
  $fileprinc=$1;
  $dir.="_in_\_$fileprinc\_fi_";
  $fileout=$dir.$fileprinc;
  print "principal: $fileprinc\n";
  open(IN,"<$file");
   ### int INIZIO_DSI___$file
   ### int FINE_DSI___$file
   while (!eof(IN))
      {
         $riga=<IN>;
  chop($riga); # tolgo lo \n finale
  ($riga=~ /(\w+)|\{|\}/) || next;
  ($riga=~ /^(#.*)/) && next;
  if ($riga =~ s/^(int INIZIO_DSI___)// )
      {
        chop($riga); # tolgo il ';' finale
        $filetrovato=$riga;
        if ($fileout=~ /$filetrovato/)
                  {
        next;
    }
    else
   {
      push(@files,$fileout);
     $i++;
     if (@righe)
         {
         (($fileout=~  /$fileprinc/) &&
      &scrivifile(">>$fileout",@righe)) ||
      &scrivifile(">$fileout",@righe);
   }
                    @righe=();
             $filetrovato=$dir.$filetrovato;
      $fileout=$filetrovato;
                    next;
         }
        }
  if ($riga =~ s/^(int FINE_DSI__)// )
      {
     if (@righe)
         {
         (($fileout=~  /$fileprinc/) &&
      &scrivifile(">>$fileout",@righe)) ||
      &scrivifile(">$fileout",@righe);
   }
                    @righe=();
      $fileout=pop(@files);
      #   print "######### dopo del pop: nuovo file-> $fileout\n";
        next;
      }
  push(@righe,"$riga\n");
      }
close(IN);
}
#####################################################################
#
#           sub scrivifile
#
#####################################################################
sub scrivifile
{
local ($file,@array)=@_;
print "scrivifile: $file \n\n";
# N.B $file deve contenere anche il segno > o >>
open(OUT,$file);
print OUT @array;
close (OUT);
}
#################################################
#                                               #
#             sub help                          #
#                                               #
#################################################
sub help
{
  print STDERR "\nUSO dello script $0 \n";
  print STDERR "$0 [-i DirInput] [-o DirOut] [-h|--help]\n\n";
  print STDERR "\n      -i DirInput: directory in cui si trovano i sorgenti
formattati da cui ";
  print STDERR "\n                   estrarre le informazioni\n";
  print STDERR "\n      -o DirOut: directory dove CREARE le dir di
output\n";
  print STDERR "                 per inserirvi le varie informazioni\n";
  print STDERR "\n      -h --help: visualizza le opzioni della linea di
comando\n\n";
  print STDERR "\n N.B: Se si lancia lo script senza parametri, le dir di
Input e  di Output\n";
  print STDERR "      sono presi uguali a quella di lancio (tramite il pwd)
\n\n";
  die "riprova!\n";
}
#################################################
#                                               #
#    sub gestione_linea_comando                 #
#                                               #
#################################################
sub gestione_linea_comando
{
 if ($ARGV[0] ne '')
      {
        for ($i=0; $i<= $#ARGV;$i++)
     {
       if ($ARGV[$i] eq '-i')
          {
     $i++;
     ($DirSorg=$ARGV[$i]) || &help;
     next;
   }
         if ($ARGV[$i] eq '--h' || $ARGV[$i] eq '--help' )
          {
     &help;
   }
          if ($ARGV[$i] eq '-o')
          {
     $i++;
     ($DirOUT=$ARGV[$i]) || &help;
     ($DirOUT=~ /(\x2f)$/) || ($DirOUT.='/');
                   $dirfinale=$DirOUT.'da_formattare/';
     $DirOUT.='preprocessati/';
     next;
   }
     } #end for
      } # end if
   ($DirSorg) ||   (($DirSorg=`pwd`) && chop ($DirSorg) &&
($DirSorg.="\/"));
    -e $DirSorg || die " ERRORE : Non trovata la dir input:$DirSorg";
    ($DirOUT ne '') || (($DirOUT=$DirSorg.'preprocessati/') &&
($dirfinale=$DirSorg.'da_formattare/'));
         -e $DirOUT || mkdir($DirOUT, 0755) ||
          (print "\n Non posso creare $DirOUT)\n uso $DirSorg\n"  &&
($DirOUT=$DirSorg)) ;
}
#################################################
#                                               #
#                 MAIN                          #
#                                               #
#################################################
&gestione_linea_comando;
##creo la lista dei sorgenti
@Sorgenti=&CreaListaSorgenti($DirSorg,$DirOUT);
# preparo le direttive/opzioni per il preprocessatore
$CFLAGS= "-E -P -dD -MMD"; #  -P -dD -MMD -dD";
$im= "-imacros";
$psor="-I$DirOUT";
@Sorgenti=sort(@Sorgenti);
print "\@Sorgenti:@Sorgenti\n\n";
(-e $dirfinale || mkdir($dirfinale,0755)) && `rm -i $dirfinale*.c*
$dirfinale*.h*`;
chdir ($dirfinale);
foreach $file (@Sorgenti)
  {
     print  "\ng++ $CFLAGS -imacros $file $pincl $psor $file >$fileout\n\n";
     $fileout=$file.'.pre';
     # invoco il g++  per ottenere i file processati con le direttive
     # completamente risolte
     `g++ $CFLAGS $psor $pincl -imacros $file   $file >$fileout`;
    &EliminaCancel_Spazi($fileout,$dirfinale);
  }
#Sposto i file nelle varie directory create
`cd $dirfinale`;
`mv *.*.d ../preprocessati/`;
@Sorgenti= `ls`;
chop(@Sorgenti);
foreach $file (@Sorgenti)
  {
   $file2= $file;
   $file =~ s/^(_in__.*_fi_)//;
  -d $file2  || `mv $file2 $file`;
   }

 Devo fare la conversione di un applicativo perl da linux a windows.
beh, il NG si chiama it.comp.lang.c++
prova su it.comp.win32 o su it.comp.os.linux.development.
Dai, non e' difficile trovare il NG giusto.
Ciao
---
Alessandro >>CoMiX<< Cominu
e-mail: 
aco...@tiscalinet.it
Icq: 116354077
Linux User # 203765
[That's not a bug, that's a feature..]