224 lines
5.3 KiB
Plaintext
Executable File
224 lines
5.3 KiB
Plaintext
Executable File
<?php
|
|
|
|
// Este programa normaliza programas C conforme especificacoes do arquivo de entrada arquivonormalizacao.txt
|
|
// Data: 04/07/2013
|
|
// Autora: Márcia Gonçalves de Oliveira
|
|
// Entrada: diretorio de tarefa com subpastas com contendo cada um as submissoes de alunos
|
|
// Saida: diretorios das tarefas, contendo cada uma as submissões normalizadas.
|
|
|
|
|
|
// Função para executar a normalizacao
|
|
|
|
|
|
function normalizaarquivo($diretorioorigem, $diretoriodestino)
|
|
{
|
|
// Nomes dos arquivos e diretorios utilizados para processamento
|
|
|
|
$listanormalizacoes= "arquivosnormalizacao/arquivonormalizacao.txt";
|
|
$arqconfirmafunciona = "sucesso.txt";
|
|
$arquivoexecutavel="executavel";
|
|
$arqsaida="arquivosaida";
|
|
$erros= "Erros no exercicio!!"; // string que caracteriza erros de compilação no arquivosaida
|
|
$ploop = "Programa em loop!!";
|
|
|
|
// Arquivo que conterá codigo normalizado
|
|
|
|
$arqnormalizado=$diretoriodestino.basename($diretorioorigem).".txt";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Obter o código C do diretorio origem de copiar para arquivo. Se não existir o codigo .C, grava um arquivo normalizado vazio.
|
|
|
|
$pointer = opendir($diretorioorigem);
|
|
|
|
$achou=false;
|
|
|
|
$copiaarq="";
|
|
|
|
while (($arqlido = readdir($pointer)) && $achou==false)
|
|
{
|
|
// verifica se extensão do arquivo é .c
|
|
|
|
$extensao=strtoupper(substr($arqlido, -2));
|
|
|
|
if ($extensao==".C")
|
|
{
|
|
$fp = fopen($diretorioorigem.$arqlido,'r');
|
|
$tarq=filesize($diretorioorigem.$arqlido);
|
|
if ($tarq>0)
|
|
{
|
|
$copiaarq = fread($fp, $tarq);
|
|
}
|
|
fclose($fp);
|
|
|
|
$achou=true;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// Se o arquivo .c não está vazio, insere tokens confirmando compilação e execucao; normaliza retirando comentarios e strings e substituindo palavras ambiguas
|
|
|
|
|
|
if (($achou==true) && (!($copiaarq=="")))
|
|
{
|
|
// Abrir arquivo normalizado
|
|
|
|
$f= fopen($arqnormalizado,'w');
|
|
|
|
// Verificar se roda. ==> Se sim, inserir token @compila, @funciona
|
|
// Se não, verifica apenas se compila ==> Se sim, Inserir token @compila
|
|
|
|
if (file_exists($diretorioorigem.$arqsaida))
|
|
{
|
|
$textofunciona = file($diretorioorigem.$arqsaida);
|
|
|
|
$ntf=count($textofunciona);
|
|
|
|
if ($ntf>0) // Se arquivosaida nao está vazio
|
|
{
|
|
|
|
|
|
$pos = strpos($textofunciona[0], $erros);
|
|
$estaloop = strpos($textofunciona[0], $ploop);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
$pos=false; // Arquivo saida foi gerado sem erros
|
|
$estaloop=false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//if (file_exists($diretorioorigem.$arqconfirmafunciona) )
|
|
|
|
if ($pos === false && $estaloop===false) // Não contém erros
|
|
{
|
|
fwrite($f,"@compila @funciona \n");
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
if ($estaloop>=0) // Está em loop
|
|
{
|
|
echo "**".$textofunciona[0]."**";
|
|
fwrite($f,"@compila \n");
|
|
}
|
|
}
|
|
|
|
|
|
unset($textofunciona);
|
|
}
|
|
|
|
// Retira comentários e textos entre aspas
|
|
|
|
$textonormalizado = preg_replace('/\".*\\n*.*\"/', ' @textostr ', $copiaarq);
|
|
|
|
// Substitui os tokens e símbolos que geram redundâncias conforme lista de normalizações
|
|
|
|
$arqnormaliza = file($listanormalizacoes);
|
|
|
|
foreach($arqnormaliza as $linhaarquivo)
|
|
{
|
|
$str = explode(';', $linhaarquivo);
|
|
|
|
$original = $str[0];
|
|
$novo = trim($str[1]);
|
|
$textonormalizado= str_replace($original,$novo, $textonormalizado);
|
|
|
|
|
|
}
|
|
|
|
$textonormalizado = preg_replace('/@icoment.*@fcoment/s', ' @comentario ', $textonormalizado);
|
|
$textonormalizado = preg_replace('/@comentlinha.*\\n/', ' @comentario ', $textonormalizado);
|
|
|
|
// Gravar arquivo normalizado
|
|
|
|
fwrite($f, $textonormalizado);
|
|
unset($textonormalizado);
|
|
|
|
// Fechar arquivo normalizado
|
|
fclose($f);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // Fim da função
|
|
|
|
|
|
// Endereço de entrada
|
|
|
|
$diretorioentrada = "questoesseparadas/";
|
|
|
|
// Endereço do diretorio de saida ==> o que conterá os códigos normalizados
|
|
|
|
$diretoriosaida = "normalizados/";
|
|
|
|
// Entrar em diretorio de entrada
|
|
|
|
$ponteiro1 = opendir($diretorioentrada);
|
|
|
|
|
|
if (!(file_exists($diretoriosaida)))
|
|
{
|
|
mkdir($diretoriosaida);
|
|
}
|
|
// Para cada subdiretorio de submissoes (isto é, as tarefas), verifique se diretorio da questao já foi normalizado. Se não, envia
|
|
// endereço do diretorio para ser normalizado
|
|
|
|
while (($nometarefa = readdir($ponteiro1)))
|
|
{
|
|
|
|
if ( ($nometarefa<>".") && ($nometarefa<>".."))
|
|
{
|
|
|
|
$ponteiro2 = opendir($diretorioentrada.$nometarefa);
|
|
|
|
while ($submissao = readdir($ponteiro2))
|
|
{
|
|
|
|
if ( ($submissao<>".") && ($submissao<>".."))
|
|
{
|
|
|
|
$diretoriosubm= $diretorioentrada.$nometarefa."/".$submissao."/";
|
|
$diretoriosaida= "normalizados/".$nometarefa."/";
|
|
|
|
if (!(file_exists($diretoriosaida)))
|
|
{
|
|
mkdir($diretoriosaida);
|
|
}
|
|
|
|
if (is_dir($diretoriosubm))
|
|
{
|
|
normalizaarquivo($diretoriosubm, $diretoriosaida);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
?>
|