/***************************************
*                                      *
*   Copyright (c) 1998 Jean-Eric Pin   *
*   All rights reserved.               *
*                                      *
*   TAB = 2 spaces                     *
*                                      *
***************************************/

/*-------------------------------------------------------------------
 * 
 * FichierUnix.c  OK
 *
 *-------------------------------------------------------------------
 */ 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include "Erreurs.h"
#include "Main.h"
#include "Espace.h"
#include "FichierUnix.h"
#include "Globales.h"
#include "Initialisation.h"
#include "Memoire.h"
#include "Utilitaires.h"
#if  SYSTEME == MAC
  #include <unix.h>
#endif

extern float Version;
extern numero TailleMaxi, NbElements;
extern unsigned short NbLettres, TypeCalcul, TypeSemigroupe, SemigroupeRenverse,
                      InitiauxASpecifer, FinauxASpecifer, PartiePointee, MemoireAllouee;
extern unsigned long TailleTableDeHachage, TailleTableDeHachageMoinsUn;
extern char **Messages; 
extern char NomExemple[255];
extern char DirExemples[255];
extern Sauvegarde_ Sauvegarde;
extern Lecture_ LectureFichier;

/**************************************************
*
* ChoixNom      
*
**************************************************/

void ChoixNomExemple()
{  
  char Nom[LONGUEUR_NOM];
  int erreur;

  printf("%s ", Messages[M_Give_name_file]);    /* printf("Donnez le nom du fichier : ");  */
  if (scanf("%s", Nom) == EOF)
  {
    erreur = errno;
    Erreur_scanf(erreur);
    printf("scanf error\n");
    exit(1);
  }
  strcpy(NomExemple, DirExemples);
  strcat(NomExemple, Nom);
}

/**************************************************
*
* Ouverture : Ouverture d'un fichier par fopen.      
*
**************************************************/

FILE *Ouverture(const char *Nom, const char *mode)
{  
  FILE *fichier;      /* Fichiers KR p.158 */
  int erreur;

  fichier = fopen(Nom, mode);
  if (fichier == 0)
  {
    erreur = errno;
    Erreur_fopen(erreur);
    printf("%s %s !\n", Messages[M_Pb_opening], Nom);    /* printf("Probleme a la creation de %s !\n", nom);  */
    return 0;
  }
  return(fichier);
}

/**************************************************
*
* Fermeture : Fermeture d'un fichier par fclose.      
*
**************************************************/

void Fermeture(FILE *fichier)
{
  int erreur;
  int retour = fclose(fichier);
  
  if (retour != 0)
  {
    erreur = errno;
    Erreur_fclose(erreur);
    printf("%s\n", Messages[M_Pb_closure]);    /* printf("Probleme a la fermeture d'un fichier !\n");  */
  }
}

/************************************
*
* DialogueSauvegardeFichier.      
*
************************************/

