/*
                   INTRODUCAO `A LINGUAGEM DE PROGRAMACAO


   /######        /###        /#####       /#####        /###      /###
  | ### /###    /### ###    /###__/###   / ###__/##    /### ###   | ###
  | ###| ###   /###_/ ###  | #### \/_/  | ###  |/_/   /###_/ ###  | ###
  | ######_/  | ### | ###  \ / ####     | ###        | ### | ###  | ###
  | ###__/    | #########    \ / ####   | ###        | #########  | ###
  | ###       | ###__/###   /###\  ###  |/ ###  /##  | ###__/###  | ###
  | ###       | ### | ###  |/  ##### /   \  ##### /  | ### | ###  | #######
  |/__/       |/__/ |/__/   \ /____/      \/____/    |/__/ |/__/  |/______/



              ----------------------------------------------
                 Nome do        Tamanho        Quantidade
                 arquivo        original       de paginas
              ----------------------------------------------
                 CAPA.TXT         1560             1
                 INDICE.TXT       7333             2
                 INTROD.TXT      20979             6
                 CAP1.TXT        40504            14
                 CAP2.TXT        32523            12
                 CAP3.TXT        40264            15
                 CAP4.TXT        61206            23
                 CAP5.TXT        55906            24
                 CAP6.TXT        20427             8
                 CAP7.TXT        21382             8
                 CAP8.TXT        56445            24
                 CAP9.TXT        55903            23
                 CAP10.TXT       50929            19
                 CAP11.TXT       17980             7
                 CAP12.TXT       57909            23
                 CAP13.TXT       20611             8
                 APEND-A.TXT      6672             2
                 APEND-B.TXT      9957             3
                 APEND-C.TXT     11250             4
                 APEND-D.TXT     11534             4
                 APEND-E.TXT      7533             3
                 APEND-F.TXT     25822             9
                 APEND-G.TXT     38580            20
                 REFER.TXT        1737             1
            -----------------------------------------------
          TOTAL  24 arquivos    674946           263



     EXEMPLOS.EXE  contem os programas-exemplo relacionados com  os  respecti-
vos capitulos  listados a seguir. Convencionamos que  CAPm-n.PAS  e' o n-esimo
programa do capitulo m.

       Capitulo 2: CAP2*.PAS               Capitulo 9:  CAP9*.PAS
                                                        DEF_TIPO.INC
       Capitulo 3: CAP3*.PAS                            CLAS_ARQ.INC
                                                        PESQ_BIN.INC
       Capitulo 4: CAP4*.*                              MOSTRE.PAS
                                                        INICIA.PAS
       Capitulo 5: CAP5*.PAS                            LISTAGEM.PAS
                   CURSOS.PAS                           ATUALIZA.PAS
                   REPETE.PAS                           PROCURE.PAS
                   TRIG.PAS
                   HIPER.PAS               Capitulo 10: CAP10*.PAS
                   PRIMO.PAS                            MENU.INC
                   POT.PAS                              CAR.INC
                   POT_2.PAS                            CONVERTE.PAS
                   INTEGRAL.PAS
                   DERIV.PAS               Capitulo 11: CAP11*.PAS
                   CALCRAIZ.PAS
                   MAX.PAS                 Capitulo 12: CAP12*.PAS
                                                        GRAF.INC
       Capitulo 6: CAP6*.PAS                            TELAINI.PAS

       Capitulo 7: CAP7*.PAS               Capitulo 13: CAP13*.PAS
                                                        TESTE.PAS
       Capitulo 8: CAP8*.PAS                            MAX_MIN.PAS
                   ESCALONA.INC
                   MATRIZES.INC
                   POLI.INC



O texto foi criado no periodo novembro/1991-fevereiro/1992 usando o
MS-Word 2.0 para MS-DOS. Os textos aqui apresentados foram alterados
pelo programa CONVERTE.C (listado a seguir) para eliminar caracteres
de formatacao (letras tipo negrito, expoentes, indices) que haviam
sido acrescentados pelo Word. Pode ter sido introduzido com isso 
algum erro, como por exemplo transformacao de 'a ou 'A ou a' ou A'
em A com acento agudo, entre outros erros semelhantes. 

======================================================================= */

/*** CONVERTE.C  -- Converte as notas do curso "Introducao `a linguagem
de programacao Pascal" para texto comum ***/

#include <stdio.h>

char *EliminaCaracter(char *x, char car_x) {

/* Elimina todas as ocorrencias do caracter dado do string x.
   Ex.: EliminaEspacos(".1..2..3.", '.') = "123"    */

  register int i, j = 0, comprimento = 0;
  char *aux;

  if (x[0]) while (x[++comprimento]);
  if ((aux = (char *) malloc(sizeof(char)*(comprimento + 1))) == NULL)
    return x;

  for (i = 0; i < comprimento; i++)
    if (x[i] != car_x) aux[j++] = x[i];
  aux[j] = '\0';
  strcpy(x, aux);
  free(aux);
  return x;
}


char *EliminaSubstr(char *x, char *a) {

/* Elimina "a" em "x" .
   Ex.: EliminaSubstr("abcxyz ABC", "abc") = "xyz ABC"    */

  int tam_x = 0, tam_a = 0, coincide, i = 0, j, k;
  char *aux;

  if (x[0]) while(x[++tam_x]);
  if (a[0]) while(a[++tam_a]);
  if (tam_x < tam_a) return x;
  if ((aux = (char *) malloc(sizeof(char)*(tam_x + 1))) == NULL) return x;

  aux[0] = '\0';
  while (i <= tam_x) {
    j = i;
    k = 0;
    coincide = 0;

    while ((k < tam_a) && (j < tam_x) && (a[k] == x[j])) {
      coincide = coincide + 1;
      k++;
      j++;
    }

    if (coincide == tam_a) {
      i += tam_a;
    } else {
      int n;
      n = strlen(aux);
      aux[n++] = x[i]; aux[n] = '\0';
      i++;
    }
  }

  strcpy(x, aux);
  free(aux);
  return x;
}

