# Projeto Infocont
==================
# Legenda deste TODO file
-------------------------
#: Tpico finalizado.
o: Tpico em aberto p/ discusso.
-: Tpico em desenvolvimento.

1. Se um tpico inicial tiver o sustenido(#), ele est finalizado para mim,
   Hudson, entretanto, aberto para opinies de outras pessoas.

# cbl2cob.cob
-------------
- Estudar como fazer o parsing da linha de comando.
  - Usar verbo "unstring" ou "inspect" para fazer o parsing dos verbos
    com o inspect, mais trabalho de vetores, porm mais testes(embora
    generalizados). Com o unstring, menos trabalho de vetores, porm 
    menos testes generalizados e mais cdigo. Sugesto por ora  usar
    unstring.
  - Como converter um fonte?
    - Como quebrar as frases?
      - Unstring de uma varivel indexando esta varivel a uma matriz.
        ex: unstring ws77-var delimited by ' ' 
                into ws02-index(1) ws02-index(2) ws02-index(3)...
            end-unstring
      - O limite de indices  65(Conforme desenvolvido pelo Daniel
      	Mengarda - InfoCont Sistemas Integrados Ltda).
    - Como determinar o que modificar, vai ser apenas gerador, ou 
      vai ser conversor?
      - Conversor: Converte(Modifica) frases j existentes.
      - Gerador:   Gera novas frases a partir de frases existentes.
      - Acho que o cbl2cob ter as duas partes.
    - como traduzir uma frase?
      - Inspecionar a frase, para verificar se  necessrio converso
        ou gerao, a partir de testes condicionais(verbo inspect). 
      - Quebrar a frase, indexando os "pedaos" desta frase, para que 
        possa ser lida ao ser feito um lao de repetio.
       	(verbo unstring)
    - aonde pegar possveis extenses do cobol?
    - qual verbo usar? inspect ou unstring, e quando?
      Inspect:  Inspeo de frases.
      Unstring: Quebra de frases.
    - h mais verbos interessantes do que estes?
      At o momento, no.
- Distribuio.
  - Apenas um binrio com vrias bibliotecas embutidas dentro do binrio.
- Verificao dos arquivos
  - se existe arquivo de entrada ou no.
  - se pode criar arquivo de sada ou no.
- Por ltimo: Re-escrever o fonte.  
  - comentar os itens.
  - otimizar os fontes, com procedures definidas.
    - definir ainda.  tudo imperativo, infinitivo ou o que?
o Caractersticas do front-end.
  o Verifica se h switches erradas.
  o Verificao se h duplicao de arquivos(entrada e sada).
  o Verificao se h arquivo de entrada.
  o Pega variveis com caminho absoluto ou caminho relativo
  o Tem a caracterstica de separar o nome do arquivo do diretrio
    (basename e path), sofistificao no front-end
  o As variveis podem ser em qualquer tabulao
  o Tem caractersticas fixas:
    cbl2cob [opcoes] [-i arquivo de entrada] [-o arquivo de saida]
  o Switches de uso:
    o d: dialeto.
    o i: arquivo de entrada.
    o o: arquivo de saida.
    o v: sada verbosa.
    o V: verso.
    o h: ajuda.
o Prepara switches para chamar o pr-processador.
o Chama o pr-processador via call "system".
  o  chamado via call "system" para que o usurio possa escolher
    entre usar o pr-processador ou usar o front-end(que ir 
    cham-lo do mesmo jeito).
  o H duas chamadas, uma para abrir os copybooks e outra para fechar os copy
    books.
- Chama um scanner mediante o dialeto escolhido(dialeto+scanner.cob).
  (ex: mfscanner.cob) (No implementado).
- Chama um parser mediante o dialeto escolhido(dialeto+parser.cob)
  (ex: mfparser.cob) (No implementado).

# cbl2cobpp.cob
---------------
- Pr-processador para processar os fontes.
  - Motivo: O verbo COPY permite que voc insira um arquivo externo dentro
            de um programa fonte COBOL. Ento, qual seria a melhor maneira
	    de se converter um fonte desta maneira?
  - Idias: 	    
	    Atualmente as possveis idias que me vieram, foram as seguintes:
	    - Processar os copybooks individualmente, ou seja, o usurio
	      os pr-processaria manualmente. Ento quando o parser 
	      encontrasse uma linha com o verbo COPY, ele iria pular essa 
	      linha.
	    - Quando o parser encontrasse uma linha com o verbo COPY, ele 
   	      chamava um pr-processador, que abria o fonte, lia e o convertia.
	      Seria chamada uma programa que faria isso, s iria ler e 
	      processar dados, mas seria um subprograma, ento os dados 
	      iriam ser passados via linkage.
	    - Seria criado um programa especfico que iria criar um 
	      novo arquivo fonte COBOL, a partir de um arquivo fonte COBOL
	      j existente, com algumas opes determinadas, como abertura
	      ou fechamento de copybooks. 
	      Este programa seria separado e poderia ser chamado, ou via 
	      linha de comando ou pelo programa principal, atravs de 
	      uma chamada de sistema(Ou seja, os dados no seriam passados 
	      via linkage, mas por arquivos). A medida que fosse lendo 
	      o arquivo de entrada, ele iria gravando um arquivo de sada.
	      Para os copybooks pr-processados, poderiam ser criados 
	      copybooks com o nome modificado, derivado do nome original.
	      Acho esta a melhor deciso.
	    - Poderia ser criado o programa fonte e seus copybooks, com um
	      sufixo semelhante ao dialeto selecionado.
	      ex: # fonte (arquivo de entrada e saida diferente)
	          teste.cbl    -> entrada
		  teste.cob.mf -> intermedirio
	          teste.cob    -> Saida
		   
		  # copybook (mesmo arquivo de entrada e sada)
		  header.cpy    -> entrada
		  header.cpy.mf -> intermediario
		  header.cpy    -> saida
  - Particularidades do COPY.
    - Armazenamentos
      - Diretrio local/remoto e/ou diretrio de varivel de ambiente.
    - Caractersticas.
      - entre aspas:  COPY "workfile.cpy". (Suporta apenas este por enquanto)
      - sem aspas:    COPY workfile.cpy.
      - sem extenso: COPY workfile.
  - Pr-processamento.
    - Como processar os fontes, traduzir o cdigo sempre para minusculo ou
      dar a oportunidade do usurio escolher?
      - No haver escolha de case. O programa fonte ser modificado apenas
        aonde houver gerao ou converso de frases.
    - Ao encontrar um verbo COPY.
      - Descobrir que tipo de caracterstica e armazenamento ele tem.
      - No arquivo de sada, criar uma linha comentada, desta maneira:
        (7)* Copybook <arquivo> - Abertura.
	(7)* Copybook <arquivo> - Fechamento.
	- Onde:
	(7). Col 7.
	<arquivo>. Nome do arquivo. Deve ser mantidos as caractersticas.
	Nesta etapa, o objetivo  s pr-processar mesmo.
    - Novos Copybooks. (No suportado ainda, talvez no seja necessrio).
      - Devem ter um sufixo que diga que o arquivo  convertido, talvez
        seja at interessante usar uma extenso. Ou ento eles poderiam
	ter o mesmo nome do copybook inicial, mas apenas com uma letra
	ou item diferenciando.

# cblm2m
--------
o Conversor de case.
  o Motivo: Esta rotina, poderia ser um pequeno programa apenas. Entretanto,
    se um usurio quiser apenas mudar a case do seus fontes, ele teria que 
    re-adaptar o programa. Ento achei melhor criar um pequeno programa,
    com um pequeno front-end, que facilite a vida do usurio. Isso no 
    mudaria em nada o conversor, uma vez que eu poderia chamar o programa
    via call "system" e o usurio nem notaria que isso aconteceu.
  o Idias: Estava pensando nas seguintes idias:
    o O conversor no deve mudar o valor da clusula PROGRAM-ID ou
      END-PROGRAM.
    o O conversor no deve mudar os tens entre aspas.
  o Concluso: Aps ter desenvolvido o aplicativo, conclu que a melhor maneira
               para se mudar a case de um arquivo seria, durante o processo de 
	       pr-processamento, criar uma varivel intermediria, e nesta varivel 
	       intermediria, mud-la para uma case(maiscula, por exemplo) a
	       a nvel de testes de condio.
	       Se houver tempo, talvez melhore este conversor, entretanto no
	       ser minha prioridade por agora.

# Disclaimer 
  o Criar disclaimer para o COBOL traduzido para o portugus. 
  o Pegar no site da FSF ou conectiva o COPIA.pt_BR(COPYING) e a licena
    traduzida.
  o Seguir recomendaes de Jorge Godoy e usar o disclaimer e o COPYING
    em ingls, devido a FSF no ter direitos legais no Brasil.

# Padronizao
# Identification division.
  o No vou colocar date-compiled, installation e security pois no vejo
    necessidade. Seria interessante o uso do remarks, porm ele no faz 
    parte do COBOL 85. Ento irei colocar um comentrio sobre isso depois
    do date-written.
  o Achei vivel a criao do nome cob2tc. Pensei primeiro em mf2tc, mas
    achei melhor generalizar, pois assim poderamos criar uma switch para
    determinar qual tipo de dialeto ser o arquivo de entrada. (t=[ARG]).
    Depois pensei em cob2tc, o COB seria para o fonte COBOL de qualquer 
    dialeto e o TC, seria para o TC. Inicialmente soa como se fosse s 
    do TC, mas como o TC seguiria os standards, provavelmente no haveria 
    problema em coloc-lo. Tambm poderimos colocar o nome como cbl2cob, 
    pois assim seria bem genrico. O CBL representaria o fonte COBOL em 
    diversos dialetos e o COB representaria o fonte COBOL regido pelo 
    standard. Entretanto isso seria apenas para colocar um nome intuitivo, 
    mas o usurio poder colocar o fonte com qualquer extenso. Acho melhor 
    o cbl2cob.
  o O fonte ser desenvolvido em formato fixo, pois quero que ele fique
    bem intuitivo. Ento, irei usar comentrios fixos (*) na coluna 7
    e comentrios inline(*>) nas colunas posteriores a coluna 7. Ser 
    necessrio ento o uso da switch "-F" ao compil-lo.
# File section.
   o O tamanho do registro ser de 256 posies. Estou seguindo como 
     base a partir do gscreen e do scanner do TC(scan.c). Ou seria melhor 
     colocar isso como uma switch do conversor? (s=[ARG]). No concordo 
     com a criao de uma switch, pois isso acarretaria a criao de uma
     srie de perform's para fazer a leitura byte a byte do registro e 
     poderia aumentar o tempo de converso.
# Prefixo para variveis.
  o Prefixo inicial,
    o ws: working-storage section.
    o ss: screen section.
    o ls: linkage section.
  o Prefixo adicional,
    o Nivel da varivel.
    o Nivel da varivel,
    o Consecutivo: 01, 02, 03...
# Verbos.
  o Indentao de 3 posicoes no perform.
  o Indentao de 4(ou 2) posicoes no evaluate.
    o Indentacao de 6 posicoes no when.
  o Indentacao de 2 posicoes no if.  
  

