
{
  Le_fasta.pas: dado um arquivo fasta, extrai o gi, o nome e o tamanho da 
              sequencia associada.
 
  Sergio Campos -- 07/2003

  Arquivo exemplo:
>gi|1111|ref|NC_003216.1| Testus
ABC
>gi|2222|ref|NC_003216.1| Testus 2
ABC
DEF
>gi|16798783|ref|NC_003216.1| Bacteriophage A118 virion, complete genome
AGGGAGTGTGGTGATATGTAGTGAAACTAACCGAAAAACAAAAACGATTTGCGGATGAATATATAAAATG
CGGTAATGCTACAGAAGCCGCTCGCTTGGCTGGTTATAGTTTGAAAACGGCTAATCGTATAGCGACCGAA
AACTTGTCAAAACCAGTCATCAAAGACTATATAGCCAACGCTTTAGAGAAGTTAGAAGCAGATCGTGTTA
TGGACTACACGGAAGCAATGCAATTGCTAACTGAAATAGCTCGCGGTGAAATGACAGAAAAGGTCGTTGT
...

  Pontos de observação do parser:

1. Quando achar > identifica nova sequência
2. | separa campos no título, e permite retirar gi e nome

Autômato do parser:

  estado 0: estado inicial, identificou a primeira sequencia ( > )
  estado 1: procura o | que inicia o gi
  estado 2: lê o gi
  estado 3 e 4: pula os próximos |
  estado 5: lê o nome da sequência
  estado 6: lê a sequência e calcula o tamanho

       >      |      |      |      |      \n
    0 ---> 1 ---> 2 ---> 3 ---> 4 ---> 5 ---> 6
     ^                                       /
      \-------------------------------------/
                                        \n

}

program le_fasta;

var arq: text;
    size: longint;  {se não for longint dá overflow! go figure...}
    c: char;
    state: integer;

begin
  assign(arq, Paramstr(1));
  reset(arq);

  state := 0;
  while not eof(arq) do begin
     read (arq, c);
     {writeln('estado: ', state, ' c: ', c, ' size: ', size);}
     case state of
      0: if (c = '>') then begin
            state := 1;
         end;
      1: if (c = '|') then begin
            size := 0;
            state := state + 1;
            write('Sequência: ');
         end;
      2: if (c <> '|') then begin
           write(c);
         end else begin
           write(', ');
           state := state + 1;
         end;
      3: if (c = '|') then state := state + 1;
      4: if (c = '|') then state := state + 1;
      5: if (c <> ^j) then begin
           write(c);
         end else begin
           write(' - Tamanho:');
           state := state + 1;
         end;
      6: if (c = '>') then begin
           writeln(size);
           state := 1;
         end else begin
           if (c <> ^j) then size := size + 1;
         end;
    end;
  end;
  writeln(size);
  close(arq);
end.


