pcodigo2web/workspace/avaliador/normalizarexercicios-ant.php

183 lines
4.4 KiB
PHP
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";
// Arquivo que conterá codigo normalizado
$arqnormalizado=$diretoriodestino.basename($diretorioorigem).".txt";
$f= fopen($arqnormalizado,'w');
// 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 (!($copiaarq==""))
{
// 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.$arqconfirmafunciona) )
{
fwrite($f,"@compila @funciona \n");
}
else
{
if (file_exists($diretorioorigem.$arquivoexecutavel))
{
fwrite($f,"@compila");
}
}
// 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);
}
}
}
}
}
?>