DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦65d782cf9⟧ Ada Source

    Length: 18432 (0x4800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Tab_Util, seg_05728b

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Tab_Orb;
with Trame;
with Bounded_String;
with Utils;

package body Tab_Util is

    --**************************************************************************
    procedure Init (Tab : in out Tableau) is
        I : Integer;
    begin
        I := 1;
        -- Met le champ Etat du tableau en Traite = 1 et Libre = 1 <=> Etat = 11
        while I <= Tab.Max loop
            Tab.Ma_Liste (I).Etat := 11;
            I := I + 1;
        end loop;
    end Init;


    --**************************************************************************
    procedure Ajoute (Tab : in out Tableau;
                      Element : in Byte_Defs.Byte_String;
                      Erreur : out Boolean) is
        I : Integer;
    begin
        I := 1;
        -- Trouve un emplacement libre ou ajouter la trame <=> Etat = 11
        Boucle:
            while I <= Tab.Max loop
                if Tab.Ma_Liste (I).Etat /= 11 then
                    I := I + 1;
                else
                    exit Boucle;
                end if;
            end loop Boucle;
        -- Copie des infos de la trame
        if I <= Tab.Max then
            Tab.Ma_Liste (I).Type_Msg := Trame.Donne_Integer (Element, 1);
            Bounded_String.Copy (Tab.Ma_Liste (I).Host,
                                 Trame.Extrait (Element, 2));
            Bounded_String.Copy (Tab.Ma_Liste (I).Socket,
                                 Trame.Extrait (Element, 3));
            Tab.Ma_Liste (I).Requete := Trame.Donne_Integer (Element, 4);
            Bounded_String.Copy (Tab.Ma_Liste (I).Commande,
                                 Trame.Extrait (Element, 5));
            Tab.Ma_Liste (I).Etat := 0;
            Erreur := False;
        else
            Erreur := True;
        end if;
    end Ajoute;


    --**************************************************************************
    procedure Efface (Tab : in out Tableau;
                      Index : in Positive;
                      Erreur : out Boolean) is
    begin
        -- Met le champ Etat du tableau en Libre = 11
        -- Met des valeurs "Bidon" dans les autres champs
        if Index <= Tab.Max then
            Tab.Ma_Liste (Index).Type_Msg := 100;
            Bounded_String.Copy (Tab.Ma_Liste (Index).Host, " ");
            Bounded_String.Copy (Tab.Ma_Liste (Index).Socket, " ");
            Tab.Ma_Liste (Index).Requete := 2000;
            Bounded_String.Copy (Tab.Ma_Liste (Index).Commande, " ");
            Tab.Ma_Liste (Index).Etat := 11;
            Erreur := False;
        else
            Erreur := True;
        end if;
    end Efface;


    --**************************************************************************
    procedure Trouve (Tab : in Tableau;
                      Index : out Positive;
                      Element : in Byte_Defs.Byte_String;
                      Numero : in Positive;
                      Erreur : out Boolean) is
        I, J : Integer;
        Fini : Boolean := False;
        Trouve : Boolean := False;
        Element1 : Bounded_String.Variable_String (1024);
        Valeur : Positive;
        Symbole : Character;
    begin
        -- Met le champ Etat du tableau en Traite = 1 et Libre = 1 <=> Etat = 1--Fixe le symbole terminateur permetant de separer les elements dans un champ
        if Numero = 5 then
            Symbole := '(';
            Element1 := Trame.Extrait (Element, Numero);
        end if;
        if Numero = 4 then
            Valeur := Trame.Donne_Integer (Element, Numero);
        end if;

        Index := 1;
        I := 1;
        Erreur := True;
        -- Boucle de scrutation du tableau
        while I <= Tab.Max and not Fini loop
            J := 1;
            -- Boucle de test du nom du contrat
            -- Synchronisation sur le symbole
            if Tab.Ma_Liste (I).Etat /= 11 then
                begin
                    if Numero = 5 then
                        while Bounded_String.Char_At
                                 (Tab.Ma_Liste (I).Commande, J) =
                              Bounded_String.Char_At (Element1, J) and
                              Bounded_String.Char_At (Element1, J) /=
                                 Symbole loop
                            J := J + 1;
                        end loop;
                        Trouve := True;
                    end if;
                    if Numero = 4 then
                        if Tab.Ma_Liste (I).Requete = Valeur then
                            Trouve := True;
                        end if;
                    end if;
                    -- Teste si contrat valide
                    if Trouve then
                        if ((Numero = 5 and
                             Bounded_String.Char_At (Element1, J) = Symbole) or
                            Numero = 4) then  
                            Fini := True;
                            Index := I;
                            Erreur := False;
                        end if;
                    end if;
                end;
            end if;
            I := I + 1;
        end loop;
    end Trouve;


    --**************************************************************************
    procedure Trouve_Index (Tab : in Tableau;
                            Requete : in Positive;
                            Index : out Positive;
                            Erreur : out Boolean) is
        Ligne : Positive;
        Trouve : Boolean := False;
        Error : Boolean := True;

    begin
        --Recherche la "ligne" contenant le numero de requete
        Ligne := 1;
        while Ligne <= Tab.Max and not Trouve loop
            --Il faut que la "Ligne" ne soit pas vide
            -- => Etat doit etre egal a 0.
            if (Tab.Ma_Liste (Ligne).Requete = Requete) and
               (Tab.Ma_Liste (Ligne).Etat = 0) then
                Trouve := True;
                Error := False;
            else
                Ligne := Ligne + 1;
            end if;
        end loop;
        Index := Ligne;
        Erreur := Error;
    end Trouve_Index;


    --**************************************************************************
    procedure Donne (Tab : in Tableau;
                     Requete : in Positive;
                     Numero : in Positive;                    Element : in out Bounded_String.Variable_String;
                     Erreur : out Boolean) is

        --Renvoie le contenu du sous-champ No. Numero, a partir du numero de requete
        --...contenu dans le champ "Commande"
        Ligne : Positive;
        Commande : Bounded_String.Variable_String (1024);
        Debut : Positive := 1;
        Long : Positive;
        Compteur : Positive := 1;
        Error : Boolean;
        Trouve : Boolean := False;
    begin
        --Recherche la "ligne" contenant le numero de requete
        Trouve_Index (Tab, Requete, Ligne, Error);
        Erreur := Error;
        --Si le numero de requete est trouve, on lit le champ...
        if not Error then
            --Lecture du champ "commande"
            Bounded_String.Copy (Commande, Tab.Ma_Liste (Ligne).Commande);

            --Trouve la position du Numero'ieme "$" (debut)
            while Compteur /= Numero + 1 loop
                while Bounded_String.Char_At (Commande, Debut) /= '$' loop
                    Debut := Debut + 1;
                end loop;
                Compteur := Compteur + 1;
                Debut := Debut + 1;
            end loop;

            --Efface le debut
            Bounded_String.Delete (Commande, 1, Debut - 1);

            Compteur := 1;
            Long := Bounded_String.Length (Commande);

            --Trouve la position du prochain "$" (fin)
            while Bounded_String.Char_At (Commande, Compteur) /= '$' loop
                Compteur := Compteur + 1;
            end loop;

            --Efface la fin, et retourne la portion demandee (No. Numero)
            Bounded_String.Delete (Commande, Compteur, Long - Compteur + 1);
            Bounded_String.Copy (Element, Commande);
        end if;
    end Donne;


    --**************************************************************************
    function Donne_String
                (Tab : Tableau; Index : Positive; Num_Champ : Positive)
                return Bounded_String.Variable_String is
        Contenu_Champ : Bounded_String.Variable_String (1024);
    begin
        if Num_Champ = 2 then
            Bounded_String.Copy (Contenu_Champ, Tab.Ma_Liste (Index).Host);
        end if;
        if Num_Champ = 3 then
            Bounded_String.Copy (Contenu_Champ, Tab.Ma_Liste (Index).Socket);
        end if;
        if Num_Champ = 6 then
            Bounded_String.Copy (Contenu_Champ, Tab.Ma_Liste (Index).Commande);
        end if;
        return Contenu_Champ;
    end Donne_String;


    --**************************************************************************
    function Donne_Integer
                (Tab : Tableau; Index : Positive; Num_Champ : Positive)
                return Integer is
        Contenu_Champ : Integer;
    begin
        if Num_Champ = 1 then
            Contenu_Champ := Tab.Ma_Liste (Index).Type_Msg;
        end if;
        if Num_Champ = 4 then
            Contenu_Champ := Tab.Ma_Liste (Index).Etat;
        end if;
        if Num_Champ = 5 then
            Contenu_Champ := Tab.Ma_Liste (Index).Requete;
        end if;
        return Contenu_Champ;
    end Donne_Integer;


    --**************************************************************************
    procedure Insere_String (Tab : in out Tableau;
                             Index : in Positive;
                             Num_Champ : in Positive;
                             Donnees : in Bounded_String.Variable_String) is
    begin
        if Num_Champ = 2 then
            Bounded_String.Copy (Tab.Ma_Liste (Index).Host, Donnees);
        end if;
        if Num_Champ = 3 then
            Bounded_String.Copy (Tab.Ma_Liste (Index).Socket, Donnees);
        end if;
        if Num_Champ = 6 then
            Bounded_String.Copy (Tab.Ma_Liste (Index).Commande, Donnees);
        end if;
    end Insere_String;


    --**************************************************************************
    procedure Insere_Integer (Tab : in out Tableau;
                              Index : in Positive;
                              Num_Champ : in Positive;
                              Donnees : in Integer) is
    begin
        if Num_Champ = 1 then
            Tab.Ma_Liste (Index).Type_Msg := Donnees;
        end if;
        if Num_Champ = 4 then
            Tab.Ma_Liste (Index).Etat := Donnees;
        end if;
        if Num_Champ = 5 then
            Tab.Ma_Liste (Index).Requete := Donnees;
        end if;
    end Insere_Integer;


    --**************************************************************************
    function Taille_Max (Tab : Tableau) return Positive is
    begin
        return Tab.Max;
    end Taille_Max;


    --**************************************************************************
    function Teste_Plein (Tab : Tableau) return Boolean is
        Ligne : Integer := 1;
        Plein : Boolean := True;
    begin
        --Teste si toutes les "lignes" sont occupees
        while (Plein and Ligne <= Tab.Max) loop
            if (Tab.Ma_Liste (Ligne).Etat /= 11) then
                Ligne := Ligne + 1;
            else
                Plein := False;
            end if;
        end loop;
        return Plein;
    end Teste_Plein;


    --**************************************************************************
    function Teste_Vide (Tab : Tableau) return Integer is
        Ligne : Integer := 1;
        Vide : Boolean := True;
    begin
        --Teste si toutes les "lignes" sont vides
        while (Vide and Ligne <= Tab.Max) loop
            if (Tab.Ma_Liste (Ligne).Etat /= 11) then
                Vide := False;
            else
                Ligne := Ligne + 1;
            end if;
        end loop;
        if Vide then
            Ligne := 0;
        else
            Ligne := 1;
            Vide := True;
            while (Vide and Ligne <= Tab.Max) loop
                if (Tab.Ma_Liste (Ligne).Etat /= 11) then
                    Ligne := Ligne + 1;
                else
                    Vide := False;
                end if;
            end loop;
        end if;
        return Ligne;
    end Teste_Vide;

    --**************************************************************************
    function Fait_Trame (Tab : Tableau; Index : Positive)
                        return Byte_Defs.Byte_String is

    begin
        --Refabrique la trame a partir des donnees du tableau
        --Tab.Ma_Liste (Index).Etat := 10;
        return Trame.Fait_Trame (Tab.Ma_Liste (Index).Type_Msg,
                                 Tab.Ma_Liste (Index).Host,
                                 Tab.Ma_Liste (Index).Socket,
                                 Tab.Ma_Liste (Index).Requete,
                                 Tab.Ma_Liste (Index).Commande);
    end Fait_Trame;


    --**************************************************************************
    procedure Donne_Contrat (Tab : in Tableau;
                             Index : in Positive;
                             Contrat : in out Bounded_String.Variable_String) is

        Symbole : Character := '('; --Ceci est le symbole a rechercher
        Long : Positive;
        Debut : Positive;

    begin
        Contrat := Donne_String (Tab, Index, 6); --Extrait le champ "Commande"
        Long := Bounded_String.Length (Contrat);
        Debut := 1;
        while (Bounded_String.Char_At (Contrat, Debut) /= Symbole) and
                 (Debut <= Long) loop
            Debut := Debut + 1;
        end loop;

        if Debut <= Long then
            --Efface ce qui suit le contrat: les (...)
            Bounded_String.Delete (Contrat, Debut, Long - Debut + 1);
        end if;
--Retourne Contrat;
--Si la "(" a ete trouvee, le contrat est retourne
--Sinon c'est tout le champ "Commande" (cas Erreur)
    end Donne_Contrat;


end Tab_Util;

E3 Meta Data

    nblk1=11
    nid=0
    hdr6=22
        [0x00] rec0=21 rec1=00 rec2=01 rec3=036
        [0x01] rec0=19 rec1=00 rec2=0a rec3=012
        [0x02] rec0=18 rec1=00 rec2=11 rec3=01a
        [0x03] rec0=08 rec1=00 rec2=04 rec3=0a4
        [0x04] rec0=18 rec1=00 rec2=0c rec3=03c
        [0x05] rec0=1b rec1=00 rec2=0d rec3=06e
        [0x06] rec0=1c rec1=00 rec2=09 rec3=078
        [0x07] rec0=04 rec1=00 rec2=10 rec3=002
        [0x08] rec0=17 rec1=00 rec2=02 rec3=036
        [0x09] rec0=1b rec1=00 rec2=07 rec3=04a
        [0x0a] rec0=1a rec1=00 rec2=03 rec3=016
        [0x0b] rec0=1c rec1=00 rec2=0e rec3=010
        [0x0c] rec0=1b rec1=00 rec2=05 rec3=014
        [0x0d] rec0=0a rec1=00 rec2=0b rec3=01a
        [0x0e] rec0=21 rec1=00 rec2=06 rec3=000
        [0x0f] rec0=16 rec1=00 rec2=08 rec3=086
        [0x10] rec0=18 rec1=00 rec2=0f rec3=000
    tail 0x21763eff487c676e7044b 0x42a00088462060003