Um Sistema Simples para Documentação Semi Automática de Programas
Última atualização: 2025-01-05
Este documento está publicamente disponível em https://repositorio.usp.br/item/000781431, e foi manualmente convertido para Markdown GFM a partir de texto gerado por OCRmyPDF.
Autor: V. W. Setzer
Data: 1988
Relatório Técnico RI-MAC-880
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO
UNIVERSIDADE DE SÃO PAULO
INSTITUTO DE MATEMÁTICA E ESTATÍSTICA
SÃO PAULO - BRASIL
1. INTRODUÇÃO
A documentação de programas é um dos aspectos cruciais do desenvolvimento de sistemas computacionais em qualquer ambiente. Desde o desenvolvimento de "software" básico, até o de "software aplicativo" para processamentos administrativos, a atividade de programação usando alguma linguagem de programação requer um esforço específico na documentação de sistemas e programas. Esse fato independe da linguagem: essa necessidade existe desde a programação em linguagem de montagem ("assembler") até o uso de linguagens denominadas de "4ª geração".
Temos verificado continuamente que as documentações de sistemas e programas em geral simplesmente inexistem ou são inadequadas e desatualizadas. As principais consequências desses fatos são:
- A manutenção de programas é muito cara e demorada.
- A fase de testes de programas demanda um tempo exagerado e sobrecarrega os analistas e programadores.
- Não há segurança e confiança de que os programas estão corretos.
- O autor de um programa torna-se o "pai" do mesmo, pois ninguém mais consegue compreendê-lo e mantê-lo.
- Não há meios para se verificar a documentação, isto é, se ela realmente reflete a estrutura do programa.
- A gerência não consegue saber se um programa está bem documentado.
- O projeto, a programação e a documentação devem ser feitos pelas mesmas pessoas.
Neste artigo apresentamos um sistema extremamente simples de documentação de programas através de comentários feitos na sintaxe (de comentários) da própria linguagem de programação do programa. Um programa também simples (apresentado aqui com o exemplo da documentação em sua versão em Pascal para o VAX) é empregado para gerar automaticamente três níveis de documentação. Delineamos também um programa para gerar automaticamente a documentação das alterações efetuadas em um programa, feitas em um editor de textos qualquer. Veremos como esse sistema também pode forçar metodologias "top-down" de programação (refinamentos sucessivos), como permite introduzir e controlar padrões de documentação e como diminui as consequências apresentadas acima.
2. NÍVEIS DE DOCUMENTAÇÃO
Em nosso sistema empregamos três níveis de documentação; ele pode ser facilmente estendido para conter mais níveis, se for conveniente. Os níveis contêm o seguinte:
- Nivel 1: Informações gerais sobre os programas e procedimentos.
- Nivel 2: Toda a documentação de nível 1, mais estruturas conceituais de dados e de programas e rotinas.
- Nivel 3: Todas as documentações de níveis 1 e 2, mais o programa propriamente dito, com documentação de seus detalhes.
Note-se o encaixamento dos conteúdos de cada nível em relação aos níveis anteriores.
3. ESPECIFICAÇÕES DOS NÍVEIS
A documentação de nível 1 é inserida no programa sob forma de comentários ocupando linhas completas (isto é, não deve haver nada, nessas linhas, além desses comentários), que denominaremos de comentários de nível 1. Eles são identificados colocando-se o digito '1' após o símbolo de início de comentário da linguagem, que deve ser inserido na posição mais à esquerda da linha (coluna 1), como por exemplo '(1', '{1' ou '1' (dependendo da linguagem). O simbolo de fim de comentário deve ser colocado nas últimas posições da linha.
A documentação de nível 2, como vimos, contém a de nível 1, produzida pelos comentários de nível 1, e mais os comentários de nível 2. Estes são linhas de comentários de formato idêntico ao dos comentários de nível 1, excetuando-se o dígito '2' colocado no lugar do '1'.
A documentação de nível 3 contém as duas anteriores, e mais todos os comandos do programa e comentários de nível 3. Estes são inseridos no programa em qualquer posição das linhas, usando-se simplesmente os símbolos de comentários da linguagem empregada. Evidentemente, não devem confundir-se com os comentários de nível 1 e 2; portanto, não devem conter os dígitos '1' ou '2' imediatamente após o símbolo de início de comentário.
4. LISTADOR DA DOCUMENTAÇÃO
O "listador" da documentação é um programa que solicita do usuário a informação do nível de documentação desejado, e em seguida varre sequencialmente o arquivo com o programa, produzindo uma listagem contendo o seguinte:
a) Cabeçalho em cada página, contendo o nome do programa, o nível de documentação, a data e a hora da listagem e o número da página.
b) Se o nível desejado é 3, a listagem conterá todas as linhas do programa, incluindo todos os comentários, precedida cada uma por um número de linha. Esse número é o número de ordem de cada linha do programa, incluindo todos os comentários dos vários níveis.
c) Se o nível desejado for 1 ou 2, a listagem conterá as linhas de comentário extraídas do programa, conforme o nível desejado, precedidas do número de linha correspondente à listagem do nível 3.
Por meio dos números de linhas pode-se estabelecer rapidamente uma correspondência visual entre as linhas das listagens dos vários níveis de documentação.
5. EXEMPLO - DETALHES DAS DOCUMENTAÇÕES
No apêndice apresentamos como exemplo as listagens dos três níveis de documentação para o programa COMENT.PAS. Esse programa é justamente um listador para programas escritos em Pascal, COBOL ou ZIM. Ele foi escrito em Pascal para o VAX. A partir desse exemplo especificaremos aquilo que, até o presente momento, consideramos como interessante constar da documentação de cada nível.
5.1. Nível 1
Note-se que ao programa principal e a cada procedimento corresponde um trecho da documentação deste nível. Esta deve ser totalmente conceitual, isto é, deve ser voltada para o problema (ou "mundo real", se for o caso). Assim, num sistema de conferição de notas fiscais colocaríamos "verificação do ICM" e não "verificação do campo NFICM do registro R2". Além disso, deve ser totalmente auto-contida, isto é, deve ser independente das documentações de níveis 2 e 3, a menos dos números de linhas. Denominamos nessa documentação de "entradas" e "saídas" os dados transportados de e para unidades externas, respectivamente. Denominamos de "importações" e "exportações" os dados que são globais a ou são parâmetros de procedimentos; no primeiro caso acrescentamos a palavra "globais".
Note-se, ainda, a enumeração dos nomes dos procedimentos chamados ("rotinas chamadas") e quais procedimentos chamam uma certa rotina ("chamado por").
5.2. Nível 2
Observe-se que a documentação deste nível contém a de nível 1; distinguimos os comentários de níveis 1 e 2 por meio da impressão do digito que constava do início do comentário correspondente.
Como no nível 1, os comentários de nível 2 devem ser totalmente conceituais. Além disso, devem ser totalmente independentes da documentação de nível 3, a menos dos números de linhas.
No exemplo, não colocamos as estruturas dos dados, pois elas são demasiado elementares; se existissem, deveriam ser independentes da estrutura "física". Por exemplo, deveriam comentar o mais conceitualmente possível o conteúdo dos arquivos como conjuntos ou tabelas (visão relacional) em relação com o problema ou “mundo real”.
A estrutura dos programas é dada em um "Português estruturado". Chamamos a atenção para o fato de que procuramos evitar em nosso "Português estruturado" o uso de palavras reservadas das linguagens de programação usuais pois cremos que a descrição de algoritmos deve libertar-se das amarras estruturais e linguísticas impostas por essas linguagens. Assim, não precedemos as condições com "se..." para evitar propositalmente a conotação com o "if". De fato, essas condições estão formuladas como perguntas com interrogação, e podem gerar tanto estruturas como "if” quanto "case". Infelizmente, não encontramos uma alternativa melhor do que "caso contrário" para o "senão". É importante nesse nível tratar os dados como conjuntos e elementos de conjuntos. Por exemplo, uma certa malha de repetição ("loop") poderia ser especificada como "processa cada linha da nota fiscal".
Atenção especial deve ser dada para o alinhamento vertical: é ele que dá a estrutura de composição das ações. A regra empregada é a seguinte: se uma linha m começa na coluna i, a próxima linha n a ser executada sequencialmente depois de m, independentemente da composição desta, deve ser a próxima linha que também começa na coluna i; entre m e n não deve ocorrer nenhuma linha com algum caractere em colunas de índice menor ou igual a i.
Note-se a correspondência da numeração das documentações de nível 1 e de nível 2.
5.3. Nível 3
Note-se que a documentação deste nível contém todo o programa, com os comentários de níveis 1, 2 e 3, exatamente como ocorrem no arquivo.
Observe-se que todas as variáveis do programa foram documentadas através de comentários de nível 3. Esse é o nível correto para isso, pois variáveis não têm nada a ver com a descrição conceitual dos níveis superiores. Além disso, foram colocados alguns comentários de nível 3 para comandos do programa.
Procuramos seguir a mesma regra de alinhamento vertical exposta para os comentários de nível 2. Infelizmente, o resultado não foi exatamente o desejado, mas é suficiente para ilustrar essa nossa única regra; a existência de uma só regra de alinhamento, ao contrário de maneiras usuais de alinhar comandos de programas, que contêm regras especificas para certos comandos, tem a intenção de uniformizar e simplificar essa disposição, independentemente da linguagem.
Finalmente, note-se como os comandos do programa aparecem inseridos nos comentários de nível 2; cada um destes está documentando conceitualmente a ação executada pelos comandos que o seguem e que precedem o próximo comentário daquele nível.
6. DOCUMENTAÇÃO DAS ALTERAÇÕES
Se se deseja documentar o histórico de todas as alterações efetuadas em um programa, a simples listagem das várias versões do mesmo não é prática, pois é relativamente difícil deduzir quais foram as modificações introduzidas empregando-se uma comparação visual entre as listagens de duas versões consecutivas. Muitos programadores empregam um programa especial de comparação de arquivos, que salienta as diferenças. Essa solução não é satisfatória em casos de muitas alterações. Vejamos a solução que nosso sistema oferece para esse problema.
Afim de documentar as alterações projetamos um programa de listagem de alterações LA, que funciona da seguinte maneira:
a) O usuário ativa LA e comunica a este que deseja iniciar alterações; fornece ainda o nome do arquivo, por exemplo A, onde está seu programa P e o nome do editor de textos E que deseja utilizar para editar as alterações.
b) LA abre um novo arquivo A1 e copia P em A1, numerando suas linhas.
c) LA passa o controle ao editor E dando A1 como origem do texto.
d) O usuário altera Al empregando E, sem alterar nenhuma numeração de linhas; ele pode alterar o conteúdo de linhas de P, inserir neste novas linhas (sem colocar a numeração destas) ou eliminar linhas (eliminando também sua numeração). O usuário deve também inserir linhas de comentário especiais no início de A1, usando um código de comentário especial como '/#' a partir da coluna 1; essas linhas servem para documentar-se a razão de se ter feito as alterações. O programa alterado, que denominaremos de P1, é então gravado em A1.
e) O usuário ativa LA novamente e comunica a este que deseja emitir as listagens de alterações, fornecendo os nomes de A e de A1.
f) LA varre A numerando internamente as linhas de P. Em paralelo, lê A1 comparando as suas linhas com as de mesmo número de A. Se houver alguma diferença de conteúdo entre duas linhas de mesmo número, ambas são gravadas em um arquivo de saída S, a de A precedida da mensagem "original" e a de A1 de "alterada". Se houver alguma linha de A com um número de linha que não ocorre em A1, ela é gravada em S precedida de "eliminada". Se ocorrer uma sequência de linhas de A1 sem numeração, estas são gravadas em S precedidas da mensagem "linhas inseridas", da linha de A correspondente à linha numerada de A1 imediatamente anterior à sequência, e seguidas pela linha de A imediatamente seguinte. Todas as linhas de A1 com código de comentário especial ('/#') são também inseridas em S.
q) A medida que LA varre A1 no passo anterior, vai regravando A1 retirando as numerações de linhas e eliminando as linhas com código de comentário especial ('/#').
h) Ao terminar a varredura de A e de A1, LA executa uma rotina de listagem semelhante ao listador, que lê S e produz a impressão das alterações em todos os níveis de documentação; cada nível é precedido dos comentários especiais ('/#').
Como resultado desses procedimentos permanece o programa P em A, P1 é criado em A1 e obtém-se a listagem das alterações efetuadas na passagem de P para P1, divididas nos vários níveis de documentação, com as numerações das linhas de P para referência com o programa original e precedida dos comentários especiais que descrevem os motivos das alterações. O arquivo S pode ser novamente empregado para obter-se novas cópias das alterações, bastando para isso ativar LA e informar que se deseja executar esse passo.
Note-se que esse sistema de documentar as alterações serve tanto para registrar-se as alterações de manutenção, como também para documentar os passos de desenvolvimento de um programa em um método por refinamentos sucessivos.
Existem vários sistemas de documentação de alterações, denominados de "version control systems"; uma descrição de vários desses sistemas pode ser encontrada em [1]. Em particular, o sistema DIFF originário do UNIX e transposto para o TURBO-C é muito empregado no IBM-PC. Cremos que nossa proposta é superior a esses produtos pois está voltada especificamente para o sistema de documentação aqui descrito, além de adaptar-se a qualquer editor de textos. Note-se que a numeração das linhas feitas pelo nosso sistema resolve todos os problemas de comparação entre as linhas sem prejudicar o usuário, pelo contrário, está dentro do esquema da documentação produzida pelo listador.
6. RESULTADOS
Com o método aqui exposto pode-se obter os seguintes resultados:
- Documentação de um programa, do seu desenvolvimento e de sua manutenção em vários níveis de abstração.
- Programação "top-down". Deve-se desenvolver um programa começando-se pelos comentários de nível 1, a seguir inserir os de nível 2, e finalmente o programa propriamente dito e os comentários de nível 3.
- Geração automática de documentação.
- Aceleração do desenvolvimento. A documentação em vários níveis auxilia a programação e diminui o tempo dedicado aos testes.
- Aceleração da manutenção. Para se fazer manutenção de um programa, pode-se localizar o ponto de alteração (ou de erro) "navegando-se" pelos níveis decrescentes de abstração da documentação. Os números de linhas podem ser empregados para uma rápida movimentação de um nível para outro.
- Atualização permanente da documentação. Qualquer alteração do programa deve redundar em alteração nos comentários de níveis 3, 2 e mesmo 1 se necessário. Os listadores de alterações e de documentação produzirão a documentação das alterações efetuadas e da nova versão da documentação do programa.
- Programação encadeada. Várias pessoas podem. participar do desenvolvimento de um programa, particionando-se a equipe conforme os três níveis de abstração. Isso garante a qualidade das documentações de níveis 1 e 2.
- Controle da programação "top down". A listagem das alterações correspondendo ao desenvolvimento "top down", contendo as várias versões do refinamento sucessivo, possibilita à gerência verificar se a metodologia está sendo corretamente seguida.
- Controle da documentação. A gerência pode controlar a documentação dos programas, já que é relativamente fácil seguir as documentações de níveis 1 e 2. A partir destas, não deve ser difícil seguir o programa distribuído entre elas, e seus comentários de detalhe. A documentação das alterações permite controlar a manutenção das documentações dos níveis mais altos.
- Aumento da portabilidade. Alterações de programas devidas a mudanças de ambiente de processamento podem ser feitas com muito maior rapidez, pois devem afetar muito pouco os níveis 1 e 2 de documentação. Em particular, comentários de nível 3 podem ser inseridos para salientar as dependências de trechos do programa em relação ao ambiente.
- Documentação independente dos detalhes de programação. A documentação de nível 1 pode ser empregada por pessoas que desejam conhecer a funcionalidade dos programas e das rotinas sem se importar com detalhes de programação.
7. CONCLUSÕES
Apresentamos aqui um método extremamente simples de produzir e manter a documentação de programas. Estamos cônscios de que esta não é uma área promissora, pois a programação está desaparecendo devido a introdução de geradores universais de aplicações para processamento de dados administrativos, que em alguns casos como o sistema LDT geram automaticamente programas e documentação, sendo esta de altíssimo nível [2]. No entanto, sobram ainda todos os desenvolvimentos de "software" básico, quando não são usadas técnicas formais como VDM (ver, como exemplo dessa técnica, [3]), e a grande maioria dos sistemas desenvolvidos em linguagens de programação algorítmicas e de "4ª geração". Outros esforços tem sido produzidos no sentido de se introduzir comentários significativos nos programas, como o sistema WEB de Knuth [4]. No entanto, trata-se de sistema muito mais complexo, abrangendo inclusive a parte de asserções para prova de corretude (para uma extensa referência a respeito, ver [5]). Essas asserções podem evidentemente ser introduzidas em nosso método como comentários de nível 2. O mesmo se passa com comentários de tipo formal como os propostos por Krieg-Brueckner e Luckham [6]. Nesse dois casos, cremos que as asserções ficam ligadas demais ao código, de modo que poderiam constituir um nível adicional, entre os nossos níveis 2 e 3. Com isso as asserções teriam seus próprios comentários; estes serviriam para esclarecer em um nível informal o conteúdo matemático daquelas, o que daria a documentação do desenvolvimento delas e do programa. A documentação desse desenvolvimento não é a intenção exposta em [6]. Além disso, nosso sistema tem a vantagem adicional de documentar as versões.
É interessante observar que as considerações de Beckman [7] contrárias ao uso de comentários em programas não se aplicam as propostas aqui apresentadas, pois os comentários que propomos estão intimamente ligados à funcionalidade dos programas e de seus trechos, ao desenvolvimento dos mesmos e ao uso do nível 1 independentemente dos outros níveis.
Testamos e desenvolvemos estas ideias com alunos de nossa disciplina de Compilação, em que eles elaboram individualmente um programa de milhares de linhas. Apesar do protesto inicial dos alunos, estes logo perceberam as enormes vantagens do sistema de documentação. Em 1987, apenas 22% da turma concluiu o projeto durante o semestre; em 1988, na turma em que testamos o método, 65% dos alunos o concluiu, provavelmente devido, em boa parte, à documentação.
Várias melhorias podem ser introduzidas no sistema. Por exemplo, pode-se eliminar o aparecimento dos números dos níveis 1 e 2 nas listagens desses níveis, bastando para isso enquadrar totalmente os comentários de nível 1 do programa principal e de cada procedimento em um retângulo de asteriscos. Como vimos, a possibilidade de se documentar as alterações de uma versão para outra pode servir de base para documentar todo processo de desenvolvimento do programa por refinamentos sucessivos; além disso os comentários de nível 2 poderiam ser subdivididos em vários subníveis, para produzir uma documentação completa desse desenvolvimento.
O colega Arnaldo Mandel propôs um sistema de 5 níveis. O nível 1 contém a documentação para o usuário "externo", do sistema como um todo, como se ele só tivesse o programa-objeto; o nível 2 contém informações para a compilação; o nível 3 é uma documentação para reutilização das rotinas, com variáveis globais, parâmetros, modo de chamar os procedimentos, etc.; o nível 4 é correspondente ao nosso nível 2; o nível 5 contém o histórico de alterações correspondente aos nossos comentários especiais (ele não propõe que se documente as alterações propriamente ditas).
Roberto C. Mayer implementou o listador em C, possibilitando que a especificação de nível (1 ou 2) valha para uma sequência de linhas, e não somente para cada linha: o encerramento do comentário fecha a sequência. Além disso, sua codificação de comentário de um desses níveis pode ser colocada em qualquer posição de uma linha, ao contrário da nossa proposta, que exige essa colocação no início da linha, simplificando a construção do listador. Seu sistema exige, obviamente, um analisador léxico para detetar os níveis e o encerramento dos comentários correspondentes.
Mirza Neuman propôs o armazenamento apenas da última versão da documentação e dos arquivos com as alterações de uma versão para outra, gerando-se uma versão anterior a partir desses dados. Parece-nos que é possível construir-se esse programa gerador, pois todos os dados necessários estão disponíveis.
8. AGRADECIMENTOS
O sistema aqui apresentado foi desenvolvido a partir de ideias lançadas por Marcos Ximenes para o sistema ZIM. Especial agradecimento é devido a Afonso C.R. Mastrelli, que programou o exemplo dado no apêndice, com enorme paciência de introduzir paulatinamente as nossas seguidas sugestões. Wagner T. Martins programou uma excelente versão do listador em NATURAL para o sistema ADABAS.
9. REFERÊNCIAS
[1] Rex, J. - Keeping Track: Five Version Control Systems - Computer Language 5, 6 (June 1988), pp. 111-122.
[2] Setzer, V.W. e Marussi, E. - LDT: Um Gerador Universal de Aplicações para Processamento de Dados - RT-MAC-8806, Departamento de Ciência da Computação do IME-USP (Junho de 1988).
[3] Bjorner, D. - Programming Languages: Formal Development of Interpreters and Compilers - in Proc. Intl. Comp. Symp. ICS'77, North Holland Publ., pp. 1-21.
[4] Knuth, D. - Literate Programming - Computer Journal 27, 2 (1984), pp. 97-111.
[5] Gries, D. - The Science of Programming - Springer Verlag, N. York (1981).
[6] Krieg-Brueckner, B. e Luckham, D.C. - Anna: Towards a Language for Annotating Ada Programs - ACM SIGPLAN Notices 15, 11 (Nov. 1980), pp. 128-138.
[7] Beckman, A. - Comments Considered Harmful - ACM SIGPLAN Notices 12, 4 (April 1977), pp. 94-97.
ANEXO
PROGRAMA: COMENT.PAS DOC.NIVEL 1 DATA: 8-AUG-1988 15:57 PAG: 1
1 1=============================================================================
2 1 TITULO: COMENTARIO
3 1 AUTOR : AFONSO CELSO ROCHA MASTRELLI
4 1 DATA : 29/06/88
5 1 VERSAO: 1.2
6 1 FINALIDADE : GERAR RELATORIO CONTENDO A DCCUMENTACAO DE DETERMINADO PRO-
7 1 GRAMA;
8 1 ENTRADAS : ARQUIVO QUE CONTEM O COLICGO FONTE (EM PASCAL, COBOL OU ZIM)
9 1 COMENTADO POR NIVEIS; CODIGO DO NIVEL DE COMENTARIO DESEJADO;
10 1 SAIDAS : RELATORIO COM A DOCUMENTACAO EXTRAIDA DO ARQUIVO FONTE;
11 1 ROTINAS CHAMADAS: LIB$DO_COMMAND (EXTERNA), MOSTRA_TELA, CABECALHO,
12 1 RELAT, RELATPAS E SYS$ASCTIM (EXTERNA);
13 1=============================================================================
51 1=============================================================================
52 1 ROTINA: MOSTRA-TELA;
53 1 FINALIDADE: MOSTRA MENU AO USUARIO, PERGUNTANDO E RECEBENDO O NIVEL DE
54 1 DOCUMENTACAO QUE ELE QUER E O NOME DO ARQUIVO A SER LIDO,
55 1 PASSANDO ESSAS INFORMACÕES AO PROGRAMA PRINCIPAL;
56 1 ENTRADAS: NIVEL DE DOCUMENTACAO E NOME DO ARQUIVO A SER LIDO;
57 1 EXPORTACDES GLOBAIS: NIVEL DE DOCUMENTACAO E NOME DO ARQUIVO A SER LIDO;
58 1 CHAMADO POR: COMENTARIO;
59 1=============================================================================
111 1=============================================================================
112 1 ROTINA: CABECALHO;
113 1 FINALIDADE: IMPRIMIR CABECALHO NO INICIO DE CADA PAGINA DO RELATORIO;
114 1 IMPORTACOES GLOBAIS: NOME DO ARQUIVO LIDO, NIVEL DE DOCUMENTACAO,
115 1 DATA E HORA ATUAIS;
116 1 SAIDA: LINHA DE CABECALHO IMPRESSA NO ALTO DE CADA PAG. DA LISTACEM;
117 1 CHAMADO POR: COMENTARIO;
118 1=============================================================================
142 1=============================================================================
143 1 ROTINA: RELAT;
144 1 FINALIDADE: FAZ LEITURA DO ARQUIVO DE ENTRADA (EM COBOL OU ZIM) E MONTA O
145 1 DE SAIDA;
146 1 IMPORTACOES: CARACTERE QUE IDENTIFICA A LINHA DE COMENTARIO NA LINGUAGEM
147 1 UTILIZADA (COBOL OU ZIM);
143 1 SAIDA : COMENTARIOS DO PROGRAMA DE ENTRADA NO NIVEL DESEJADO;
149 1 CHAMADO POR: COMENTARIO;
150 1=============================================================================
206 1=============================================================================
207 1 ROTINA: RELATPAS;
208 1 FINALIDADE: FAZ LEITURA DO ARQUIVO DE ENTRADA (EM PASCAL) E MONTA O DE
209 1 SAIDA;
210 1 SAIDA: COMENTARIOS DO PROGRAMA DE ENTRADA NO NIVEL DESEJADO;
211 1 CHAMADO POR: COMENTARIOS;
212 1=============================================================================
PROGRAMA: COMENT.PAS DOC.NIVEL 2 DATA: 8-AUG-1988 15:59 PAG: 1
1 1=============================================================================
2 1 TITULO: COMENTARIO
3 1 AUTOR : AFONSO CELSO ROCHA MASTRELLI
4 1 DATA : 29/06/88
5 1 VERSAO: 1.2
6 1 FINALIDADE : GERAR RELATORIO CONTENDO A DOCUMENTACAO DE DETERMINADO PRO-
7 1 GRAMA;
8 1 ENTRADAS : ARQUIVO QUE CONTEM O CODIGO FONTE (EM PASCAL, COBOL OU ZIM)
9 1 COMENTADO POR NIVEIS; CODIGO DO NIVEL DE CCMENTARIO DESEJADO;
10 1 SAIDAS : RELATORIO COM A DCOCUMENTACAO EXTRAIDA DO ARQUIVO FONTE;
11 1 ROTINAS CHAMADAS: LIB$DO_COMMAND (EXTERNA), MOSTRA-TELA, CABECALHO,
12 1 RELAT, RELATPAS E SYS$ASCTIM (EXTERNA);
13 1=============================================================================
51 1=============================================================================
52 1 ROTINA: MOSTRA-TELA;
53 1 FINALIDADE: MOSTRA MENU AO USUARIOS PERGUNTANDO E RECEBENDO O NIVEL DE
54 1 DOCUMENTACAO QUE ELE QUER E O NOVE DO ARQUIVO A SER LIDO,
55 1 PASSANDO ESSAS INFORMACOES AU PROGRAMA PRINCIPAL;
56 1 ENTRADAS: NIVEL DE DOCUMENTACAD E NOME DO ARQUIVO A SER LIDO;
57 1 EXPORTACOES GLOBAIS: NIVEL DE DOCUMENTACAO E NOME DO ARQUIVO A SER LIDO;
58 1 CHAMADO POR: COMENTARIO;
59 1=============================================================================
61 1=============================================================================
62 2 INICIO DE MOSTRA-TELA;
63 2 LIMPA A TELA
65 2 MOSTRA MENU DE OPCOES AO USUARIO
84 2 LE OPCAO DO USUARIO
86 2 OPCAO LIDA E' DE CONTINUAR A EXECUCAO ?
91 2 LE NOME DO ARQUIVO DE ENTRADA
95 2 LE NOME DA LINGUAGEM UTILIZADA NO PROGRAPA
97 2 LINGUACEM NAO E' COBOL NEM ZIM?
101 2 ASSUME-SE PASCAL COMO LINGUAGEM UTILIZADA
106 2 FIM-DE-MOSTRA-TELA
111 1=============================================================================
112 1 ROTINA: CABECALHO;
113 1 FINALIDADE: IMPRIMIR CABECALHO NO INICIO DE CADA PAGINA DO RELATORIO;
114 1 IMPORTACOES GLOBAIS: NOME DO ARQUIVO LIDO, NIVEL DE DOCUMENTACAO,
115 1 DATA E HORA ATUAIS;
116 1 SAIDA: LINHA DE CABECALHO IMPRESSA NO ALTO DE CADA PAG. DA LISTACEM;
117 1 CHAMADO POR: COMENTARIO;
118 1=============================================================================
121 2 INICIO DE CABECALHO;
122 2 PAGINA ESTA' CHEIA ?
125 2 ATUALIZA O NUMERO DA PAGINA.
127 2 RELATORIO JA' FOI INICIALIZADO ?
129 2 SALTA PAGINA
131 2 ESCREVE LINHA DE CABECALHO;
138 2 FIM DE CABECALHO;
142 1=============================================================================
143 1 ROTINA: RELAT;
144 1 FINALIDADE: FAZ LEITURA DU ARQUIVO DE ENTRADA (EM COBOL OU ZIM) E MONTA O
145 1 DE SAIDA;
146 1 IMPORTACOES: CARACTERE QUE IDENTIFICA A LINHA DE COMENTARIO NA LINGUAGEM
147 1 UTILIZADA (COBOL OU ZIM);
PROGRAMA: COMENT.PAS DOC.NIVEL 2 DATA: 9-AUG-1988 15:59 PAG: 2
148 1 SAIDA : COVENTARIOS DO PROGRAMA DE ENTRADA NO NIVEL DESEJADO;
149 1 CHAMADO POR: COMENTARIO;
150 1============================================================================
155 2 INICIO DE RELAT;
159 2 PARA CADA LINHA DO ARQUIVO DE ENTRADA :
162 2 LE LINHA SEQUENCIALMENTE
164 2 NUMERA A LINHA LIDA
166 2 DOCUMENTACAO E' DE NIVEL 3 ?
169 2 ESCREVE LINHA NO RELATORIO
174 2 CASO CONTRARIO
177 2 LINHA NAO E' NULA ?
180 2 LINHA E' DE COMENTARIO NIVEL 1 ?
185 2 ESCREVE LINHA NO RELATORIO
188 2 CASO CONTRARIO
190 2 E' DE COMENTARIO NIVEL 2 E USUARIO QUER NIVEL 2 ?
195 2 ESCREVE LINHA NO RELATORIO
202 2 FIM DE RELAT
206 1============================================================================
207 1 ROTINA: RELATPAS;
208 1 INALIDADE: FAZ LEITURA DO ARQUIVO DE ENTRADA (EM PASCAL) E MONTA O DE
209 1 SAIDA;
210 1 SAIDA: COMENTARIOS DO PROGRAMA DE ENTRADA NO NIVEL DESEJADO;
211 1 CHAMADO POR: COMENTARIO;
212 1============================================================================
214 2 INICIO DE RELATPAS
216 2 PARA CADA LINHA DO ARQUIVO DE ENTRADA :
219 2 LE LINHA SEQUENCIALMENTE
222 2 DOCUMENTACAD E' DE NIVEL 3 ?
225 2 ESCREVE LINHA NO RELATORIO
230 2 CASO CONTRARIO
233 2 LINHA NAO E' NULA ?
236 2 LINHA E' DE COMENTARIO NIVEL 1 ?
241 2 ESCREVE LINHA NO RELATORIO
244 2 CASO CONTRARIO
247 2 E' DE COMENTARIO NIVEL 2 E USUARIO QUER NIVEL 2 ?
252 2 ESCREVE LINHA NO RELATÓRIO
260 2 FIM DE RELATPAS
264 2----------------------------------------------------------------------------
265 2 P R O G R A M A P R I N C I P A L
266 2----------------------------------------------------------------------------
267 2 INICIO DE COMENTARIO
272 2 EXIBE TELA DE ENTRADA
274 2 OPCAO DO USUARIO E' CONTINUAR ?
277 2 ABRE ARQUIVOS DE ENTRADA E SAIDA
289 2 OPCAO DO USUARIO E' NIVEL 1 OU 2 ?
294 2 ENTRADA ESTA' EM PASCAL ?
296 2 PROCESSA ARQUIVO EM PASCAL
298 2 CASO CONTRARIO
300 2 PROCESSA ARQUIVO EM COBOL OU ZIM
310 2 ALGUM ARQUIVO FOI ABERTO ?
313 2 FECHA ARQUIVOS UTILIZADOS
317 2 FIM DE COMENTARIO
PROGRAMA: COMENT.PAS DOC.NIVEL 3 DATA: 8-AUG-1988 16:00 PAG: 1
1 (*1===========================================================================*)
2 (*1 TITULO: COMENTARIO *)
3 (*1 AUTOR : AFONSO CELSO ROCHA MASTRELLI *)
4 (*1 DATA : 29/06/88 *)
5 (*1 VERSAD: 1.2 *)
6 (*1 FINALIDADE : GERAR RELATORIO CONTENDO A DOCUMENTACAO DE DE TERMINADO PRO- *)
7 (*1 GRAMA; *)
8 (*1 ENTRADAS : ARQUIVO QUE CONTEM O CODICO FONTE (EM PASCAL, COBOL OU ZIM) *)
9 (*1 COMENTADO POR NIVEIS; CODIGO DO NIVEL DE COMENTARIO DESEJADO; *)
10 (*1 SAIDAS : RELATORIO COM A DOCUMENTACAO EXTRAIDA DO ARQUIVO FONTE; *)
11 (*1 ROTINAS CHAMADAS: LIB$DO_COMMAND (EXTERNA), MOSTRA_TELA, CABECALHO, *)
12 (*1 RELAT, RELATPAS E SYS$ASCTIM (EXTERNA); *)
13 (*1===========================================================================*)
14 PROGRAM COMENTARIO (INPUT,OUTPUT);
15
16 CONST
17 CLS = CHR(27) + '[H' + CHR(27) + '[J'; (* LIMPA A TELA DO VT100/200/220 *)
18 TYPE
19 LINHA = VARYING[120] OF CHAR; (* PARA LINHA DE IMPRESSAO; *)
20 CARACTERE = CHAR; (* PARA PARAMETRO DE RELAT; *)
21 $WORD = [WORD] 0..65535; (* PARA PARAMETRO DE SYS$ASCTIM; *)
22 $DATE_TIME = [QUAD] RECORD END; (* PARA PARAMETRO DE SYS$ASCTIM; *)
23
24 VAR
25 COMANDO : VARYING[200] OF CHAR; (* COMANDO DCL A SER EXECUTADO; *)
26 LINPROG : LINHA; (* GUARDA LINHA DO PROGRAMA LIDO; *)
27 OPCAO : INTEGER; (* NRO DA CPCAO DO USUARIC NO MENUS *)
28 NOMEARQ : VARYING[30] OF CHAR; (* NOME DO ARQUIVO QUE CONTEM O PROCRAMA; *)
29 SAIDA : TEXT; (* CONTEM O RELATORIO DE SAIDA; *)
30 ENTRADA : TEXT; (* PROGRAMA COMENTADO A SECR LIDO; *)
31 LING : CARACTERE; (* LINGUAGEM DO PROGRAMA A SER LIDO; *)
32 NUMLIN : INTEGER; (* NUMERACAO DAS LINHAS CO FONTE LIDO; *)
33 LINPAG : INTECER; (* NUMERO DE LINHAS POR PAGINA; *)
34 NPAG : INTEGER; (* NUMERO DA PAGINA DO RELATÓRIO; *)
35 DATA_HORA: VARYING[17] OF CHAR; (* DATA E HORA RECEBIDA DO SISTEMA; *)
36 RETORNO : INTEGER; (* SOMENTE AUXILIA O RECEBIMENTO DA HORA; *)
37
38
39 (* ROTINA EXTERNA QUE EXECUTA COMANDO DCL *)
40 PROCEDURE LIB$DO_COMMAND(CMDTXT : VARYING[A] OF CHAR); EXTERN;
41
42
43 (* FUNCAO EXTERNA QUE RETORNA DATA E HORA ATUAIS DO SISTEMA OPERACIONAL *)
44 [EXTERNAL] FUNCTION SYS$ASCTIM(%REF NADA1 : $WORD := %IMMED 0;
45 DATA_HORA : [CLASS_S]
46 PACKED ARRAY[L..U:INTEGER] OF CHAR;
47 %REF NADA2 : $DATE_TIME := %IMMED 0;
48 NADA3 : UNSIGNED := %IMMED 0):INTEGER; EXTERN;
49
50
51 (*1===========================================================================*)
52 (*1 ROTINAS: MOSTRA-TELA; *)
53 (*1 FINALIDADE: MOSTRA MENU AO USUARIO, PERGUNTANDO E RECERENDO O NIVEL DE *)
PROGRAMAS COMENT.PAS DOC.NIVEL 3 DATA: 8-AUG-1988 16:00 PAG: 2
54 (*1 DOCUMENTACAO QUE ELE QUER E O NOME DO ARGUIVO A SER LIDO, *)
55 (*1 PASSANDO ESSAS INFORMACOES AO PROGRAMA PRINCIPAL; *)
56 (*1 ENTRADAS: NIVEL DE DOCUMENTACAO E NOME DO ARQUIVO A SER LIDO; *)
57 (*1 EXPORTACOES GLOBAIS: NIVEL DE DOCUMENTACAO E NOME DO ARQUIVO A SER LIDO; *)
58 (*1 CHAMADO POR: COMENTARIO; *)
59 (*1===========================================================================*)
60 PROCEDURE MOSTRA-TELA;
61 (*2 INICIO DE MOSTRA_TELA; *)
62 BEGIN
63 (*2 LIMPA A TELA *)
64 WRITE(CLS);
65 (*2 MOSTRA MENU DE OPCOES AO USUARIO *)
66 WRITELN(' ':25,'DOCUMENTACAO DE SOFTWARE');
67 WRITELN(' ':25,'^^^^^^^^^^^^^^^^^^^^^^^^');
68 WRITELN;
69 WRITELN(' ':10,'VOCE PODE LISTAR 3 NIVEIS DE DOCUMENTACAO DE UM PROGRAMA.');
70 WRITELN(' ':10,'O PROGRAMA PODE ESTAR NUMA DAS SEGUINTES LINGUAGENS: ');
71 WRITELN;
72 WRITELN(' ':27,'[P]ASCAL (DEFAULT)');
73 WRITELN(' ':27,'[C]OBOL');
74 WRITELN(' ':27,'[Z]IM');
75 WRITELN; WRITELN;
76 WRITELN(' ':26,'NIVEIS DE DOCUMENTACAO');
77 WRITELN;
78 WRITELN(' ':12,'1. DESCRICAO FUNCIONAL + FINALIDADES');
79 WRITELN(' ':12,'2. NIVEL 1 + PSEUDO-CODIGO');
80 WRITELN(' ':12,'3. NIVEIS 1 E 2 + CODIGO FONTE');
81 WRITELN(' ':12,'4. F I M');
82 WRITELN; WRITELN;
83 WRITE(' ':15,'SUA OPCAO E'' :');
84 (*2 LE OPCAO DO USUARIO *)
85 READLN(OPCAO);
86 (*2 OPCAO LIDA E' DE CONTINUAR A EXECUCAO ? *)
87 IF ((OPCAO = 1) OR (OPCAO = 2) OR (OPCAO = 3 )) THEN
88 BEGIN
89 WRITELN;
90 WRITE(' ':15,'NOME DO ARQUIVO : ');
91 (*2 LE NOME DO ARQUIVO DE ENTRADA *)
92 READLN(NOMEARQ);
93 WRITELN;
94 WRITE(' ':15,'LINGUAGEM UTILIZADA : ');
95 (*2 LE NOME DA LINGUAGEM UTILIZADA NO PROGRAMA *)
96 READLN(LING);
97 (*2 LINGUAGEM NAO E* COBOL NEK ZIM? *)
98 CASE LING OF
99 'C','C' : LING := 'C';
100 'Z','Z' : LING := 'Z';
101 (*2 ASSUME-SE PASCAL COMO LINGUAGEM UTILIZADA *)
102 OTHERWISE
103 LING := 'P';
104 END; (* CASE *)
105 END; (* IF *)
106 (*2 FIM=-DE-LOSTRA-TELA *)
107 END; (* MOSTRA TELA *)
PROGRAMA: COMENT.PAS DOC.NIVEL 3 DATA: 8-AUG-1988 16:00 PAG: 3
108
109
110
111 (*1===========================================================================*)
112 (*1 ROTINA: CABECALHO; *)
113 (*1 FINALIDACE: IMPRIMIR CABECALHO NO INICIO DE CADA PAGINA DO RELATORIO; *)
114 (*1 IMPORTACOES GLOBAIS: NOME DO ARCGUIVO LIDOs NIVEL DE DOCUMENTACAO, *)
115 (*1 DATA E HORA ATUAIS; *)
116 (*1 SAIDA: LINHA DE CABECALHO IMPRESSA NO ALTO DE CADA PAG. DA LISTAGEM; *)
117 (*1 CHAMADO POR: COMENTARIO; *)
118 (*1===========================================================================*)
119 PROCEDURE CABECALHO;
120 BEGIN
121 (*2 INICIO DE CABECALHO; *)
122 (*2 PAGINA ESTA' CHEIA ? *)
123 IF LINPAG > 57 THEN
124 BEGIN
125 (*2 ATUALIZA O NUMERO DA PAGINA. 2) *)
126 NPAG := NPAG + 1;
127 (*2 RELATORIO JA' FOI INICIALIZADO ? *)
128 IF NPAG > 1 THEN
129 (*2 SALTA PAGINA *)
130 PAGE(SAIDA);
131 (*2 ESCREVE LINHA DE CABECALHO; *)
132 WRITELN(SAIDA); WRITELN(SAIDA);
133 WRITE(SAIDA,' PROGRAMA: ',NOMEARQ,' ':(22-NOMEARQ.LENGTH));
134 WRITE(SAIDA,'DOC.NIVEL ',OPCAO:2,' DATA: ',DATA_HORA,' PAG: ',NPAG:4);
135 WRITELN(SAIDA); WRITELN(SAIDA);
136 LINPAG := 4;
137 END; (* IF *)
138 (*2 FIM DE CABECALHO; *)
139 END; (* CABECALHO *)
140
141
142 (*1===========================================================================*)
143 (*1 ROTINA: RELAT; *)
144 (*1 FINALIDADE: FAZ LEITURA DO ARQUIVO DE ENTRADA (EM COBOL OU ZIM) E MONTA O *)
145 (*1 DE SAIDA; *)
146 (*1 IMPORTACOES: CARACTERE QUE IDENTIFICA A LINHA DE COMENTARIO NA LINGUAGEM *)
147 (*1 UTILIZADA (COBOL OU ZIM); *)
148 (*1 SAIDA : COMENTARIOS DO PROGRAMA DE ENTRADA AO NIVEL DESEJADO; *)
149 (*1 CHAMADO POR: COMENTARIO; *)
150 (*1===========================================================================*)
151 PROCEDURE RELAT(INI : CARACTERE);
152 VAR
153 IDENT1, IDENT2 : VARYING[2] OF CHAR; (* CONTEM IDENTIFICADOR DE NIVEL *)
154
155 (*2 INICIO DE RELAT; *)
156 BEGIN
157 IDENT1 := INI + '1';
158 IDENT2 := INI + '2';
159 (*2 PARA CADA LINHA DO ARQUIVO DE ENTRADA : *)
160 WHILE NOT EOF(ENTRADA) DO
161 BEGIN
PROGRAMA: COMENT.PAS DOC.NTVEL 3 DATA: 8-AUG-1988 16:00 PAG: 4
162 (*2 LE LINHA SEQUENCIALMENTE *)
163 READLN(ENTRADA,LINPROG);
164 (*2 NUMERA A LINHA LIDA *)
165 NUMLIN := NUMLIN + 1;
166 (*2 DOCUMENTACAO E' DE NIVEL 3 ? *)
167 IF OPCAO = 3 THEN
168 BEGIN
169 (*2 ESCREVE LINHA NO RELATORIO *)
170 LINPAG := LINPAG + 1;
171 CABECALHO;
172 WRITELN(SAIDA,' ':4,NUMLIN:5,' ',LINPROG);
173 END
174 (*2 CASO CONTRARIO *)
175 ELSE
176 BEGIN
177 (*2 LINHA NAO E' NULA ? *)
178 IF (LENGTH(LINPROG) > 2) THEN
179 BEGIN
180 (*2 LINHA E' DE COMENTARIO NIVEL 1 ? *)
181 IF (SUBSTR(LINPROG,1,2) = IDENT1) THEN
182 BEGIN
183 LINPAG := LINPAG + 1;
184 CABECALHO;
185 (*2 ESCREVE LINHA NO RELATORIO *)
186 WRITELN(SAIDA,' ':4,NUMLIN:5,' ',SUBSTR(LINPROG,2,LENGTH(LINPROG)-1));
187 END
188 (*2 CASO CONTRARIO *)
189 ELSE
190 (*2 E' DE COMENTARIO NIVEL 2 E USUARIO QUER NIVEL 2 ? *)
191 IF ((SUBSTR(LINPROG,1,2) = IDENT2) AND (OPCAO = 2)) THEN
192 BEGIN
193 LINPAG := LINPAG + 1;
194 CABECALHO;
195 (*2 ESCREVE LINHA NO RELATORIO *)
196 WRITELN(SAIDA,' ':4,NUMLIN:5,' ',SUBSTR(LINPROG,2,LENGTH(LINPROG)-1));
197 END;
198 END; (* IF *)
199 END; (* IF *)
200 END; (* WHILE *)
201 WRITELN(SAIDA);
202 (*2 FIM DE RELAT *)
293 END; (* RELAT *)
204
205
206 (*1===========================================================================*)
207 (*1 ROTINA: RELATPAS; *)
208 (*1 FINALIDADE: FAZ LEITURA DO ARQUIVO DE ENTRADA (EM PASCAL) E MONTA O DE *)
209 (*1 SAIDA; *)
210 (*1 SAIDA: COMENTARIOS DO FROGRAMA DE ENTRADA NO NIVEL DESEJADO; *)
211 (*1 CHAMADO POR: COMENTARIO; *)
212 (*1===========================================================================*)
213 PROCEDURE RELATPAS;
214 (*2 INICIO DE RELATPAS *)
215 BEGIN
PROGRAMAS COMENT.PAS DOC.NIVEL 3 DATA: 8-AUG-1988 16:00 PAG: 5
216 (*2 PARA CADA LINHA DO ARQUIVO DE ENTRADA *)
217 WHILE NOT EOF(ENTRADA) DO
218 BEGIN
219 (*2 LE LINHA SEQUENCIALMENTE *)
220 READLN(ENTRADA,LINPROG);
221 NUMLIN := NUMLIN + 1;
222 (*2 DOCUMENTACAO E' DE NIVEL 3 ? *)
223 IF OPCAO = 3 THEN
224 BEGIN
225 (*2 ESCREVE LINHA NO RELATORIO *)
226 LINPAG := LINPAG + 1;
221 CABECALHOS
228 WRITELN(SAIDAS,' ',:4,NUMLIN:5,' ',LINPROG);
229 END
230 (*2 CASO CONTRARIO *)
231 ELSE
232 BEGIN
233 (*2 LINHA NAO Ef NULA 2 *)
234 IF (LENGTH(LINPROG) > 3) THEN
235 BEGIN
236 (*2 LINHA E' DE COMENTARIO NIVEL 1 ? *)
237 IF (SUBSTR(LINPROG,1,3) = '(*1') THEN
238 BEGIN
239 LINPAG := LINPAG + 1;
240 CABECALHO;
241 (*2 ESCREVE LINHA NO RELATORIO *)
242 WRITELN(SAIDA,' ':4,NUMLIN:5,' ',SUBSTR(LINPROG,3,INDEX(LINPROG,'*)')-3))
243 END
244 (*2 CASO CONTRARIO *)
245 ELSE
246 BEGIN
241 (*2 E' DE COMENTARIO NIVEL 2 E USUARIO QUER NIVEL 2 ? *)
248 IF ((SUBSTR(LINPROG,1,3) = '(*2') AND (OPCAO = 2)) THEN
249 BEGIN
250 LINPAG := LINPAG + 1;
251 CABECALHO;
250 (*2 ESCREVE LINHA NO RELATORIO *)
253 WRITELN(SAIDA,' ':4,NUMLIN:5,' ',SUBSTR(LINPROG,3,INDEX(LINPROG,'*)')-3));
254 END;
255 END;
256 END; (* IF *)
251 END; (* IF *)
258 END; (* WHILE *)
259 WRITELN(SAIDA);
260 (*2 FIM DE RELATPAS *)
261 END; (* RELATPAS *)
262
263
264 (*2----------------------------------------------------------------------------*)
265 (*2 P R O G R A M A P R I N C I P A L *)
266 (*2----------------------------------------------------------------------------*)
267 (*2 INICIO DE COMENTARIO *)
268 BEGIN
269 OPCAO = 0;
PROGRAMA: COMENT.PAS DOC.NIVEL 3 DATA: 8-AUG-1988 16:00 PAG: 6
270 DATA_HORA := ' ';
271 NUMLIN := 0;
272 (*2 EXIBE TELA DE ENTRADA *)
273 MOSTRA_TELA;
274 (*2 OPCAO DO USUARIO E' CONTINUAR ? *)
275 IF ((OPCAO > 0) AND (OPCAO < 4)) THEN
276 BEGIN
277 (*2 ABRE ARQUIVOS DE ENTRADA E SATDA *)
278 OPEN(ENTRADAS,NOMEARQ,
279 HISTORY := OLD,
280 ACCESS_METHOD := SEQUENTIAL);
281 OPEN(SAIDA,'COMMENT.LIS',HISTORY := NEW);
282 RESET(ENTRADA);
283 REWRITE((SAIDA);
284 RETORNO := SYS$ASCTIM(,DATA_HORA,,);
285 (* FORCA A IMPRESSAO DO CABECALHO NA PRIMEIRA PAGINA *)
286 LINPAG := 70;
287 CABECALHO;
288 END; (* IF *)
289 (*2 OPCAO DO USUARIO E' NIVEL 1 OU 2 ? *)
290 CASE OPCAO OF
291 1,2,3 : BEGIN
292 IF (NOMEARQ.LENGTH > 20) THEN
293 NOMEARQ := SUBSTR(NOMEARQ,1,20);
294 (*2 ENTRADA ESTA' EM PASCAL ? *)
295 IF (LING = 'P') THEN
296 (*2 PROCESSA ARQUIVO EM PASCAL *)
297 RELATPAS
298 (*2 CASO CONTRARIO *)
299 ELSE
300 (*2 PROCESSA ARQUIVO EM COBOL OU ZIM *)
301 IF (LING = 'C') THEN
302 RELAT('*')
303 ELSE
304 RELAT('%');
305 (* MANDA RELATORIO PARA A FILA DE IMPRESSAO *)
306 (* COMANDO := 'PRINT COMMENT.LIS'; *)
307 (* LIB$DO_COMMAND(COMANDO); *)
308 END; (* 1,2,3 *)
309 END; (* CASE *)
310 (*2 ALGUM ARGUIVO FOI ABERTO ? *)
311 IF ((OPCAO > 0) AND (OPCAO < 4)) THEN
312 BEGIN
313 (*2 FECHA ARQUIVOS UTILIZADOS *)
314 CLOSE(ENTRADA);
315 CLOSE(SAIDA);
316 END;
317 (*2 FIM DE COMENTARTO *)
318 END. (* COMENTARIO *)