logo Thecsea.it



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License



scolastica » esercizi » quarta superiore » php

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



Copyright © 2004-2024 thecsea.it (Claudio Cardinale - [email protected])! Tutti i diritti riservati. - contattaci