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

/*-------------------------------------------------------------------
 * InitiauxFinaux.c    Jean-Eric Pin 18/04/97
 *-------------------------------------------------------------------
 */     

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include "Erreurs.h"
#include "Globales.h"
#include "InitiauxFinaux.h"
#include "Main.h"
#include "Memoire.h"
#include "Sortie.h"
#include "SortieLaTeX.h"
#include "Utilitaires.h"

extern unsigned short NbEtats, MemoireInitiauxAllouee, MemoireFinauxAllouee,
                      InitiauxDejaSpecifies, FinauxDejaSpecifies;
extern unsigned long NbElements;
extern char s[TAILLE_CHAINE_MAX];
extern info *Table;     /* La table contenant les informations sur les elements */
extern short *EtatsInitiaux, *EtatsFinaux;
extern char **Messages; 

/****************************************************
*
* EntreeEtatsInitiaux. 
*
****************************************************/

void EntreeEtatsInitiaux(void)
{
  short q;
  char Type;

  AlloueMemoireInitiaux();
  printf("%s\n", Messages[M_Initial]);    /* Donner les etats initiaux en terminant par } */
  printf("I = {");
  while ((Type = LireChaines(s)) != '}')
  {
    switch(Type)
    {
      case NOMBRE :
        q = atoi(s);
        if ((q >= 0) && (q <= NbEtats))
          EtatsInitiaux[q] = 1;
      break;

      case ',' : case ';' : case ':' : case '.' :
      break;
      
      default :
      printf("Wrong format\n");
    }
  }
  InitiauxDejaSpecifies = 1;
}

/****************************************************
*
* EntreeEtatsFinaux. 
*
****************************************************/

void EntreeEtatsFinaux(void)
{
  short q;
  char Type;

  AlloueMemoireFinaux(); /* Initialisation a 0 automatique */
  printf("%s\n", Messages[M_Final]);    /* Donner les etats finaux en terminant par } */
  printf("F = {");
  while ((Type = LireChaines(s)) != '}')
  {
    switch(Type)
    {
      case NOMBRE :
        q = atoi(s);
        if ((q >= 0) && (q <= NbEtats))
          EtatsFinaux[q] = 1;
      break;

      case ',' : case ';' : case ':' : case '.' :
      break;

/*      default :
      printf("Wrong format\n"); */
    }
  }
  FinauxDejaSpecifies = 1;
}

/****************************************************
*
* EntreeEtatsInitiauxFinaux. OK
*
****************************************************/

void EntreeEtatsInitiauxFinaux(void)
{
  if (!InitiauxDejaSpecifies)
    EntreeEtatsInitiaux();  
  if (!FinauxDejaSpecifies)
    EntreeEtatsFinaux();
}

/****************************************************
*
* EntreePartieStandard. 
*
****************************************************/

void EntreePartieStandard(void)
{
  unsigned long n;
  char Type;

  printf("\n");
  SortieListeElements();            /* Pour connaitre les numeros des elements... */
  printf("%s\n", Messages[M_P]);    /* Donner les numeros des elements de P en terminant par } */
  printf("P = {");
  while ((Type = LireChaines(s)) != '}')
  {
    switch(Type)
    {
      case NOMBRE :
        n = atol(s);
        if ((n >= 1) && (n <= NbElements))
          Table[n].Statut |= EST_DANS_P;
      break;

      case ',' : case ';' : case ':' : case '.' :
      break;

      default :
      printf("Wrong format\n");
    }
  }
}

/****************************************************
*
* SauvegardeInitiaux. OK
*
****************************************************/

void SauvegardeInitiaux(FILE *fichier)
{
  short q;
  int erreur;
  
  if (fprintf(fichier, "        %% Etats initiaux\n") < 0)
  {
    erreur = errno;
    printf("fprintf         %% Etats initiaux failed!\n");
    Erreur_printf(erreur);
    return;
  }
  if (MemoireInitiauxAllouee)
    for (q = 1; q <= NbEtats; q++)
    {
      if (EtatsInitiaux[q] == 1)
        if (fprintf(fichier, "%d ", q) < 0)
        {
          erreur = errno;
          printf("fprintf %d  failed!\n", q);
          Erreur_printf(erreur);
          return;
        }  
    }
  if (fprintf(fichier, "\n") < 0)
  {
    erreur = errno;
    printf("fprintf \\n failed!\n");  
    Erreur_printf(erreur);
    return;
  }
}

/****************************************************
*
* SauvegardeFinaux. OK
*
****************************************************/

void SauvegardeFinaux(FILE *fichier)
{
  short q;
  int erreur;

  if (fprintf(fichier, "        %% Etats finaux\n") < 0)
  {
    erreur = errno;
    printf("fprintf         %% Etats finaux failed!\n");
    Erreur_printf(erreur);
    return;
  }
  if (MemoireFinauxAllouee)
    for (q = 1; q <= NbEtats; q++)
      if (EtatsFinaux[q] == 1)
        if (fprintf(fichier, "%d ", q) < 0)
        {
          erreur = errno;
          printf("fprintf %d  failed!\n", q);
          Erreur_printf(erreur);
          return;
        }      
  if (fprintf(fichier, "\n") < 0)
  {
    erreur = errno;
    printf("fprintf \\n failed!\n");  
    Erreur_printf(erreur);
    return;
  }
}

/****************************************************
*
* LectureInitiaux. OK
*
****************************************************/

void LectureInitiaux(FILE *fichier)
{
  unsigned short q; 

  AlloueMemoireInitiaux(); /* Initialisation a 0 automatique */
  while (fscanf(fichier, "%hu", &q) == 1)
    EtatsInitiaux[q] = 1; 
}

/****************************************************
*
* LectureFinaux. OK
*
****************************************************/

void LectureFinaux(FILE *fichier)
{
  unsigned short q;

  AlloueMemoireFinaux(); /* Initialisation a 0 automatique */
  while (fscanf(fichier, "%hu", &q) == 1)
    EtatsFinaux[q] = 1; 
#ifdef DEBUG
  printf("EtatsFinaux:  %d   %d   %d\n", EtatsFinaux[0], EtatsFinaux[1], EtatsFinaux[2]);
#endif   /* DEBUG */
  /*  FinauxDejaSpecifies = 1; est deja fait */
}