/* brassefich.c */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include "brassefich.h"
#include "hasard.h"

int main (int argc, char *argv[])
{
  FILE *fichsource, *fichdest;

  if (argc != 3) {
    printf ("Entrez le nom du fichier source en 1er paramètre\n");
    printf ("Entrez le nom du fichier destinataire en 2nd paramètre\n");
    return 1;
  }

  else {
    fichsource = fopen (argv[1], "r");
    if (fichsource == NULL) {
      printf ("fichier source inconnu\n");
      exit (1);
    }
    //    rewind (fichsource); /* nécessaire? */
    fichdest = fopen (argv[2], "w");
    srand (time(NULL));  
    brasse_fich (fichsource, fichdest);
  }
  return 0;
}

int estlettre (char c)
{
  return (isalpha(c) ||
	  c == 'é' ||
	  c == 'è' ||
	  c == 'ê' ||
	  c == 'ë' ||
	  c == 'â' ||
	  c == 'à' ||
	  c == 'ù' ||
	  c == 'û' ||
	  c == 'ç' ||
	  c == 'î' ||
	  c == 'ï' ||
	  c == 'ô');
}

void brasse_mot (char *mot, FILE *dest)
{
  int L = strlen (mot); /* nb de lettres restant à afficher */
  int H;                /* nombre de lettres (pas caractère) à parcourir */
  int cour;             /* parcourt la chaine mot */
  if (L <= 3) {
    fputs (mot, dest);
  }
  else {
    fputc (mot[0], dest);
    fputc (mot[1], dest);
    L -= 2;     /* déja 2 char affichés */      
    while (L != 0) {     /* parcours de mot à partir du rang 2 */
      H = hasard(L);     /* 0 <= H < L */
      cour = 2;
      av (cour, H, mot, dest);
      L--; 
    }
    /* fin du while : L == 0 , toutes les lettres ont été affichées */
  }
}

void av (int cour, int H, char *mot, FILE *dest)
{
  if (mot[cour] == '*') {
    cour++;
    av (cour, H, mot, dest);
  }
  else {     /* mot[cour] est une lettre */
    if (H == 0) {
      fputc (mot[cour], dest);
      mot[cour] = '*';
    }
    else {
      cour++;
      H--;
      av (cour, H, mot, dest);
    }
  }
}

void brasse_fich (FILE *source, FILE *dest)
{
  etat etatcour; /* etat de l'automate courant */
  int carcour; /* caractère courant (int pour pouvoir prendre la valeur EOF) */
  char motcour[25]; /* mot en formation */
  int L; /* longueur de motcour */

  etatcour = MOT; /* on entre dans l'automate par l'etat mot */
  L = 0;
  while (etatcour != FIN) {
    switch (etatcour) {

    case MOT :
      carcour = fgetc(source); 
      if (carcour == EOF) {
	etatcour = FIN;
	motcour[L] = '\0';
	brasse_mot (motcour, dest);
      }
      else if (estlettre(carcour)) {
	motcour[L] = carcour;
	L++;
      }
      else {
	etatcour = TRANSITION;
	motcour[L] = '\0';
	brasse_mot (motcour, dest);
	fputc (carcour, dest);
      }
      break;

    case TRANSITION :
      carcour = fgetc(source); 
      if (carcour == EOF) {
	etatcour = FIN;
      }
      else if (estlettre (carcour)) {
	etatcour = MOT;
	motcour[0] = carcour;
	L = 1;
      }
      else {
	fputc (carcour, dest);
      }
    }
  }
}

