// fifo.c

// << Algorithmique du texte >>
// Maxime Crochemore, Christophe Hancart et Thierry Lecroq
// Vuibert, 2001.

#include <stdio.h>
#include "cellule.h"
#include "fifo.h"


File fileVide() {
   File F;

   F = (File)malloc(sizeof(struct _file));
   if (F == NULL) error("fileVide");
   F->longueur = 0;
   F->tete = F->queue = NULL;
   return(F);
}


int longueur(File F) {
   if (F == NULL) error("longueur");
   return(F->longueur);
}


void enfiler(File F, void *element) {
   Cellule cellule;

   if (F == NULL) error("enfiler");
   cellule = (Cellule)malloc(sizeof(struct _cellule));
   if (cellule == NULL) error("enfiler");
   cellule->element = element;
   cellule->suivant = NULL;
   if (longueur(F) == 0)
      F->tete = F->queue = cellule;
   else {
      F->queue->suivant = cellule;
      F->queue = cellule;
   }
   ++(F->longueur);
}


void *tete(File F) {
   if (F == NULL || longueur(F) == 0) error("tete");
   return(F->tete->element);
}


void defiler(File F) {
   Cellule cellule;

   if (F == NULL || longueur(F) == 0) error("defiler");
   cellule = F->tete;
   if (longueur(F) == 1)
      F->tete = F->queue = NULL;
   else
      F->tete = F->tete->suivant;
   --(F->longueur);
   free(cellule);
}


void *defilement(File F) {
   Cellule cellule;
   void *element;

   if (F == NULL || longueur(F) == 0) error("defilement");
   cellule = F->tete;
   element = cellule->element;
   if (longueur(F) == 1)
      F->tete = F->queue = NULL;
   else
      F->tete = F->tete->suivant;
   free(cellule);
   --(F->longueur);
   return(element);
}


File copie(File F) {
   File G, H;
   Cellule cellule;

   if (F == NULL) error("copie");
   H = fileVide();
   cellule = F->tete;
   while (cellule != NULL) {
      enfiler(H, cellule->element);
      cellule = cellule->suivant;
   }
   G = fileVide();
   cellule = H->tete;
   while (cellule != NULL) {
      enfiler(G, cellule->element);
      cellule = cellule->suivant;
   }
   return(G);
}


void ecrireFile(File F) {
   Cellule cellule;

   if (F == NULL) error("ecrireFile");
   cellule = F->tete;
   while (cellule != NULL) {
      printf("%d ", *(int *)cellule->element);
      cellule = cellule->suivant;
   }
   printf("\n");
}