/* AP1 TDe3 */
/* gcc -Wall -std=gnu99 -c gestion_file.c */

#include <stdio.h>
#include "types_imprimante.h"

requete T[Nmax];
int ind[P];
/* les requetes pour l'imprimante i sont entre T[ind[i-1]] et T[ind[i]-1] (inclus), on suppose que T[-1]=0 */

void initialiserTout ()
{
  for (int i = 0 ; i < P ; i++) {
    ind[i] = 0 ;
  }
}

void initialiserImp (int imp) 
{
  int decalage;
  if (imp == 0) {
    decalage = ind[0];
  }
  else {
    decalage = ind[imp] - ind[imp-1];
  }
  /* decalage du contenu des files */
  for (int i = ind[imp] ; i < ind[P-1] ; i++) {
    T[i-decalage] = T[i];
  }
  /* decalage des indices */
  for (int i = imp ; i < P ; i++) {
    ind[i] -= decalage;
  }
}

int plusDeRequete (int imp)
{
  return ( (imp==0 && ind[0]==0) || ind[imp]==ind[imp-1]);
}

int deposer (requete x, int imp)
{
  if (ind[P-1] == Nmax) { // file pleine
    return 1;
  }
  else {
    /* decaler les requetes */
    for (int i = ind[P-1] ; i < ind[imp] ; i--) {
      T[i] = T[i-1];
    }
    /* placer x */
    T[ind[imp]] = x;
    /* decaler les indices */
    for (int i = imp ; i < P ; i++) {
      (ind[i]++);
    }
    return 0;
  }
}

int extraire (requete *x, int imp)
{
  int indx;

  if (plusDeRequete(imp)) {
    return imp+1;
  }
  else if (imp == 0) {
    indx = 0;
  }
  else {
    indx = ind[imp-1];
  }
  *x = T[indx];

  /* decaler le contenu des files */
  for (int i = indx ; i < ind[P-1] ; i++) {
    T[i] = T[i+1];
  }
  /* decaler les indices */
  for (int i = imp ; i < P ; i++) {
    ind[i]--;
  }	 
  return 0;
}

int consulter (requete *x, int imp)
{
  if (plusDeRequete(imp)) {
    return imp+1;
  }
  else {
    if (imp == 0) {
      *x = T[0];
    }
    else {
      *x = T[ind[imp-1]];
    }
    return 0;
  }
}