char *Substitui(char *x, char *a, char *b) {

/* Substitui "a" por "b" em "x" .
   Ex.: Substitui("abcxyz ABC", "abc", "***") = "***xyz ABC"    */

  int tam_x = 0, tam_a = 0, coincide, i = 0, j, k;
  char *aux;

  if (x[0]) while(x[++tam_x]);
  if (a[0]) while(a[++tam_a]);
  if (tam_x < tam_a) return x;
  if ((aux = (char *) malloc(sizeof(char)*(tam_x + 1))) == NULL) return x;

  aux[0] = '\0';
  while (i <= tam_x) {
    j = i;
    k = 0;
    coincide = 0;

    while ((k < tam_a) && (j < tam_x) && (a[k] == x[j])) {
      coincide = coincide + 1;
      k++;
      j++;
    }

    if (coincide == tam_a) {
      strcat(aux, b);
      i += tam_a;
    } else {
      int n;
      n = strlen(aux);
      aux[n++] = x[i]; aux[n] = '\0';
      i++;
    }
  }

  strcpy(x, aux);
  free(aux);
  return x;
}

void main(int argc, char **argv) {

  FILE *origem, *destino;
  char *ch, linha[1000], str1[10], str2[10], str3[10], str4[10], str5[10],
       str6[10], c1 = 14, c2 = 8, c3 = 20, c4 = 12, c5 = 18;
  int Acento_antes_da_letra = 1;

  str1[0] = 27;
  str1[1] = 64;
  str1[2] = 27;
  str1[3] = 67;
  str1[4] = 66;
  str1[5] = '\0';

  str2[0] = 15;
  str2[1] = 14;
  str2[2] = '\0';

  str3[0] = 20;
  str3[1] = 18;
  str3[2] = '\0';

  str4[0] = 12;
  str4[1] = 26;
  str4[2] = '\0';

  str6[0] = 27;
  str6[1] = 45;
  str6[2] = '\0';

  str5[0] = 27;
  str5[1] = 45;
  str5[2] = 1;
  str5[3] = '\0';

  if (argc < 3) {
    printf("\n\nUso: CONVERTE arquivo_origem"
                       " arquivo_destino [acento_depois_da_letra]\n");
    return;
  }

  if ((origem = fopen(argv[1], "rt")) == NULL) {
    printf("\n\nERRO: arquivo %s nao pode ser aberto.\n", argv[1]);
    return;
  }

  if ((destino = fopen(argv[2], "wt")) == NULL) {
    printf("\n\nERRO: arquivo %s nao pode ser aberto.\n", argv[2]);
    return;
  }

  if (argc > 3) Acento_antes_da_letra = 0;

  do {
    ch = fgets(linha, 100, origem);
    if (ch != NULL) {

      EliminaSubstr(linha, str1);
      EliminaSubstr(linha, str2);
      EliminaSubstr(linha, str3);
      EliminaSubstr(linha, str4);
      EliminaSubstr(linha, str5);
      EliminaSubstr(linha, str6);

      EliminaCaracter(linha, c1);
      EliminaCaracter(linha, c2);
      EliminaCaracter(linha, c3);
      EliminaCaracter(linha, c4);
      EliminaCaracter(linha, c5);

      if (Acento_antes_da_letra) {
        Substitui(linha, ",c", "");
        Substitui(linha, ",C", "");

        Substitui(linha, "\"u", "");
        Substitui(linha, "\"U", "");

        Substitui(linha, "'u", "");
        Substitui(linha, "'U", "");
        Substitui(linha, "'i", "");
        Substitui(linha, "'I", "");
        Substitui(linha, "'o", "");
        Substitui(linha, "'O", "");
        Substitui(linha, "'e", "");
        Substitui(linha, "'E", "");
        Substitui(linha, "'a", "");
        Substitui(linha, "'A", "");

        Substitui(linha, "~a", "");
        Substitui(linha, "~A", "");
        Substitui(linha, "~o", "");
        Substitui(linha, "~O", "");

        Substitui(linha, "`a", "");
        Substitui(linha, "`A", "");

        Substitui(linha, "^e", "");
        Substitui(linha, "^E", "");
        Substitui(linha, "^a", "");
        Substitui(linha, "^A", "");
        Substitui(linha, "^o", "");
        Substitui(linha, "^O", "");

      } else {

        Substitui(linha, "c,", "");
        Substitui(linha, "C,", "");

        Substitui(linha, "u\"", "");
        Substitui(linha, "U\"", "");

        Substitui(linha, "u'", "");
        Substitui(linha, "U'", "");
        Substitui(linha, "i'", "");
        Substitui(linha, "I'", "");
        Substitui(linha, "o'", "");
        Substitui(linha, "O'", "");
        Substitui(linha, "e'", "");
        Substitui(linha, "E'", "");
        Substitui(linha, "a'", "");
        Substitui(linha, "A'", "");

        Substitui(linha, "a~", "");
        Substitui(linha, "A~", "");
        Substitui(linha, "o~", "");
        Substitui(linha, "O~", "");

        Substitui(linha, "a`", "");
        Substitui(linha, "A`", "");

        Substitui(linha, "e^", "");
        Substitui(linha, "E^", "");
        Substitui(linha, "a^", "");
        Substitui(linha, "A^", "");
        Substitui(linha, "o^", "");
        Substitui(linha, "O^", "");
      }

      fprintf(destino, "%s", linha);
    }
  } while (ch != NULL);

  fclose(origem);
  fclose(destino);
}

