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

⟦ae6f458e9⟧ Ada Source

    Length: 37888 (0x9400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Our_Value, seg_049272

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 Ext_String, Lex, Text_Io;
use Ext_String, Lex;

package body Our_Value is


----------------------------------------------------------------------------
    -- Procedures de traitement des exceptions --
----------------------------------------------------------------------------
    procedure Signal_Not_Implemented is
    begin
        Print ("Desole, Cette fonction n'est pas encore implementee!");
        Print_New_Line;
    end Signal_Not_Implemented;


----------------------------------------------------------------------------
    function Verify_Type
                (Val : Var_Value; Type_Var : Var_Type) return Boolean is
    begin
        if (Val.My_Type = Undefined) or else (Type_Var = Undefined) then
            Print ("Il y a une operation sur une variable indefinie");
            Print_New_Line;
            return False;

        elsif (Val.My_Type /= Type_Var) then
            case Val.My_Type is
                when Undefined =>
                    Print ("Operation illegale sur une variable indefinie");
                    Print_New_Line;

                when Type_Value =>
                    Print ("Operation illegale sur un pointeur sur VAR_VALUE");
                    Print_New_Line;


                when Type_Token =>
                    Print ("Operation illegale sur une variable jeton");
                    Print_New_Line;

                when Type_Boolean =>
                    Print ("Operation illegale sur une variable booleenne");
                    Print_New_Line;

                when Type_Integer =>
                    Print ("Operation illegale sur une variable entiere");
                    Print_New_Line;

                when Type_String =>
                    Print ("Operation illegale sur une variable chaine");
                    Print_New_Line;

            end case;
            return False;

        else
            return True;

        end if;
    end Verify_Type;


----------------------------------------------------------------------------
    -- procedures d'affectation (Set_Value => ":=") --
----------------------------------------------------------------------------
    procedure Set_Value (Target : in out Var_Value; Source : Var_Value) is
    begin
        if Verify_Type (Source, Type_Token) and then
           Verify_Type (Target, Type_Token) then
            Verify_Print ("Target.My_Token <- " & Convert (Source.My_Token));
            Verify_New_Line;
            Target.My_Token := Source.My_Token;

        elsif Verify_Type (Source, Type_Boolean) and then
              Verify_Type (Target, Type_Token) then
            Verify_Print ("Target.My_Boolean <- " &
                          Convert (Source.My_Boolean));
            Verify_New_Line;
            Target.My_Boolean := Source.My_Boolean;

        elsif Verify_Type (Source, Type_Integer) and then
              Verify_Type (Target, Type_Token) then
            Verify_Print ("Target.My_Integer <- " &
                          Convert (Source.My_Integer));
            Verify_New_Line;
            Target.My_Integer := Source.My_Integer;

        elsif Verify_Type (Source, Type_String) and then
              Verify_Type (Target, Type_Token) then
            Verify_Print ("Target.My_String <- " & Source.My_String);
            Verify_New_Line;
            Copy (Target.My_String, Source.My_String);

        else
            Print
               ("Il y a une tentative d'affectation entre des types incompatibles!");
            raise Type_Conflict;
        end if;
    end Set_Value;


    procedure Set_Value (Target : in out Var_Value; Source : P_Value) is
    begin
        if Verify_Type (Target, Type_Value) then
            Verify_Print ("Target.My_Value <- P_Value");
            Verify_New_Line;
            Target.My_Value := Source;
        end if;
    end Set_Value;


    procedure Set_Value (Target : in out Var_Value; Source : Lex.Token) is
    begin
        if Verify_Type (Target, Type_Token) then
            Verify_Print ("Target.My_Token <- " & Convert (Source));
            Verify_New_Line;
            Target.My_Token := Source;
        end if;
    end Set_Value;


    procedure Set_Value (Target : in out Var_Value; Source : Boolean) is
    begin
        if Verify_Type (Target, Type_Boolean) then
            Verify_Print ("Target.My_Boolean <- " & Convert (Source));
            Verify_New_Line;
            Target.My_Boolean := Source;
        end if;
    end Set_Value;



    procedure Set_Value (Target : in out Var_Value; Source : Integer) is
    begin
        if Verify_Type (Target, Type_Integer) then

            Verify_Print ("Target.My_Integer <- " & Convert (Source));
            Verify_New_Line;
            Target.My_Integer := Source;
        end if;
    end Set_Value;


    procedure Set_Value (Target : in out Var_Value; Source : Var_String) is
        Local_Token : Lex.Token;
        Local_Boolean : Boolean;
        Local_Integer : Integer;
    begin
        if Is_Token_Op (Source) and then Verify_Type (Target, Type_Token) then
            Local_Token := Convert (Source);
            Set_Value (Target, Local_Token);

        elsif Is_Boolean (Source) and then
              Verify_Type (Target, Type_Boolean) then
            Local_Boolean := Convert (Source);
            Set_Value (Target, Local_Boolean);

        elsif Is_Integer (Source) and then
              Verify_Type (Target, Type_Integer) then
            Local_Integer := Convert (Source);
            Set_Value (Target, Local_Integer);

        else
            if Verify_Type (Target, Type_String) then
                Verify_Print ("Target.My_String <- " & Source);
                Verify_New_Line;
                Copy (Target.My_String, Source);

            end if;
        end if;
    end Set_Value;


----------------------------------------------------------------------------
    -- fonctions de consultations --
----------------------------------------------------------------------------
    function Get_Type (Val : Var_Value) return Var_Type is
    begin
        case Val.My_Type is
            when Undefined =>
                Verify_Print ("Get_Type -> Undefined");

            when Type_Value =>
                Verify_Print ("Get_Type -> Type_Value");

            when Type_Token =>
                Verify_Print ("Get_Type -> Type_Token");

            when Type_Boolean =>
                Verify_Print ("Get_Type -> Type_Boolean");

            when Type_Integer =>
                Verify_Print ("Get_Type -> Type_Integer");

            when Type_String =>
                Verify_Print ("Get_Type -> Type_String");

        end case;
        Verify_New_Line;
        return Val.My_Type;
    end Get_Type;


    function Get_Type (Val : P_Value) return Var_Type is
    begin
        Verify_Print ("Get_Type -> Type_Value");
        Verify_New_Line;
        return Type_Value;
    end Get_Type;


    function Get_Type (Val : Lex.Token) return Var_Type is
    begin
        Verify_Print ("Get_Type -> Type_Token");
        Verify_New_Line;
        return Type_Token;
    end Get_Type;

    function Get_Type (Val : Boolean) return Var_Type is
    begin
        Verify_Print ("Get_Type -> Type_Boolean");
        Verify_New_Line;
        return Type_Boolean;
    end Get_Type;


    function Get_Type (Val : Integer) return Var_Type is
    begin
        Verify_Print ("Get_Type -> Type_Integer");
        Verify_New_Line;
        return Type_Integer;
    end Get_Type;


    function Get_Type (Val : Var_String) return Var_Type is
    begin
        Verify_Print ("Get_Type -> Type_String");
        Verify_New_Line;
        return Type_String;
    end Get_Type;

----------------------------------------------------------------------------
    function Get_Value (Val : Var_Value) return Lex.Token is
    begin
        if Verify_Type (Val, Type_Token) then
            Verify_Print ("Get_Type -> " & Convert (Val.My_Token));
            Verify_New_Line;
            return Val.My_Token;
        else
            raise Type_Conflict;
        end if;
    end Get_Value;


    function Get_Value (Val : Var_Value) return Boolean is
    begin
        if Verify_Type (Val, Type_Boolean) then
            Verify_Print ("Get_Value -> " & Convert (Val.My_Boolean));
            Verify_New_Line;
            return Val.My_Boolean;
        else
            raise Type_Conflict;
        end if;
    end Get_Value;


    function Get_Value (Val : Var_Value) return Integer is
    begin
        if Verify_Type (Val, Type_Integer) then
            Verify_Print ("Get_Value -> " & Convert (Val.My_Integer));
            Verify_New_Line;
            return Val.My_Integer;
        else
            raise Type_Conflict;
        end if;
    end Get_Value;


    function Get_Value (Val : Var_Value) return Var_String is
    begin
        if Verify_Type (Val, Type_String) then
            Verify_Print ("Get_Value -> " & Val.My_String);
            Verify_New_Line;
            return Val.My_String;
        else
            raise Type_Conflict;
        end if;
    end Get_Value;

----------------------------------------------------------------------------
    function Get_Value (Val : P_Value) return Lex.Token is
        Local : Var_Value (Type_Value);
    begin
        Set_Value (Local, Val);
        return Get_Value (Local);
    end Get_Value;


    function Get_Value (Val : P_Value) return Boolean is
        Local : Var_Value (Type_Value);
    begin
        Set_Value (Local, Val);
        return Get_Value (Local);
    end Get_Value;


    function Get_Value (Val : P_Value) return Integer is
        Local : Var_Value (Type_Value);
    begin
        Set_Value (Local, Val);
        return Get_Value (Local);
    end Get_Value;


    function Get_Value (Val : P_Value) return Var_String is
        Local : Var_Value (Type_Value);
    begin
        Set_Value (Local, Val);
        return Get_Value (Local);
    end Get_Value;

----------------------------------------------------------------------------
    procedure Print_Value (Val : P_Value) is
        Local : Var_String;
    begin
        Verify_Print ("Print_Value :");
        case Val.My_Type is
            when Undefined =>
                Print ("indefinie");

            when Type_Value =>
                Print_Value (Val.My_Value);

            when Type_Token =>
                Print (Convert (Val.My_Token));

            when Type_Boolean =>
                Print (Convert (Val.My_Boolean));

            when Type_Integer =>
                Print (Convert (Val.My_Integer));

            when Type_String =>
                Print (Val.My_String);

        end case;
        Verify_New_Line;
    end Print_Value;


    procedure Print_Value (Val : Var_Value) is
        Local : Var_String;
    begin
        Verify_Print ("Print_Value :");
        case Val.My_Type is
            when Undefined =>
                Print ("indefinie");

            when Type_Value =>
                Print_Value (Val.My_Value);

            when Type_Token =>
                Print (Convert (Val.My_Token));

            when Type_Boolean =>
                Print (Convert (Val.My_Boolean));

            when Type_Integer =>
                Print (Convert (Val.My_Integer));

            when Type_String =>
                Print (Val.My_String);

        end case;
        Verify_New_Line;
    end Print_Value;

----------------------------------------------------------------------------
    -- Fonctions sur des operations unaires --
----------------------------------------------------------------------------
    function Op (Operator : Lex.Token; Val : Var_Value) return Boolean is
        Val_Str : Var_String;
        Local : Boolean;  
    begin
        if Verify_Type (Val, Type_Boolean) then
            if (Operator = Non) then  
                Copy (Val_Str, "non " & Convert (Val.My_Boolean));
                Copy (Val_Str, Val_Str & " -> ");
                Local := not Val.My_Boolean;

            else
                Copy (Val_Str, "Operation booleenne inconnue");
                raise Type_Conflict;

            end if;

        else
            Copy (Val_Str, "VAR_VALUE n'est pas de type TYPE_BOOLEAN");
            raise Type_Conflict;

        end if;
        Verify_Print (Val_Str & Convert (Local));
        Verify_New_Line;
        return Local;

    exception
        when Type_Conflict =>
            Print (Val_Str & " -> Type_Conflict");
            Print_New_Line;
            return False;
            raise;

        when others =>
            Print (Val_Str & " -> exception non traitee");
            Print_New_Line;
            raise;

    end Op;

----------------------------------------------------------------------------
    function Op (Operator : Lex.Token; Val : Var_Value) return Integer is
        Val_Str : Var_String;
        Local : Integer;
    begin
        if Verify_Type (Val, Type_Integer) then
            if (Operator = Plus) then
                Copy (Val_Str, "+ " & Convert (Val.My_Integer));  
                Copy (Val_Str, Val_Str & " -> ");
                Local := Val.My_Integer;

            elsif (Operator = Minus) then
                Copy (Val_Str, "- " & Convert (Val.My_Integer));  
                Copy (Val_Str, Val_Str & " -> ");
                Local := -Val.My_Integer;

            else
                Copy (Val_Str, "Operateur entier inconnu");
                raise Type_Conflict;

            end if;

        else
            Copy (Val_Str, "VAR_VALUE n'est pas de type TYPE_INTEGER");
            raise Type_Conflict;

        end if;
        Verify_Print (Val_Str & Convert (Local));
        Verify_New_Line;
        return Local;

    exception
        when Type_Conflict =>
            Print (Val_Str & " -> Type_Conflict");
            Print_New_Line;
            return 0;
            raise;

        when others =>
            Print (Val_Str & " -> Exception non traitee");
            Print_New_Line;
            raise;

    end Op;

----------------------------------------------------------------------------
    -- Fonctions sur des operations binaires --
----------------------------------------------------------------------------
    function Op (Operator : Lex.Token; Val1, Val2 : Var_Value) return Boolean is
        Val_Str : Var_String;
        Local : Boolean;
    begin
        if (Val1.My_Type = Type_Boolean) and then
           (Val2.My_Type = Type_Boolean) then

            if (Operator = Et) then
                Local := (Val1.My_Boolean and Val2.My_Boolean);

            elsif (Operator = Ou) then
                Local := (Val1.My_Boolean or Val2.My_Boolean);

            elsif (Operator = Equal) then
                Local := (Val1.My_Boolean = Val2.My_Boolean);

            elsif (Operator = Not_Equal) then
                Local := (Val1.My_Boolean /= Val2.My_Boolean);

            else
                Copy (Val_Str, "Operateur booleen inconnu");
                raise Type_Conflict;

            end if;
            Copy (Val_Str, Convert (Val1.My_Boolean) & " ");
            Copy (Val_Str, Val_Str & Convert (Operator) & " ");
            Copy (Val_Str, Val_Str & Convert (Val2.My_Boolean));
            Copy (Val_Str, Val_Str & " -> ");


        elsif (Val1.My_Type = Type_Integer) and then
              (Val2.My_Type = Type_Integer) then

            if (Operator = Equal) then
                Local := (Val1.My_Integer = Val2.My_Integer);

            elsif (Operator = Not_Equal) then
                Local := (Val1.My_Integer /= Val2.My_Integer);

            elsif (Operator = Less) then
                Local := (Val1.My_Integer < Val2.My_Integer);

            elsif (Operator = Less_Equal) then
                Local := (Val1.My_Integer <= Val2.My_Integer);

            elsif (Operator = Great) then
                Local := (Val1.My_Integer > Val2.My_Integer);

            elsif (Operator = Great_Equal) then
                Local := (Val1.My_Integer >= Val2.My_Integer);

            else
                Copy (Val_Str, "Operateur entier inconnu");
                raise Type_Conflict;

            end if;
            Copy (Val_Str, Convert (Val1.My_Integer) & " ");
            Copy (Val_Str, Val_Str & Convert (Operator) & " ");
            Copy (Val_Str, Val_Str & Convert (Val2.My_Integer));
            Copy (Val_Str, Val_Str & " -> ");


        elsif (Val1.My_Type = Type_String) and then
              (Val2.My_Type = Type_String) then
            if (Operator = Equal) then
                Local := Cmp (Val1.My_String, Val2.My_String);

            elsif (Operator = Not_Equal) then
                Local := not Cmp (Val1.My_String, Val2.My_String);

            else
                Copy (Val_Str, "Operateur chaine inconnu");
                raise Type_Conflict;

            end if;
            Copy (Val_Str, Val1.My_String & " ");
            Copy (Val_Str, Val_Str & Convert (Operator) & " ");
            Copy (Val_Str, Val_Str & Val2.My_String);
            Copy (Val_Str, Val_Str & " -> ");


        else
            Copy (Val_Str,
                  "Operation binaire booleenne avec operandes incompatibles");
            raise Type_Conflict;

        end if;
        Verify_Print (Val_Str & Convert (Local));
        Verify_New_Line;
        return Local;

    exception
        when Type_Conflict =>
            Print (Val_Str & " -> Type_Conflict");
            Print_New_Line;
            return False;
            raise;

        when others =>
            Print (Val_Str & " -> Exception non traitee");
            Print_New_Line;
            raise;

    end Op;

----------------------------------------------------------------------------
    function Op (Operator : Lex.Token; Val1, Val2 : Var_Value) return Integer is
        Val_Str : Var_String;
        Local : Integer;
    begin
        if Verify_Type (Val1, Type_Integer) and then
           Verify_Type (Val2, Type_Integer) then  
            if (Operator = Plus) then
                Local := (Val1.My_Integer + Val2.My_Integer);

            elsif (Operator = Minus) then
                Local := (Val1.My_Integer - Val2.My_Integer);

            elsif (Operator = Cross) then
                Local := (Val1.My_Integer * Val2.My_Integer);

            elsif (Operator = Slash) then
                Local := (Val1.My_Integer / Val2.My_Integer);

            else
                Copy (Val_Str, "Operateur entier inconnu");
                raise Type_Conflict;

            end if;
            Copy (Val_Str, Convert (Val1.My_Integer) & " ");
            Copy (Val_Str, Val_Str & Convert (Operator) & " ");
            Copy (Val_Str, Val_Str & Convert (Val2.My_Integer));
            Copy (Val_Str, Val_Str & " -> ");


        else
            Copy (Val_Str,
                  "Operation binaire entiere avec operandes incompatibles");
            raise Type_Conflict;

        end if;
        Verify_Print (Val_Str & Convert (Local));
        Verify_New_Line;
        return Local;

    exception
        when Type_Conflict =>
            Print (Val_Str & " -> Type_Conflict");
            Print_New_Line;
            return 0;
            raise;

        when others =>
            Print (Val_Str & " -> Exception non traitee");
            Print_New_Line;
            raise;

    end Op;
----------------------------------------------------------------------------
    function Op (Operator : Lex.Token; Val1, Val2 : Var_Value)
                return Var_String is
        Val_Str : Var_String;
        Local : Var_String;
    begin
        if Verify_Type (Val1, Type_String) and then
           Verify_Type (Val2, Type_String) then
            if (Operator = Coma) then
                Copy (Local, Val1.My_String & " & " & Val2.My_String);

            else
                Copy (Val_Str, "Operateur chaine inconnu");
                raise Type_Conflict;

            end if;
            Copy (Val_Str, Val1.My_String & " ");
            Copy (Val_Str, Val_Str & Convert (Operator) & " ");
            Copy (Val_Str, Val_Str & Val2.My_String);
            Copy (Val_Str, Val_Str & " -> ");

        else
            Copy (Val_Str,
                  "Operation binaire chaine avec operandes incompatibles");
            raise Type_Conflict;

        end if;
        Verify_Print (Val_Str & Convert (Local));
        Verify_New_Line;
        return Local;

    exception
        when Type_Conflict =>
            Print (Val_Str & " -> Type_Conflict");
            Print_New_Line;
            return Value (" _? , _? ");
            raise;

        when others =>
            Print (Val_Str & " -> Exception non traitee");
            Print_New_Line;
            raise;
    end Op;
----------------------------------------------------------------------------

end Our_Value;

E3 Meta Data

    nblk1=24
    nid=8
    hdr6=30
        [0x00] rec0=1d rec1=00 rec2=01 rec3=03a
        [0x01] rec0=1f rec1=00 rec2=15 rec3=006
        [0x02] rec0=17 rec1=00 rec2=16 rec3=032
        [0x03] rec0=1c rec1=00 rec2=1a rec3=000
        [0x04] rec0=02 rec1=00 rec2=0a rec3=02c
        [0x05] rec0=20 rec1=00 rec2=1b rec3=052
        [0x06] rec0=1b rec1=00 rec2=22 rec3=008
        [0x07] rec0=21 rec1=00 rec2=13 rec3=01a
        [0x08] rec0=25 rec1=00 rec2=0d rec3=000
        [0x09] rec0=1e rec1=00 rec2=0f rec3=038
        [0x0a] rec0=24 rec1=00 rec2=0c rec3=04c
        [0x0b] rec0=22 rec1=00 rec2=0b rec3=034
        [0x0c] rec0=26 rec1=00 rec2=17 rec3=026
        [0x0d] rec0=13 rec1=00 rec2=24 rec3=048
        [0x0e] rec0=1f rec1=00 rec2=12 rec3=050
        [0x0f] rec0=0f rec1=00 rec2=1f rec3=00c
        [0x10] rec0=20 rec1=00 rec2=03 rec3=02c
        [0x11] rec0=1c rec1=00 rec2=20 rec3=02a
        [0x12] rec0=1b rec1=00 rec2=1e rec3=022
        [0x13] rec0=1e rec1=00 rec2=23 rec3=05e
        [0x14] rec0=1d rec1=00 rec2=02 rec3=074
        [0x15] rec0=23 rec1=00 rec2=1d rec3=012
        [0x16] rec0=1b rec1=00 rec2=10 rec3=00a
        [0x17] rec0=14 rec1=00 rec2=14 rec3=000
        [0x18] rec0=20 rec1=00 rec2=14 rec3=004
        [0x19] rec0=1f rec1=00 rec2=10 rec3=01a
        [0x1a] rec0=11 rec1=00 rec2=1e rec3=000
        [0x1b] rec0=20 rec1=00 rec2=0a rec3=020
        [0x1c] rec0=05 rec1=00 rec2=15 rec3=000
        [0x1d] rec0=1b rec1=00 rec2=0c rec3=034
        [0x1e] rec0=1b rec1=00 rec2=02 rec3=000
        [0x1f] rec0=05 rec1=00 rec2=22 rec3=000
        [0x20] rec0=8c rec1=00 rec2=00 rec3=000
        [0x21] rec0=00 rec1=00 rec2=15 rec3=7cf
        [0x22] rec0=00 rec1=00 rec2=00 rec3=000
        [0x23] rec0=00 rec1=00 rec2=00 rec3=021
    tail 0x21546833e865b5ee044d4 0x42a00088462060003
Free Block Chain:
  0x8: 0000  00 05 00 2e 00 09 20 20 20 20 62 65 67 69 6e 09  ┆   .      begin ┆
  0x5: 0000  00 0e 01 91 80 1d 20 20 20 20 20 20 20 20 20 77  ┆               w┆
  0xe: 0000  00 04 00 1d 80 0d 79 70 65 5f 43 6f 6e 66 6c 69  ┆      ype_Confli┆
  0x4: 0000  00 11 03 fc 80 06 6e 64 20 69 66 3b 06 00 0e 20  ┆      nd if;    ┆
  0x11: 0000  00 06 01 ce 00 00 00 00 0c 20 20 20 20 20 20 20  ┆                ┆
  0x6: 0000  00 18 03 fc 80 34 6f 6d 6d 75 74 65 20 28 56 61  ┆     4ommute (Va┆
  0x18: 0000  00 07 03 fc 80 2d 28 22 20 75 6e 65 20 63 68 61  ┆     -(" une cha┆
  0x7: 0000  00 19 03 fc 80 3a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ┆     :----------┆
  0x19: 0000  00 09 03 fc 80 05 65 21 22 29 3b 05 00 1f 20 20  ┆      e!");     ┆
  0x9: 0000  00 21 03 fc 80 1a 77 68 65 6e 20 42 6f 6f 6c 65  ┆ !    when Boole┆
  0x21: 0000  00 1c 03 fc 00 35 20 20 20 20 20 20 20 20 20 20  ┆     5          ┆
  0x1c: 0000  00 00 03 f9 80 24 20 4f 70 5f 43 6f 6d 6d 75 74  ┆     $ Op_Commut┆