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

/*-------------------------------------------------------------------
 * InitLaTeX.c    Jean-Eric Pin 31/05/2007
 *-------------------------------------------------------------------
 */     

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Globales.h"
#include "Main.h"
#include "InitLaTeX.h"
#include "Memoire.h"
#include "Sortie.h"
#include "SortieLaTeX.h"
#include "Utilitaires.h"

extern unsigned long NbElements, DernierMot;
extern info *Table;
extern unsigned short MemoireAllouee, SemiReduit;

long *TableauLongueurMots;
long LongueurLaTeXMax;

/****************************************************
*
*  Le tableau LargeurLettresLaTeX donne la largeur en 
*  100000 ieme de pt des lettres en LaTeX
*
****************************************************/

long LargeurLettresLaTeX[26] = {
  528589L,    /* a */  
  429166L,    /* b */
  432756L,    /* c */
  520486L,    /* d */ 
  465627L,    /* e */ 
  597226L,    /* f */ 
  512846L,    /* g */ 
  576158L,    /* h */ 
  344513L,    /* i */ 
  469049L,    /* j */ 
  552084L,    /* k */ 
  318057L,    /* l */ 
  878014L,    /* m */ 
  600235L,    /* n */ 
  484723L,    /* o */ 
  503125L,    /* p */ 
  48229L,    /* q */ 
  478937L,    /* r */ 
  46875L,    /* s */ 
  361111L,    /* t */ 
  572458L,    /* u */ 
  520601L,    /* v */ 
  742825L,    /* w */ 
  571527L,    /* x */ 
  52616L,    /* y */ 
  50903L      /* z */
};


/****************************************************
*
*  Longueur LaTeX d'un mot non vide
*
****************************************************/

long LongueurLaTeXMotNonVide(unsigned long n) 
{
  if (n == IDENTITE)
    return 0L;
  else
    return (LongueurLaTeXMotNonVide(Table[n].Prefixe) + LargeurLettresLaTeX[Table[n].Finale]);
}

/****************************************************
*
* Longueur LaTeX d'un mot.
*
****************************************************/

long LongueurLaTeXMot(unsigned long n)
{
  if (n == IDENTITE)
    return 1L;
  else
    return LongueurLaTeXMotNonVide(n);
}

/****************************************************
*
*  Longueur LaTeX semi-reduite d'un mot 
*
****************************************************/

long LongueurLaTeXMotSemiReduite(unsigned long n) 
{
  lettre LettreEnCours;
  short Exposant;
  long Longueur = 0L;
  
  while (n != IDENTITE)
  {
    LettreEnCours = Table[n].Initiale;
    Exposant = 1;
    while ((Table[n].Suffixe != IDENTITE) && (Table[Table[n].Suffixe].Initiale == LettreEnCours))
    {
      n = Table[n].Suffixe;
      Exposant++;
    }
    if (Exposant == 1)
      Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours];
    else if (Exposant < 10)
      Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours] + LATEX_PREMIER_EXPOSANT;
    else /* Exposant >= 10 */
      Longueur = Longueur + LargeurLettresLaTeX[LettreEnCours] + LATEX_PREMIER_EXPOSANT 
                          + LATEX_EXPOSANT * (NombreDeChiffres(n)-1);
    n = Table[n].Suffixe;
  }
  return Longueur;
}

/****************************************************
*
*  LongueurLaTeX
*
****************************************************/

void LongueurLaTeXNormale(void) 
{
  unsigned long n;
  
  for (n = IDENTITE; n <= NbElements; n++)
  {
    TableauLongueurMots[n] = LongueurLaTeXMot(n);
    if (LongueurLaTeXMot(n) > LongueurLaTeXMax)
      LongueurLaTeXMax = LongueurLaTeXMot(n);
  }
}

/****************************************************
*
*  LongueurLaTeX
*
****************************************************/

void LongueurLaTeXSemiReduite(void) 
{
  unsigned long n;
  
  for (n = IDENTITE; n <= NbElements; n++)
  {
    TableauLongueurMots[n] = LongueurLaTeXMotSemiReduite(n);
    if (LongueurLaTeXMotSemiReduite(n) > LongueurLaTeXMax)
      LongueurLaTeXMax = LongueurLaTeXMotSemiReduite(n);
  }
}

/****************************************************
*
*  LongueurLaTeX
*
****************************************************/

void LongueurLaTeX(void) 
{
  LongueurLaTeXMax = 0;
  if (!(MemoireAllouee & MEMOIRE_TABLEAU_LONGUEUR_MOTS))
  {
    TableauLongueurMots = ALLOC(long, NbElements+1);  
    MemoireAllouee |= MEMOIRE_TABLEAU_LONGUEUR_MOTS;    /* On prend note : on a alloue de la memoire. */
  }
  if (SemiReduit)
    LongueurLaTeXSemiReduite();
  else
    LongueurLaTeXNormale();
}