Testo dell'esercizio
realizzare un "precompilatore" che legendo un file c realizzi un nuovo file con le seguenti caratterstiche :
- numerazione di riga
- tutte le istruzioni che prevedono l'include devono essere sostituite con il contenuto dell'include espresso da #include<nome>
- eliminare tutte le righe commentate, presupponendo che i commenti siano messi in righe dedicate
- eliminare le righe vuote
usare la funzione substr, fgets, fputs, explode, strlen
mostra soluzione
<?php
/*
CLAUDIO CARDINALE 4AI
realizzare un "precompilatore" che legendo un file c realizzi un nuovo file con le seguenti caratterstiche :
- numerazione di riga
- tutte le istruzioni che prevedono l'include devono essere sostituite con il contenuto dell'include espresso da #include<nome>
- eliminare tutte le righe commentate, presupponendo che i commenti siano messi in righe dedicate
- eliminare le righe vuote
usare la funzione substr, fgets, fputs, explode, strlen
*/
//parametri configurabili
$f_name = "file.c"; //file da leggere
$riga = 1; //riga da cui iniziare il conteggio
$f1 = fopen($f_name,"r") or die("impossibile aprire il file\n");
$f2 = fopen("new_".$f_name,"w") or die("impossibile creare il file\n");
while(!feof($f1))
fputs($f2,leggi($f1));
fclose($f1);
fclose($f2);
function leggi($file){
//dichiarazioni
global $riga;
//acquisizione riga
$stringa = fgets($file);
//eliminazione riga vuota
if($stringa == "" || $stringa == "\n")
return;
//eliminazion riga commentata
if(commento($stringa))
return;
//sostituzione include
if(($str = f_include($stringa))!="")
return $str;
//inserimento numero di riga
$stringa = $riga."\t".$stringa;
$riga++;
//ritorno
return $stringa;
}
//controllo se la riga e` un commento
function commento($stringa){
//dichiarazioni e inizializzazioni
static $commento_multiriga = false;
$ritorno = false;
//calcoli
if(cerca($stringa, "/*")){
$commento_multiriga = true;
$ritorno = true;
}
if(cerca($stringa, "//"))
$ritorno = true;
if($commento_multiriga && cerca($stringa, "*/")){
$commento_multiriga = false;
$ritorno = true;
}
if($commento_multiriga == true)
$ritorno = true;
//ritorno
return $ritorno;
}
//ricerco un elemento ritornando o true o false
function cerca($stringa, $ele){
if(count(explode($ele,$stringa))>1)
return true;
return false;
}
//includo i file
function f_include($stringa){
global $riga;
//recupero il nome dell'include
$stringa = explode("<",$stringa);
if(count($stringa)!=2 || cerca($stringa[0], "#include")===false)
return "";
$stringa = explode(">",$stringa[1]);
$stringa = $stringa[0];
//controllo se e` presente l'include
if($stringa == "")
return "";
//lettura
$f = fopen("/usr/include/".$stringa,"r") or die("impossibile aprire il file di header\n");
$stringa = "";
while(!feof($f)){
if(($str = fgets($f))!=""){
$stringa .= $riga."\t".$str;
$riga++;
}
}
fclose($f);
//ritorno
return $stringa;
}
?>
torna