----------------------------------------------------------------------------
-- Nom : Ajouter_Job
--
-- But : Ajouter un job dans une liste
--
-- Entrees : - File : La file d'impression
-- - User : L'utilisateur
-- - Taille : La taille du document à imprimer
-- Sorties : - File
--
-- Remarques: -
----------------------------------------------------------------------------
procedure Ajouter_Job(User : in T_User; Taille : in T_Taille_Job; File : in out T_File) is
Job_Courant : T_Job;
Job_Cree : T_Job;
Vide : T_User(1..Taille_Nom_Max) := (Others => ' ');
begin -- Ajouter_Job
-- Si l'ensemble est vide, on ajoute directement
if File.Premier_Numero = null then
-- Ajout dans la file des numéros
File.Premier_Numero := new T_Cellule'(
T_Num_Job'First,
(User & Vide(1..Taille_Nom_Max-User'Length)),
Taille,
null,
null
);
-- Ajout dans la file des tailles
File.Premier_Taille := File.Premier_Numero;
else -- l'ensemble n'est pas vide
Job_Courant := File.Premier_Numero;
-- Ajout dans la liste triée par numéro
-- Recherche de sa place numérotée
while Job_Courant.Suivant_Num_Job /= null loop
Job_Courant := Job_Courant.Suivant_Num_Job;
end loop;
-- ajout du job
Job_Courant.Suivant_Num_Job := new T_Cellule'(
T_Num_Job'Succ(Job_Courant.Num_Job),
User & Vide(1..Taille_Nom_Max - User'Length),
Taille,
Dernier_Job(File).Suivant_Num_Job,
null
);
-- Garder l'adresse du job créé pour l'ajout dans la liste des tailles
Job_Cree := Job_Courant.Suivant_Num_Job;
-- Recherche de sa place dans la liste classée par taille
--
-- Trois choix options possibles de la place du nouveau job:
-- - au début
-- - au milieu
-- - à la fin
-- réinitialisation du job courant
Job_Courant := File.Premier_Taille;
if Job_Courant.Taille > Taille then -- la place du job créé se trouve au début
Job_Cree.Suivant_Taille := Job_Courant;
File.Premier_Taille := Job_Cree;
else -- au milieu ou à la fin
-- Tant que la fin n'est pas arrivée et
-- tant que la taille du suivant est plus petite que celle de notre job, boucler
while Job_Courant.Suivant_Taille /= null and then Job_Courant.Taille < Taille loop
Job_Courant := Job_Courant.Suivant_Taille;
end loop;
-- Est-ce qu'on est à la fin ?
if Job_Courant.Suivant_Taille = null then
-- Ajout du job à la fin de la file
Job_Courant.Suivant_Taille := Job_Cree;
else
-- Accrochage de notre job au suivant
Job_Cree.Suivant_Taille := Job_courant.Suivant_Taille.Suivant_Taille;
-- Accrochage du précédent à notre job
Job_Courant.Suivant_Taille := Job_Cree;
end if;
end if;
end if;
end Ajouter_Job;