void DialogueSauvegardeFichier()
{
  FILE *fichier;      /* Fichiers KR p.158 */
  int erreur;

  do
  {
    ChoixNomExemple();
    fichier = Ouverture(NomExemple, "w");
  }
  while (!fichier);
  if (fprintf(fichier, "%8f %% Version de Semigroupe\n", Version) < 0)
  {
    erreur = errno;
    printf("fprintf %8f %% Version de Semigroupe failed!\n", Version);
    Erreur_printf(erreur);
    return;
  }  
  if (fprintf(fichier, "%8lu %% Taille maximum\n", TailleMaxi) < 0)
  {
    erreur = errno;
    printf("fprintf %8lu %% Taille maximum failed!\n", TailleMaxi);
    Erreur_printf(erreur);
    return;
  }  
  if (fprintf(fichier, "%8d %% Type de calcul\n", TypeCalcul) < 0)
  {
    erreur = errno;
    printf("fprintf %8d %% Type de calcul failed!\n", TypeCalcul);
    Erreur_printf(erreur);
    return;
  }  
  if (fprintf(fichier, "%8d %% Type de semigroupe\n", TypeSemigroupe) < 0)
  {
    erreur = errno;
    printf("fprintf %8d %% Type de semigroupe failed!\n", TypeSemigroupe);
    Erreur_printf(erreur);
    return;
  }  
  if (fprintf(fichier, "%8d %% Partie pointee ?\n", PartiePointee) < 0)
  {
    erreur = errno;
    printf("fprintf %8d %% Partie pointee ? failed!\n", PartiePointee);
    Erreur_printf(erreur);
    return;
  }  
  if (PartiePointee)
  {
    if (fprintf(fichier, "%8d %% Initiaux specifies\n", InitiauxASpecifer) < 0)
    {
      erreur = errno;
      printf("fprintf %8d %% Initiaux specifies failed!\n", InitiauxASpecifer);
      Erreur_printf(erreur);
      return;
    }  
    if (fprintf(fichier, "%8d %% Finaux specifies\n", FinauxASpecifer)< 0)
    {
      erreur = errno;
      printf("fprintf %8d %% Finaux specifies failed!\n", FinauxASpecifer);
      Erreur_printf(erreur);
      return;
    }  
  }
  if (fprintf(fichier, "%8d %% Semigroupe renverse ?\n", SemigroupeRenverse) < 0)
  {
    erreur = errno;
    printf("fprintf %8d %% Semigroupe renverse failed!\n", SemigroupeRenverse);
    Erreur_printf(erreur);
    return;
  }  
  if (fprintf(fichier, "%8d %% Nombre de generateurs\n", NbLettres) < 0)
  {
    erreur = errno;
    printf("fprintf %8d %% Nombre de generateurs failed!\n", NbLettres);
    Erreur_printf(erreur);
    return;
  }  
  Sauvegarde(fichier);
  Fermeture(fichier);
}

/************************************
*
* LectureExemple.      
*
************************************/

void LectureExemple(FILE *fichier)      /* Fichiers KR p.158 */
{
  char buffer[TAILLE_BUFFER];
  int erreur;

  fgets(buffer, TAILLE_BUFFER, fichier);  /* Version ignoree pour l'instant */
  if (fscanf(fichier, "%ld %% Taille maximum", &TailleMaxi) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  if (fscanf(fichier, "%hd %% Type de calcul", &TypeCalcul) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  if (fscanf(fichier, "%hd %% Type de semigroupe", &TypeSemigroupe) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  if (fscanf(fichier, "%hd %% Partie pointee ?", &PartiePointee) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  if (PartiePointee)
  {
    if (fscanf(fichier, "%hd %% Initiaux specifies", &InitiauxASpecifer) != 1)
    {
      printf("scanf error\n");
      exit(1);
    }
    if (fscanf(fichier, "%hd %% Finaux specifies\n", &FinauxASpecifer) != 1)
    {
      printf("scanf error\n");
      exit(1);
    }
  }
  if (fscanf(fichier, "%hd %% Semigroupe renverse ?", &SemigroupeRenverse) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  if (fscanf(fichier, "%hd %% Nombre de generateurs", &NbLettres) != 1)
  {
    printf("scanf error\n");
    exit(1);
  }
  Choix();
  LectureFichier(fichier);
  TailleTableDeHachage = EstimationTailleTableDeHachage(TailleMaxi + 1);
  TailleTableDeHachageMoinsUn = TailleTableDeHachage - 1;
  Fermeture(fichier);
}

/************************************
*
* ModificationFichier.      
*
************************************/

void ModificationFichier(FILE *fichier)      /* Fichiers KR p.158 */
{
  char buffer[TAILLE_BUFFER];
  long n;
  int erreur;

  fgets(buffer, TAILLE_BUFFER, fichier);
  n = ftell(fichier);
  rewind(fichier);
  fseek(fichier, n, SEEK_SET);
  if (fprintf(fichier, "%8lu %% Taille maximum\n", NbElements) < 0)
  {
    erreur = errno;
    printf("fprintf %8lu %% Taille maximum failed!\n", NbElements);
    Erreur_printf(erreur);
    return;
  }  
  Fermeture(fichier);
}