|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 12958 (0x329e)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦this⟧
with Etape, Text_Io, Formate;
with Serial_Io;
package body Role is
package Int_Io is new Text_Io.Integer_Io (Integer);
Chrono : Natural := 0;
procedure Afficherunrole (R : Role) is
use Etape;
E : Etape.Etape;
begin
Text_Io.New_Line;
Text_Io.Put ("Acteur : ");
Int_Io.Put (Lacteurdurole (R).Peripherique);
Text_Io.Put (" ");
Int_Io.Put (Lacteurdurole (R).Numero_Fonction);
Text_Io.New_Line;
Text_Io.Put ("Les Etapes : ");
E := Lesetapesdurole (R);
while E /= Etape.Etapeinexistante loop
Etape.Afficheruneetape (E);
E := Etape.Lasuitedeletape (E);
end loop;
Text_Io.New_Line;
Text_Io.Put ("En Cours : ");
if Leroleestencours (R) then
Text_Io.Put ("VRAIE");
else
Text_Io.Put ("FAUX");
end if;
Text_Io.New_Line;
Text_Io.Put ("Le Debut : ");
Int_Io.Put (Ledebutdurole (R));
Text_Io.New_Line;
Text_Io.Put ("L'index : ");
Text_Io.New_Line;
Text_Io.Put ("La Duree : ");
Int_Io.Put (Ladureedurole (R));
Text_Io.New_Line;
end Afficherunrole;
-- methodes privees au package Role
procedure Executer (Qui : Acteur; Quoi : Etape.Action) is
begin
if Quoi.Valeur1 = 0 and then Quoi.Valeur2 = 0 then
Serial_Io.Put
('D' & Formate.Inttostr (Qui.Peripherique, 2) &
Formate.Inttostr (Qui.Numero_Fonction, 2) &
Formate.Inttostr (Quoi.Valeur1, 4) & 'F', "/dev/tty0");
else
Serial_Io.Put
('D' & Formate.Inttostr (Qui.Peripherique, 2) &
Formate.Inttostr (Qui.Numero_Fonction, 2) &
Formate.Inttostr (Quoi.Valeur1, 4) &
Formate.Inttostr (Quoi.Valeur2, 4) & 'F', "/dev/tty0");
end if;
Text_Io.New_Line;
end Executer;
procedure Sauvegarderletemps
(F : Text_Io.File_Type; Untemps : Etape.Temps) is
begin
Int_Io.Put (F, Untemps);
end Sauvegarderletemps;
procedure Sauvegarderlacteur (F : Text_Io.File_Type; Unacteur : Acteur) is
begin
Int_Io.Put (F, Unacteur.Peripherique);
Int_Io.Put (F, Unacteur.Numero_Fonction);
end Sauvegarderlacteur;
procedure Sauvegarderlaction
(F : Text_Io.File_Type; Uneaction : Etape.Action) is
begin
Int_Io.Put (F, Uneaction.Valeur1);
Int_Io.Put (F, Uneaction.Valeur2);
end Sauvegarderlaction;
-- fin partie privee
-- creation
function Creerunrole (A : Acteur) return Role is
Resultat : Role;
begin
Resultat := new Descripteurderole;
Resultat.Lacteur := A;
Resultat.Lesetapes := Etape.Etapeinexistante;
Resultat.Encours := False;
Resultat.Ledebut := 0; -- temps
Resultat.Lindex := Etape.Etapeinexistante;
Resultat.Laduree := 0;
return Resultat;
end Creerunrole;
function Chargerunacteur (F : in Text_Io.File_Type) return Acteur is
Adr_Periph, Num_Fonc : Integer;
Actaux : Acteur;
begin
Int_Io.Get (F, Adr_Periph);
Int_Io.Get (F, Num_Fonc);
Actaux.Peripherique := Adresse_Peripherique'(Adr_Periph);
Actaux.Numero_Fonction := Natural'(Num_Fonc);
return Actaux;
end Chargerunacteur;
function Chargeruneaction (F : in Text_Io.File_Type) return Etape.Action is
Actionaux : Etape.Action;
Val1, Val2 : Integer;
begin
Int_Io.Get (F, Val1);
Int_Io.Get (F, Val2);
Actionaux.Valeur1 := Val1; -- rajouter protections
Actionaux.Valeur2 := Val2;
return Actionaux;
end Chargeruneaction;
function Chargeruntemps (F : in Text_Io.File_Type) return Etape.Temps is
I : Integer;
Tempsaux : Etape.Temps;
begin
Int_Io.Get (F, I);
Tempsaux := Etape.Temps'(I);
return Tempsaux;
end Chargeruntemps;
function Chargerunrole (F : in Text_Io.File_Type) return Role is
Unrole : Role;
Unacteur : Acteur;
Uneaction : Etape.Action;
Untemps : Etape.Temps;
Nombre : Integer;
begin
Unacteur := Chargerunacteur (F);
Unrole := Creerunrole (Unacteur);
Int_Io.Get (F, Nombre);
for I in 1 .. Nombre loop
Uneaction := Chargeruneaction (F);
Untemps := Chargeruntemps (F);
Caseruneactiondanslerole (Unrole, Untemps, Uneaction);
end loop;
return Unrole;
end Chargerunrole;
-- acces
function Lenombredactionsdurole (Unrole : Role) return Integer is
use Etape;
Compteur : Integer := 0;
Ptretape : Etape.Etape;
begin
Ptretape := Lesetapesdurole (Unrole);
while Ptretape /= Etape.Etapeinexistante loop
Compteur := Compteur + 1;
Ptretape := Etape.Lasuitedeletape (Ptretape);
end loop;
return Compteur;
end Lenombredactionsdurole;
function Leroleestvide (Unrole : Role) return Boolean is
use Etape;
begin
return Unrole.Lesetapes = Etape.Etapeinexistante;
end Leroleestvide;
function Lacteurdurole (Unrole : Role) return Acteur is
begin
return Unrole.Lacteur;
end Lacteurdurole;
function Ladureedurole (Unrole : Role) return Etape.Temps is
begin
return Unrole.Laduree;
end Ladureedurole;
function Leroleestencours (Unrole : Role) return Boolean is
begin
return Unrole.Encours;
end Leroleestencours;
function Ledebutdurole (Unrole : Role) return Etape.Temps is
begin
return Unrole.Ledebut;
end Ledebutdurole;
function Lesetapesdurole (Unrole : Role) return Etape.Etape is
begin
return Unrole.Lesetapes;
end Lesetapesdurole;
procedure Quelleactiondurole (Unrole : Role;
Untemps : Etape.Temps;
Uneaction : out Etape.Action;
Existe : out Boolean) is
use Etape;
Indexrole : Etape.Etape;
Trouve : Boolean := False;
begin
Existe := False;
Indexrole := Lesetapesdurole (Unrole);
while Indexrole /= Etape.Etapeinexistante and then not Trouve loop
if Etape.Letempsdeletape (Indexrole) = Untemps then
Existe := True;
Trouve := True;
Uneaction := Etape.Lactiondeletape (Indexrole);
end if;
Indexrole := Etape.Lasuitedeletape (Indexrole);
end loop;
end Quelleactiondurole;
-- modification
procedure Caseruneactiondanslerole (Unrole : in out Role;
Untemps : Etape.Temps;
Uneaction : Etape.Action) is
E : Etape.Etape;
begin
E := Lesetapesdurole (Unrole);
Etape.Caseruneactiondanslesetapes (Untemps, Uneaction, E);
if Untemps > Unrole.Laduree then
Unrole.Laduree := Untemps;
end if;
Unrole.Lesetapes := E;
end Caseruneactiondanslerole;
procedure Exclureuneactiondurole
(Unrole : in out Role; Untemps : Etape.Temps) is
use Etape;
E : Etape.Etape;
Letemps : Etape.Temps;
begin
E := Lesetapesdurole (Unrole);
Etape.Exclureuneactiondesetapes (E, Untemps);
if Untemps = Unrole.Laduree then
Unrole.Laduree := 0;
E :=
Lesetapesdurole
(Unrole); -- verifier si indispensable cad si UnRole modifie
while E /= Etape.Etapeinexistante loop
Letemps := Etape.Letempsdeletape (E);
if Letemps > Unrole.Laduree then
Unrole.Laduree := Letemps;
end if;
E := Etape.Lasuitedeletape (E);
end loop;
end if;
end Exclureuneactiondurole;
procedure Decaleruneactiondurole (Unrole : in out Role;
Untemps : Etape.Temps;
Undelai : Delai) is
use Etape;
Nouveautemps : Etape.Temps;
begin
Nouveautemps := Untemps + Etape.Temps (Undelai);
if Nouveautemps >= 0 then
Deplaceruneactiondurole (Unrole, Untemps, Nouveautemps);
else
null; -- traitement erreurs
end if;
end Decaleruneactiondurole;
procedure Deplaceruneactiondurole (Unrole : in out Role;
Ancien : Etape.Temps;
Nouveau : Etape.Temps) is
Uneaction : Etape.Action;
Existe : Boolean;
begin
Quelleactiondurole (Unrole, Ancien, Uneaction, Existe);
if Existe then
Exclureuneactiondurole (Unrole, Ancien);
Caseruneactiondanslerole (Unrole, Nouveau, Uneaction);
end if;
end Deplaceruneactiondurole;
procedure Decalerlerole (Unrole : in out Role; Undelai : Delai) is
use Etape;
Uneetape : Etape.Etape;
Letemps : Etape.Temps;
begin
if not Leroleestvide (Unrole) then
Uneetape := Lesetapesdurole (Unrole);
if Etape.Letempsdeletape (Uneetape) + Undelai >= 0 then
while Uneetape /= Etape.Etapeinexistante loop
Letemps := Etape.Letempsdeletape (Uneetape) + Undelai;
Etape.Changerletempsdeletape (Uneetape, Letemps);
end loop;
Unrole.Laduree := Unrole.Laduree + Undelai;
else
null; -- traitement erreurs
end if;
end if;
end Decalerlerole;
procedure Viderlerole (Unrole : in out Role) is
use Etape;
Etapeajeter : Etape.Etape;
begin
while Unrole.Lesetapes /= Etape.Etapeinexistante loop
Etapeajeter := Unrole.Lesetapes;
Unrole.Lesetapes := Etape.Lasuitedeletape (Etapeajeter);
Etape.Detruireletape (Etapeajeter);
end loop;
end Viderlerole;
procedure Startchrono is
begin
Chrono := 0;
end Startchrono;
function Tempschrono return Natural is
begin
return Chrono;
end Tempschrono;
procedure Avancerchrono is -- a modifier
begin
delay 0.1; -- on "perd" un dizieme de seconde
Chrono := Chrono + 1;
end Avancerchrono;
-- a mettre ou il faut
-- FUNCTION LeTempsSysteme return INTEGER is
-- LeTemps:Calendar.Time;
-- begin
-- Letemps:=calendar.clock;
-- tempsDiziemes:=LeTemps.
-- return 1;
-- end LeTempsSysteme;
-- a mettre ou il faut
-- execution
procedure Demarrerlerole (Unrole : in out Role) is
use Etape;
begin
Unrole.Lindex := Lesetapesdurole (Unrole);
if Unrole.Lindex /= Etape.Etapeinexistante then
Unrole.Encours := True;
Unrole.Ledebut := 0; -- LeTempsSysteme;
end if;
end Demarrerlerole;
procedure Arreterlerole (Unrole : in out Role) is
begin
Unrole.Encours := False;
end Arreterlerole;
procedure Jouerlerole (Unrole : in out Role) is
begin
Demarrerlerole (Unrole);
while Leroleestencours (Unrole) loop
Solliciterlerole (Unrole);
end loop;
end Jouerlerole;
procedure Solliciterlerole (Unrole : in out Role) is
use Etape;
Qui : Acteur;
Quoi : Etape.Action;
begin
if Leroleestencours (Unrole) then
if Etape.Letempsdeletape (Unrole.Lindex) <=
Tempschrono then -- (LeTempsSysteme- UnRole.LeDebut) then
Qui := Lacteurdurole (Unrole);
Quoi := Etape.Lactiondeletape (Unrole.Lindex);
Executer (Qui, Quoi);
Unrole.Lindex := Etape.Lasuitedeletape (Unrole.Lindex);
if Unrole.Lindex = Etape.Etapeinexistante then
Arreterlerole (Unrole);
end if;
else
null; -- erreurs
end if;
end if;
end Solliciterlerole;
-- sauvegarde
procedure Sauvegarderlerole (Unrole : Role; Fichier : String) is
use Etape;
Uneetape : Etape.Etape;
F : Text_Io.File_Type;
begin
Sauvegarderlacteur (F, Lacteurdurole (Unrole));
Int_Io.Put (F, Lenombredactionsdurole (Unrole));
Uneetape := Lesetapesdurole (Unrole);
while Uneetape /= Etape.Etapeinexistante loop
Sauvegarderletemps (F, Etape.Letempsdeletape (Uneetape));
Sauvegarderlaction (F, Etape.Lactiondeletape (Uneetape));
Uneetape := Etape.Lasuitedeletape (Uneetape);
end loop;
end Sauvegarderlerole;
end Role;
-- fichier : Role.ads
-- specifications du package ROLE
-- Auteur : Sebastien BROCHET
-- Date : 24 Novembre 1993
-- Etat : en cours