---------------------------------------------------------------------------- -- 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;