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

⟦c9525e66f⟧ Ada Source

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

Derivation

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

E3 Source Code



with Error, Unbounded_String, Text_Io;

package body Tds is

    package Unlimited_String is new Unbounded_String (5);

    type Symbol_Content (What : Kinds := Unknown) is
        record
            Name, Type_Name : Unlimited_String.Variable_String;
            Line, Column, Insertion_Order : Natural;
            case What is
                when Unknown =>
                    null;
                when Basic_Value =>
                    The_Value : Dynamic_Value.Object;
                when Record_Value =>
                    The_Table : Object;
            end case;
        end record;

    function Get_Name (S : in Symbol) return String is
    begin
        return Unlimited_String.Image (S.all.Name);
    end Get_Name;



    procedure Deep_Copy (Source : in Object; Target : in out Object) is
    begin
        if (Target = null) then
            Target := new Object_Content;
        end if;  
        Target.Number_Of_Symbols := Source.all.Number_Of_Symbols;
        Tree.Deep_Copy (Source.all.Table, Target.all.Table);
    end Deep_Copy;


    procedure Deep_Copy (Source : in Symbol; Target : in out Symbol) is
        St : Object;
        V : Dynamic_Value.Object;
    begin
        -- si s2<>NULL c'est pas grave, le ramasse miette s'en occupe
        case Source.What is
            when Record_Value =>
                Deep_Copy (Source.all.The_Table, St);
                Target := new Symbol_Content'
                                 (What => Record_Value,
                                  Name => Source.all.Name,
                                  Type_Name => Source.all.Type_Name,
                                  Line => Source.all.Line,
                                  Column => Source.all.Column,
                                  Insertion_Order => Source.all.Insertion_Order,
                                  The_Table => St);
            when Basic_Value =>
                Dynamic_Value.Deep_Copy (Source.all.The_Value, V);
                Target := new Symbol_Content'(What => Basic_Value,
                                              The_Value => V,
                                              Name => Source.all.Name,
                                              Type_Name => Source.all.Type_Name,
                                              Line => Source.all.Line,
                                              Column => Source.all.Column,
                                              Insertion_Order =>
                                                 Source.all.Insertion_Order);
            when Unknown =>
                Target := new Symbol_Content'(What => Unknown,
                                              Name => Source.all.Name,
                                              Type_Name => Source.all.Type_Name,
                                              Line => Source.all.Line,
                                              Column => Source.all.Column,
                                              Insertion_Order =>
                                                 Source.all.Insertion_Order);
        end case;
    end Deep_Copy;

    function Get_Name (Where : in Object; Id : in Natural) return String is
        It : Tree.Iterator;
        Stop : Boolean := False;
        S : Symbol;
    begin
        if ((Where.all.Number_Of_Symbols < Id) or (Id < 1)) then
            raise Id_Does_Not_Exist_In_This_Table;
        end if;
        Tree.Open (It, Where.all.Table);
        while (not Stop) loop
            S := Tree.Consult (It);
            -- on sait que le numero recherche existe => pas besoin de verifier at_end
            Stop := (S.all.Insertion_Order = Id);
            Tree.Next (It);
        end loop;  
        return Unlimited_String.Image (S.all.Name);
    end Get_Name;



    function Get_Table (Where : in Object; Name : in String) return Object is  
        S_Seek : Symbol;
        N : Unlimited_String.Variable_String;
    begin  
        N := Unlimited_String.Value (Name);
        S_Seek := new Symbol_Content'(What => Unknown,
                                      Name => N,
                                      Type_Name => N,
                                      Line => 0,
                                      Column => 0,
                                      Insertion_Order => 0);
        if Tree.Exists (Where.all.Table, S_Seek) then
            Tree.Get_Value (Where.all.Table, S_Seek);  
            if (S_Seek.What = Record_Value) then
                return S_Seek.The_Table;  
            else  
                raise Name_Does_Not_Correspond_To_A_Table;
            end if;
        else  
            raise Name_Does_Not_Exist_In_This_Table;  
        end if;
    end Get_Table;


    function Get_Access_On_Value (Where : in Object; Name : in String)
                                 return Dynamic_Value.Object is
        S_Seek : Symbol;
        N : Unlimited_String.Variable_String;
    begin
        N := Unlimited_String.Value (Name);
        S_Seek := new Symbol_Content'(What => Unknown,
                                      Name => N,
                                      Type_Name => N,
                                      Line => 0,
                                      Column => 0,
                                      Insertion_Order => 0);
        if Tree.Exists (Where.all.Table, S_Seek) then
            Tree.Get_Value (Where.all.Table, S_Seek);
            if (S_Seek.What = Basic_Value) then
                return S_Seek.The_Value;
            else  
                raise Name_Does_Not_Correspond_To_A_Value;
            end if;
        else  
            raise Name_Does_Not_Exist_In_This_Table;
        end if;
    end Get_Access_On_Value;

    function Get_Kind_Of_Symbol
                (Where : in Object; Name : in String) return Kinds is
        S_Seek : Symbol;
        N : Unlimited_String.Variable_String;
    begin  
        N := Unlimited_String.Value (Name);
        S_Seek := new Symbol_Content'(What => Unknown,
                                      Name => N,
                                      Type_Name => N,
                                      Line => 0,
                                      Column => 0,
                                      Insertion_Order => 0);
        if Tree.Exists (Where.all.Table, S_Seek) then
            Tree.Get_Value (Where.all.Table, S_Seek);
            return S_Seek.What;  
        else
            raise Name_Does_Not_Exist_In_This_Table;
        end if;
    end Get_Kind_Of_Symbol;


    function Get_Number_Of_Symbols (Where : in Object) return Natural is
    begin
        return Where.all.Number_Of_Symbols;
    end Get_Number_Of_Symbols;


    function Get_Type_Name
                (Where : in Object; Name : in String) return String is
        S_Seek : Symbol;
        N : Unlimited_String.Variable_String;
    begin
        N := Unlimited_String.Value (Name);
        S_Seek := new Symbol_Content'(What => Unknown,
                                      Name => N,
                                      Type_Name => N,
                                      Line => 0,
                                      Column => 0,
                                      Insertion_Order => 0);
        if Tree.Exists (Where.all.Table, S_Seek) then
            Tree.Get_Value (Where.all.Table, S_Seek);
            return Unlimited_String.Image (S_Seek.Type_Name);
        else
            raise Name_Does_Not_Exist_In_This_Table;
        end if;
    end Get_Type_Name;


    procedure Print (S : in Symbol);

    procedure Print (T : Tree.Object) is
        It : Tree.Iterator;
    begin
        if not Tree.Is_Empty (T) then
            Tree.Open (It, T);
            while not (Tree.At_End (It)) loop
                Print (Tree.Consult (It));
                Tree.Next (It);
            end loop;
        end if;
    end Print;


    procedure Print (What : in Object) is
    begin
        Text_Io.Put_Line (" TABLE  ");
        Text_Io.Put_Line
           ("_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_");
        Text_Io.New_Line;
        Print (What.all.Table);
        Text_Io.New_Line;
        Text_Io.Put_Line (" FIN DE LA TABLE ");
    end Print;


    procedure Print (S : in Symbol) is
    begin
        Text_Io.Put ("   symbol ");
        Text_Io.Put (Kinds'Image (S.all.What));
        Text_Io.Put ("       nom: " & Unlimited_String.Image (S.all.Name) &
                     "  type: " & Unlimited_String.Image (S.all.Type_Name));
        Text_Io.Put ("  l: " & Natural'Image (S.all.Line) &
                     "  c: " & Natural'Image (S.all.Column));
        Text_Io.Put ("  N# : " & Natural'Image (S.all.Insertion_Order));
        case S.all.What is
            when Unknown =>
                null;
            when Basic_Value =>
                Text_Io.Put (" valeur: ");
                Dynamic_Value.Print (S.all.The_Value);
                Text_Io.New_Line;
            when Record_Value =>
                Text_Io.New_Line;
                if not Tree.Is_Empty (S.all.The_Table.all.Table) then
                    Text_Io.Put_Line ("-------------- Contenu du Record ----");
                    Print (S.all.The_Table.all.Table);
                    Text_Io.Put_Line ("---------------  Fin du record ------");
                    Text_Io.New_Line;
                end if;
        end case;
    end Print;

    procedure Insert_Value_Symbol (Where : in out Object;
                                   N : in String;
                                   L, C : in Natural;
                                   Initial_Value : Dynamic_Value.Object) is
        Sn, Tn : Unlimited_String.Variable_String;
        S : Symbol;
    begin  
        if (Where = null) then
            Where := new Object_Content;
        end if;
        Where.all.Number_Of_Symbols := Where.Number_Of_Symbols + 1;
        Sn := Unlimited_String.Value (N);
        Tn := Unlimited_String.Value
                 (Dynamic_Value.Kinds'Image
                     (Dynamic_Value.Get_Kind (Initial_Value)));
        S := new Symbol_Content'
                    (What => Basic_Value,
                     The_Value => Initial_Value,
                     Name => Sn,
                     Type_Name => Tn,
                     Line => L,
                     Column => C,
                     Insertion_Order => Where.all.Number_Of_Symbols);
        Tree.Insert (Where.all.Table, S);  
    exception
        when Tree.Value_Already_Exists =>
            Error.Set_Type_Error (Error.Field_Already_Exists);
            raise Error.Excep_Semantic_Error;
    end Insert_Value_Symbol;

    procedure Insert_Table_Symbol
                 (Where : in out Object; N, T : in String; L, C : in Natural) is
        Empty_Table : Object;
        S : Symbol;
        Sn : Unlimited_String.Variable_String;
        Tn : Unlimited_String.Variable_String;
    begin  
        if (Where = null) then
            Where := new Object_Content;
        end if;
        Where.all.Number_Of_Symbols := Where.all.Number_Of_Symbols + 1;  
        Sn := Unlimited_String.Value (N);
        Tn := Unlimited_String.Value (T);
        Empty_Table := new Object_Content;
        S := new Symbol_Content'(What => Record_Value,
                                 Name => Sn,
                                 Type_Name => Tn,
                                 Line => L,
                                 Column => C,
                                 Insertion_Order => Where.all.Number_Of_Symbols,
                                 The_Table => Empty_Table);
        Tree.Insert (Where.all.Table, S);  
    exception
        when Tree.Value_Already_Exists =>
            Error.Set_Type_Error (Error.Field_Already_Exists);
            raise Error.Excep_Semantic_Error;
    end Insert_Table_Symbol;


    function Are_Equal (S1, S2 : Symbol) return Boolean is
    begin
        return (Get_Name (S1) = Get_Name (S2));
    end Are_Equal;


    function "<" (S1, S2 : Symbol) return Boolean is
    begin
        return (Get_Name (S1) < Get_Name (S2));
    end "<";
end Tds;

E3 Meta Data

    nblk1=11
    nid=b
    hdr6=1c
        [0x00] rec0=22 rec1=00 rec2=01 rec3=050
        [0x01] rec0=16 rec1=00 rec2=03 rec3=034
        [0x02] rec0=0e rec1=00 rec2=04 rec3=080
        [0x03] rec0=1b rec1=00 rec2=0e rec3=030
        [0x04] rec0=19 rec1=00 rec2=11 rec3=00c
        [0x05] rec0=18 rec1=00 rec2=09 rec3=028
        [0x06] rec0=1b rec1=00 rec2=05 rec3=030
        [0x07] rec0=1b rec1=00 rec2=0c rec3=04a
        [0x08] rec0=00 rec1=00 rec2=08 rec3=00a
        [0x09] rec0=1d rec1=00 rec2=07 rec3=032
        [0x0a] rec0=18 rec1=00 rec2=0d rec3=016
        [0x0b] rec0=18 rec1=00 rec2=02 rec3=042
        [0x0c] rec0=16 rec1=00 rec2=0a rec3=052
        [0x0d] rec0=11 rec1=00 rec2=0f rec3=000
        [0x0e] rec0=02 rec1=00 rec2=0b rec3=000
        [0x0f] rec0=02 rec1=00 rec2=0b rec3=000
        [0x10] rec0=00 rec1=00 rec2=00 rec3=000
    tail 0x21541a05a864a816400b0 0x42a00088462060003
Free Block Chain:
  0xb: 0000  00 10 00 12 80 01 3b 01 00 08 65 6e 64 20 54 64  ┆      ;   end Td┆
  0x10: 0000  00 06 00 04 80 01 20 01 02 03 04 05 06 07 08 09  ┆                ┆
  0x6: 0000  00 00 00 0a 00 07 20 20 20 20 65 6e 64 07 3a 3d  ┆          end :=┆