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

/*-------------------------------------------------------------------
 * SortieDclasses.c    Jean-Eric Pin 07/12/96
 *-------------------------------------------------------------------
 */     

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Globales.h"
#include "Main.h"
#include "Reduction.h"
#include "Sortie.h"
#include "SortieLaTeX.h"
#include "SortieDclasses.h"
#include "Utilitaires.h"

extern unsigned short NbEtats, NbLettres, NbChiffresNbElements, LongueurMax, TypeCalcul, TypeSemigroupe, 
                      PossedeUnZero, PossedeUnNeutre;
extern unsigned long NbElements, NbRclasses, NbLclasses, NbDclasses, NbHclasses, nZero, DernierMot;
extern info *Table;
extern info2 *Table2;
extern char **Messages;

/****************************************************
*
* SortieNbDclasses. OK
*
****************************************************/

void SortieNbDclasses(void)
{
  printf("%s %1lu\n", (NbDclasses > 1) ? Messages[M_Dclasses] : Messages[M_Dclass], NbDclasses);    
  printf("%s %1lu\n", (NbRclasses > 1) ? Messages[M_Rclasses] : Messages[M_Rclass], NbRclasses);    
  printf("%s %1lu\n", (NbLclasses > 1) ? Messages[M_Lclasses] : Messages[M_Lclass], NbLclasses);    
  printf("%s %1lu\n", (NbHclasses > 1) ? Messages[M_Hclasses] : Messages[M_Hclass], NbHclasses);  
  printf("\n");
}

/****************************************************
*
* SortieDclasses. OK
*
****************************************************/

void SortieDclasses(void)
{
  unsigned long n = IDENTITE;
  unsigned short Longueur = 0;
  short i, NbChiffresRLclasses, NbChiffresHclasses;

  NbChiffresRLclasses = Max(NombreDeChiffres(NbRclasses), NombreDeChiffres(NbLclasses));
  NbChiffresHclasses = NombreDeChiffres(NbHclasses);
  printf(" %*c  %*c  |%*cD |%*cR |%*cL |%*cH \n", NbChiffresNbElements, ' ', LongueurMax, ' ', NbChiffresRLclasses, ' ',
           NbChiffresRLclasses, ' ', NbChiffresRLclasses, ' ', NbChiffresHclasses, ' ');
  for (i = 0; i < LongueurMax + NbChiffresNbElements + 3 * NbChiffresRLclasses + NbChiffresHclasses + 17; i++)
    printf("-");
  printf("\n");
  if (PossedeUnNeutre)
  {
    printf("*%*c1 %*c1 | %*lu | %*lu | %*lu | %*lu\n", NbChiffresNbElements, ' ', LongueurMax, ' ', NbChiffresRLclasses, 
          Table2[IDENTITE].Dclasse, NbChiffresRLclasses, Table2[IDENTITE].Rclasse, NbChiffresRLclasses, Table2[IDENTITE].Lclasse,
          NbChiffresHclasses, Table2[IDENTITE].Hclasse);
    for (n = IDENTITE; n != DernierMot; )
    {
      n = Table[n].Suivant;
      Longueur = Table[n].Longueur;
      if (Table[n].Statut & IDEMPOTENT)
        printf("*");
      else if  (Table[n].Statut & DANS_UN_GROUPE)
        printf("G");
      else if  (Table[n].Statut & REGULIER)
        printf("R");
      else
        printf(" ");
      printf(" %*ld ", NbChiffresNbElements, n);
      SortieMotFormate(n, Longueur);
      printf(" | %*lu | %*lu | %*lu | %*lu\n", NbChiffresRLclasses, Table2[n].Dclasse, NbChiffresRLclasses,
              Table2[n].Rclasse, NbChiffresRLclasses, Table2[n].Lclasse, NbChiffresHclasses, Table2[n].Hclasse);  
    }
  }
  else
    for (n = IDENTITE; n != DernierMot; )
    {
      n = Table[n].Suivant;
      Longueur = Table[n].Longueur;
      if (Table[n].Statut & IDEMPOTENT)
        printf("*");
      else if  (Table[n].Statut & DANS_UN_GROUPE)
        printf("G");
      else if  (Table[n].Statut & REGULIER)
        printf("R");
      else
        printf(" ");
      printf(" %*ld ", NbChiffresNbElements, n - 1);
      SortieMotFormate(n, Longueur);
      printf(" | %*lu | %*lu | %*lu | %*lu\n", NbChiffresRLclasses, Table2[n].Dclasse, NbChiffresRLclasses, Table2[n].Rclasse,
              NbChiffresRLclasses, Table2[n].Lclasse, NbChiffresHclasses, Table2[n].Hclasse);  
    }
  printf("\n");
}

/************************/
void SortieRang(void)
{
  unsigned short k = NbEtats;
  unsigned short Longueur = 0;
  unsigned long n = IDENTITE;

  for (n = IDENTITE; n != DernierMot; )
  {
    n = Table[n].Suivant;
    if (Table2[n].Dclasse == k)
    {
      Longueur = Table[n].Longueur;
      printf("Mot de rang %d de longueur %d : ", k, Longueur);
      SortieMotFormate(n, Longueur);
      k--;
      printf("\n");
    }
  }
}