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

/*-------------------------------------------------------------------
 * SortieLaTeXDclasses.c    Jean-Eric Pin 18/08/2006
 *-------------------------------------------------------------------
 */     

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Globales.h"
#include "Main.h"
#include "Initialisation.h"
#include "Memoire.h"
#include "Reduction.h"
#include "Sortie.h"
#include "DclassesIteratif.h"
#include "Blocs.h"
#include "TriParTas.h"
#include "SortieLaTeX.h"
#include "SortieDclasses.h"
#include "SortieLaTeXDclasses.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, nTas, TailleTas;
extern info *Table;
extern info2 *Table2;
extern unsigned long *B, *Tas;
extern char **Messages;
extern FILE *fichierLaTeX;    /* Voir Main.c */
extern element *TableDesValeurs;


/****************************************************
*
* SortieLaTeXNbDclasses. 
*
****************************************************/

void SortieLaTeXNbDclasses(FILE *fichier)
{
  fprintf(fichier, "%s %1lu\n", (NbDclasses > 1) ? Messages[M_Dclasses] : Messages[M_Dclass],
            NbDclasses);    /*  "Calcul des D-classes acheve : %1lu D-classes\n" */
  fprintf(fichier, "%s %1lu\n", (NbRclasses > 1) ? Messages[M_Rclasses] : Messages[M_Rclass],
            NbRclasses);    /*    "%1lu R-classes\n" */
  fprintf(fichier, "%s %1lu\n", (NbLclasses > 1) ? Messages[M_Lclasses] : Messages[M_Lclass],
            NbLclasses);    /*    "%1lu L-classes\n" */
  fprintf(fichier, "\n");
}

/****************************************************
*
* SortieLaTeXDclasses. 
*
****************************************************/

void SortieLaTeXDclasses(FILE *fichier)
{
  unsigned long i, j, k, n, d, r, l, h, nd, nr, nl, nh;
  unsigned long *NombreLclasses;  /* Tableau donnant le nombre de L-classes de chaque R-classe */
  unsigned long *NbElementsParHclasse; 

  fprintf(fichier, "\\noindent $\\cal D$-classes:\n");
/*  Calcul du nombre de L-classes par R-classe  */
  NombreLclasses = AlloueMemoireTableau(NbRclasses + 1);  
   NbElementsParHclasse = AlloueMemoireTableau(NbHclasses + 1);  
  nTas = 0;
  nl = 0;
/*  for (r = 0; r <= NbRclasses; r++)
    NombreLclasses[r] = 0; 
  for (h = 0; h <= NbHclasses; h++)
    NbElementsParHclasse[h] = 0;  */
  for (i = 0; i < TailleTas; i++)
  {
    n = Tas[i];
    r = Table2[n].Rclasse;
    l = Table2[n].Lclasse;
    h = Table2[n].Hclasse;
    NbElementsParHclasse[h]++;
    if (l != nl)    /* Nouvelle L-classe */
    {
      NombreLclasses[r]++;
      nl = l;
    }
  }
/*  for (h = 0; h <= NbHclasses; h++)
    printf("h = %d, NbElementsParHclasse[h] = %d\n", h, NbElementsParHclasse[h]); */
  n = Tas[0];
  nd = Table2[n].Dclasse;
  nr = Table2[n].Rclasse;
  nh = Table2[n].Hclasse;
  r = Table2[n].Rclasse;
  h = Table2[n].Hclasse;
  fprintf(fichier, "\\begin{center}\n");
  fprintf(fichier, "\\setlength{\\extrarowheight}{6pt}\n");
  fprintf(fichier, "\\begin{tabular}{|");
  for (j = 0; j < NombreLclasses[r]; j++)
  {
    for (k = 0; k < NbElementsParHclasse[h]; k++)
      fprintf(fichier, "l@{\\extracolsep{1pt}}");
    fprintf(fichier, "|");
  }
  fprintf(fichier, "}\n\\hline\n");
  for (i = 0; i < TailleTas; i++)
  {
    n = Tas[i];
    d = Table2[n].Dclasse;
    r = Table2[n].Rclasse;
    h = Table2[n].Hclasse;
/*       printf("n = %d, d = %d, r = %d, h = %d \n", n, d, r, h); */
/*    if (h != nh)   
    {
      fprintf(fichier, "&");
      nh = h;
    }  */
    if (r != nr)   /* Nouvelle R-classe */
    {
      fseek(fichier, -1, SEEK_CUR);
      fprintf(fichier, "\\\\\n\\hline\n");
      nr = r;
    }
    if (d != nd)   /* Nouvelle D-classe */
    {
      fprintf(fichier, "\\end{tabular}\\\\\n$\\tvi$\\\\\n");
      fprintf(fichier, "\\begin{tabular}{|");
      for (j = 0; j < NombreLclasses[r]; j++)
      {
        for (k = 0; k < NbElementsParHclasse[h]; k++)
          fprintf(fichier, "l@{\\extracolsep{1pt}}");
        fprintf(fichier, "|");
      }
      fprintf(fichier, "}\n\\hline\n");
      nd = d;
    }
    if (Table[n].Statut & IDEMPOTENT)  /* Idempotent */
      fprintf(fichier, "\\withstar{");
    else
      fprintf(fichier, "\\nostar{");
    SortieLaTeXMot(n, fichier);
    fprintf(fichier, "} &");
  }
  fseek(fichier, -1, SEEK_CUR);
  fprintf(fichier, "\\\\\n\\hline\n");
  fprintf(fichier, "\\end{tabular}\n\\end{center}\n");
  free(NombreLclasses);
  free(NbElementsParHclasse);
}

/****************************************************
*
* SortieLaTeXRang. 
*
****************************************************/

void SortieLaTeXRang(FILE *fichier)
{
  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;
      fprintf(fichier, "Mot de rang %d de longueur %d : ", k, Longueur);
      SortieMotFormate(n, Longueur);
      k--;
      fprintf(fichier, "\n");
    }
  }
}