/***************************************
*                                      *
*   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 "Utilitaires.h"

extern unsigned short NbEtats, InitiauxASpecifer, FinauxASpecifer;
extern numero 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;
    }
  }
}

/****************************************************
*
* 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;
    }
  }
}

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

void EntreeEtatsInitiauxFinaux(void)
{
  if (InitiauxASpecifer)
    EntreeEtatsInitiaux();  
  if (FinauxASpecifer)
    EntreeEtatsFinaux();
}

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

void EntreePartieStandard(void)
{
  numero 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;
    }
  }
}

/****************************************************
*
* 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;
  }
printf("NbEtats = %d\n", NbEtats);
  for (q = 0; q <= NbEtats; q++)
  {
    printf("*  q = %d\n", 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;
  }
  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)
{
  short q; 
  char buffer[TAILLE_BUFFER];

  fgets(buffer, TAILLE_BUFFER, fichier);    /* Pour absorber le \n */
  fgets(buffer, TAILLE_BUFFER, fichier);    /* Ligne  % Etats initiaux */
  AlloueMemoireInitiaux(); /* Initialisation a 0 automatique */
  while (fscanf(fichier, "%hu", &q) == 1)
    EtatsInitiaux[q] = 1; 
}

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

void LectureFinaux(FILE *fichier)
{
  short q;
  char buffer[TAILLE_BUFFER];

  fgets(buffer, TAILLE_BUFFER, fichier);    /* Pour absorber le \n */
  fgets(buffer, TAILLE_BUFFER, fichier);    /* Ligne  % Etats finaux */
  AlloueMemoireFinaux(); /* Initialisation a 0 automatique */
  while (fscanf(fichier, "%hu", &q) == 1)
    EtatsFinaux[q] = 1; 
}