====== O Arquivador VINA ======
(contribuição do prof. [[https://web.inf.ufpr.br/danielw/|Daniel Weingaertner]])
{{ alemao.jpg?300 |O prof. Daniel Weingaertner}}
O objetivo deste trabalho é implementar o programa ''vina''(([[https://pt.wiktionary.org/wiki/vina]])), que consiste de um arquivador básico (//archiver//), isto é, um programa que salva em sequência uma coleção de arquivos (denominados membros) dentro de outro arquivo (denominado //archive//) cuja estrutura permite recuperar os arquivos originais individualmente.
Os programas ''tar'', ''zip'', ''rar'' e ''arj'' são arquivadores populares. Além de arquivar arquivos, a maioria deles também comprime os dados dos mesmos, para ocupar menos espaço de armazenamento. Para simplificar, o arquivador VINA não comprime os arquivos, apenas os armazena.
===== Execução do Programa =====
O pacote de software a ser construído deve gerar o executável chamado ''vina'', que deve ser executado da seguinte forma:
vina [membro1 membro2 ...]
Onde a opção pode ser:
* ''-i'' : insere/acrescenta um ou mais membros ao //archive//. Caso o membro já exista no //archive//, ele deve ser substituído. Novos membros são inseridos respeitando a ordem da linha de comando, ao final do //archive//;
* ''-a'' : mesmo comportamento da opção ''-i'', mas a substituição de um membro existente ocorre APENAS caso o parâmetro seja **mais recente** que o arquivado;
* ''-m target'' : move o membro indicado na linha de comando para imediatamente depois do membro //target// existente em //archive//. A movimentação deve ocorrer na seção de dados do //archive//;
* ''-x'' : extrai os membros indicados de //archive//. Se os membros não forem indicados, **todos** devem ser extraídos. A extração consiste em ler o membro de //archive// e criar um arquivo correspondente, com conteúdo idêntico, em disco;
* ''-r'' : remove os membros indicados de //archive//;
* ''-c'' : lista o conteúdo de //archive// em ordem, incluindo as propriedades de cada membro (nome, UID, permissões, tamanho e data de modificação) e sua ordem no arquivo.
* ''-h'' : imprime uma pequena mensagem de ajuda com as opções disponíveis e encerra.
Exemplos de comandos:
// inclui os arquivos "arq.txt", "foto.jpg" e "despesas.ods" em backup.vr
vina -i backup.vr arq.txt foto.jpg despesas.ods
// atualiza "despesas.ods" em backup.vr, se o arquivo externo for mais recente
vina -a backup.vr despesas.ods
// extrai o arquivo arq.txt de backup.vr
vina -x backup.vr arq.txt
// extrai todos os arquivos de backup.vr
vina -x backup.vr
// move o arquivo "arq.txt" para depois de "despesas.ods" em backup.vr
vina -m despesas.ods backup.vr arq.txt
===== Formato do Arquivo =====
Cada equipe é livre para inventar seu próprio formato para o //archive//, desde que respeitando as seguintes restrições:
* O início ou final do //archive// (''.vr'') deve ter uma área de diretório, como mostra a figura:
{{ vina-format.png?600 |Formato do arquivo vina}}
* Todas as informações sobre os membros, necessárias para a manipulação do //archive//, devem estar armazenadas única e exclusivamente na área de diretório. A parte restante deve conter **apenas** os dados dos membros.
* Para cada membro, devem ser armazenadas as seguintes informações: nome (sem espaços), UID (//user ID//), permissões, tamanho, data de modificação, ordem no arquivo e localização.
* A ordem de um membro no arquivo é dada pela ordem de inserção, e pode ser alterada pela opção ''-m''.
* O conteúdo da área de diretório pode ser manipulado em memória RAM ou em disco, a critério da equipe.
* O conteúdo dos membros do //archive// **deve ser manipulado diretamente em disco**, não sendo permitida a alocação de mais de 1.024 bytes de memória para manipulação dos conteúdos dos membros.
Uma abordagem interessante consiste em colocar a área de diretório no **final** do arquivo, mantendo no início do arquivo apenas um inteiro indicando a posição do arquivo onde inicia essa área. Essa organização torna mais simples as operações de alteração do conteúdo do arquivo.
As operações de leitura e escrita nos arquivos devem **sempre** ser feitas em formato **binário**, ou seja, usando as funções ''fread()'' e ''fwrite()''.
Se estiver usando as funções ''fprintf()'', ''fscanf()'', ''fputc()'', ''fgetc()'' e similares, **provavelmente está fazendo errado**!
===== Erros =====
Em caso de erros, uma mensagem explicando o ocorrido deve ser impressa em ''stderr'' e a execução do programa deve ser encerrada com código de saída **diferente de 0**. Caso o programa possa recuperar-se automaticamente do erro, deve fazê-lo.
===== Produto a ser Entregue =====
Deve-se entregar um pacote de software completo contendo os fontes em linguagem C. O pacote deve ser arquivado e compactado com ''tar'' e ''gzip'' em um arquivo chamado ''login.tar.gz'' (substitua ''login'' por seu login/identificador na rede do departamento).
O pacote deve ter a seguinte estrutura de diretório e arquivos:
login/ diretório principal
/src/... diretório dos arquivos fonte (*.c, *.h)
/doc/... diretório da documentação Doxygen
/LEIAME arquivo
Makefile arquivo
Note que a extração dos arquivos de ''login.tar.gz'' deve criar o diretório ''login/'' contendo todos os arquivos e diretórios acima. Os arquivos fonte também devem estar contidos no sub-diretório ''src''.
O arquivo de texto ''LEIAME'' deve conter as seguintes informações:
* autoria do software (GRR e nome(s) do(s) autor(es));
* lista dos arquivos e diretórios contidos no pacote e sua descrição (breve);
* uma seção descrevendo os algoritmos e as estruturas de dados utilizadas, as alternativas de implementação consideradas e/ou experimentadas e os motivos que o levaram a optar pela versão entregue, as dificuldades encontradas e as maneiras pelas quais foram contornadas.
* bugs conhecidos;
O arquivo ''Makefile'' deve possuir as regras necessárias para compilar os módulos individualmente e gerar o programa executável. As seguintes regras devem estar presentes:
* ''all'': compila e produz um executável chamado vina no diretório ''login/'';
* ''clean'': remove todos os arquivos temporários e os arquivos gerados pelo Makefile (*.o, executável, etc.).
* ''doc'': gera a documentação em HTML utilizando o programa [[http://www.doxygen.nl|doxygen]];
O diretório ''./login/doc'' deve conter um arquivo de configuração para a documentação automática, que deve ser gerada a partir dos comentários no código fonte, utilizando o programa ''doxygen''. A documentação (arquivos gerados pelo ''doxygen'') também deve ficar neste diretório.
===== Avaliação =====
Os itens de avaliação do trabalho e respectivas pontuações são:
* Qualidade da documentação: arquivo ''LEIAME'' e documentação HTML gerada pelo Doxygen (15 pontos)
* Funcionamento: corretude das respostas nos testes executados (55 pontos)
* Eficiência: algoritmos e estruturas de dados utilizados para obter um melhor desempenho, desde que devidamente justificados no arquivo ''LEIAME'' (30 pontos)