All pastes #51761 Raw Edit

sam

public text v1 · immutable
#51761 ·published 2006-04-27 14:49 UTC
rendered paste body


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