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

⟦d19062b0d⟧ Ada Source

    Length: 13312 (0x3400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Case_Analysis, seg_00461c

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 Statements;
with Lrm_Utilities;
with Bounds_Utilities;
with Lrm_Renames;
use Lrm_Renames;
package body Case_Analysis is

    function Kind (Case_Expression : Ada_Program.Type_Definition)  
                  return Case_Expression_Kind is
    begin
        case Types.Kind (Types.Ground_Type (Case_Expression)) is
            when Types.An_Integer_Type_Definition =>
                return An_Integer;
            when Types.An_Enumeration_Type_Definition =>
                return An_Enumeration;
            when others =>
                raise Ada.Inappropriate_Program_Element;
        end case;
    end Kind;

    function Expression_Kind (For_Case_Statement : Ada_Program.Statement)
                             return Case_Expression_Kind is
        Expression_Type : Ada.Element :=
           Exprs.Expression_Type (Statements.Case_Expression
                                     (For_Case_Statement));
    begin
        return Kind (Expression_Type);
    end Expression_Kind;

    function Get_Literal (Position : Long_Integer;
                          Type_Def : Ada_Program.Type_Definition)
                         return Ada.Element is

        Lits : Ada.Element_Iterator := Types.Enumeration_Literals (Type_Def);
        Position_Number : Long_Integer := 0;
        Lit : Ada.Element;
    begin
        while not Ada.Done (Lits) loop
            Lit := Ada.Value (Lits);
            if Position_Number = Position then
                return Lit;
            end if;
            Position_Number := Position_Number + 1;
            Ada.Next (Lits);
        end loop;  
        raise Program_Error;
    end Get_Literal;

    procedure Get_Bounds (For_Choice           :        Ada.Element;
                          Lower_Pos, Upper_Pos : in out Long_Integer) is

        Upper, Lower : Ada.Element;

        Constraint : Ada.Element;
        Id, Id_Def : Ada.Element;

        Success, Static : Boolean;
    begin
        case Types.Choice_Kind (For_Choice) is
            when Types.A_Simple_Expression =>
                Lower_Pos := Lrm_Utilities.Static_Value
                                (Types.Choice_Expression (For_Choice));  
                Upper_Pos := Lower_Pos;

            when Types.A_Discrete_Range =>

                Bounds_Utilities.Find_Range
                   (Types.Choice_Range (For_Choice), Lower_Pos,
                    Upper_Pos, Static, Lower, Upper);
            when Types.An_Identifier_Reference =>
                Id     := Types.Choice_Identifier (For_Choice);
                Id_Def := Ada.Definition (Id);

                Lower_Pos := Lrm_Utilities.Static_Value (Id);

                Upper_Pos := Lower_Pos;
            when others =>
                raise Ada.Inappropriate_Program_Element;
        end case;
    end Get_Bounds;

    procedure Init (Iter : in out Value_Iterator) is
        Hole_Low, Hole_High : Long_Integer := 0;
    begin
        if Iter.Is_Others_Iterator then
            if Discrete_Hole_Manager.More_Holes (Iter.Holes) then
                Discrete_Hole_Manager.Next_Hole
                   (Iter.Holes, Hole_Low, Hole_High);

                Iter.Current_Lower := Hole_Low;
                Iter.Current_Upper := Hole_High;
                Iter.Current_Value := Hole_Low;
            else
                Iter.Is_Done := True;
            end if;
        else

            Discrete_Value_Manager.Init_Iteration (Iter.Values);
            if Discrete_Value_Manager.More_Values (Iter.Values) then
                Discrete_Value_Manager.Next_Range
                   (Iter.Values, Hole_Low, Hole_High);

                Iter.Current_Lower := Hole_Low;
                Iter.Current_Upper := Hole_High;
                Iter.Current_Value := Hole_Low;
            else
                Iter.Is_Done := True;
            end if;
        end if;

    end Init;

    function Values (For_Case_Arm : Ada_Program.Element)
                    return Value_Iterator is

        Case_Statement  : Ada.Statement := Ada.Parent (For_Case_Arm);
        Expression_Type : Ada.Element   :=
           Exprs.Expression_Type (Statements.Case_Expression (Case_Statement));

        Return_Iter : Value_Iterator;

        Arms   : Ada.Element_Iterator := Stmts.Case_Arms_List (Case_Statement);
        An_Arm : Ada.Element;

        Choices  : Ada.Element_Iterator;
        A_Choice : Ada.Element;

        Lower, Upper : Ada.Element;

        Hole_Low, Hole_High  : Long_Integer := 0;
        Lower_Pos, Upper_Pos : Long_Integer;
        Success, Static      : Boolean;
    begin
        Return_Iter.Kind            := Kind (Expression_Type);
        Return_Iter.Ground_Type_Def := Types.Ground_Type (Expression_Type);
        Return_Iter.Arm             := For_Case_Arm;

        Bounds_Utilities.Get_Constraints
           (Expression_Type, Lower_Pos, Upper_Pos, Static);

        -- fill up the lists
        if Stmts.Is_When_Others (For_Case_Arm) then

            Discrete_Hole_Manager.Init_Holes
               (Return_Iter.Holes, Lower_Pos, Upper_Pos);

            Return_Iter.Is_Others_Iterator := True;

            while not Ada.Done (Arms) loop
                An_Arm := Ada.Value (Arms);
                if not Stmts.Is_When_Others (An_Arm) then
                    Choices := Stmts.Case_Alternative_Choices (An_Arm);
                    while not Ada.Done (Choices) loop
                        A_Choice := Ada.Value (Choices);

                        Get_Bounds (A_Choice, Lower_Pos, Upper_Pos);
                        Discrete_Hole_Manager.Delete_Hole
                           (Return_Iter.Holes, Lower_Pos, Upper_Pos, Success);
                        Ada.Next (Choices);
                    end loop;

                end if;
                Ada.Next (Arms);
            end loop;
        else
            Discrete_Value_Manager.Init_Values
               (Return_Iter.Values, Lower_Pos, Upper_Pos);

            Return_Iter.Is_Others_Iterator := False;

            Choices := Stmts.Case_Alternative_Choices (For_Case_Arm);
            while not Ada.Done (Choices) loop
                A_Choice := Ada.Value (Choices);
                Get_Bounds (A_Choice, Lower_Pos, Upper_Pos);
                Discrete_Value_Manager.Add_Value_Range
                   (Return_Iter.Values, Lower_Pos, Upper_Pos, Success);
                Ada.Next (Choices);
            end loop;
        end if;

        Init (Return_Iter);

        return Return_Iter;
    end Values;

    procedure Reset (Iter : in out Value_Iterator) is
    begin
        Iter := Values (Iter.Arm);
    end Reset;

    function Done (Iter : Value_Iterator) return Boolean is
    begin
        return Iter.Is_Done;
    end Done;

    function Integer_Value (Iter : Value_Iterator) return Long_Integer is
    begin
        case Iter.Kind is
            when An_Enumeration =>
                raise Bad_Kind;
            when An_Integer =>
                return Iter.Current_Value;
        end case;
    end Integer_Value;

    function Enumeration_Literal (Iter : Value_Iterator)
                                 return Ada_Program.Element is
    begin
        case Iter.Kind is
            when An_Enumeration =>
                return Get_Literal (Iter.Current_Value, Iter.Ground_Type_Def);
            when An_Integer =>
                raise Bad_Kind;
        end case;
    end Enumeration_Literal;

    procedure Next (Iter : in out Value_Iterator) is
        Low, High : Long_Integer;
    begin
        if Iter.Current_Value = Iter.Current_Upper then

            if Iter.Is_Others_Iterator then
                if Discrete_Hole_Manager.More_Holes (Iter.Holes) then

                    Discrete_Hole_Manager.Next_Hole (Iter.Holes, Low, High);

                    Iter.Current_Lower := Low;
                    Iter.Current_Upper := High;
                    Iter.Current_Value := Low;
                else
                    Iter.Is_Done := True;
                end if;
            else
                if Discrete_Value_Manager.More_Values (Iter.Values) then

                    Discrete_Value_Manager.Next_Range (Iter.Values, Low, High);

                    Iter.Current_Lower := Low;
                    Iter.Current_Upper := High;
                    Iter.Current_Value := Low;
                else
                    Iter.Is_Done := True;
                end if;

            end if;
        else
            Iter.Current_Value := Iter.Current_Value + 1;
        end if;

    end Next;

    procedure Value_Range (Iter      :     Value_Iterator;
                           Low, High : out Long_Integer) is
    begin
        Low  := Iter.Current_Lower;
        High := Iter.Current_Upper;
    end Value_Range;

    procedure Next_Range (Iter : in out Value_Iterator) is
        Low, High : Long_Integer;
    begin
        if Iter.Is_Others_Iterator then
            if Discrete_Hole_Manager.More_Holes (Iter.Holes) then

                Discrete_Hole_Manager.Next_Hole (Iter.Holes, Low, High);

                Iter.Current_Lower := Low;
                Iter.Current_Upper := High;
            else
                Iter.Is_Done := True;
            end if;
        else
            if Discrete_Value_Manager.More_Values (Iter.Values) then

                Discrete_Value_Manager.Next_Range (Iter.Values, Low, High);

                Iter.Current_Lower := Low;
                Iter.Current_Upper := High;
            else
                Iter.Is_Done := True;
            end if;

        end if;

    end Next_Range;

end Case_Analysis;

E3 Meta Data

    nblk1=c
    nid=0
    hdr6=18
        [0x00] rec0=1c rec1=00 rec2=01 rec3=04a
        [0x01] rec0=1e rec1=00 rec2=02 rec3=040
        [0x02] rec0=1a rec1=00 rec2=03 rec3=052
        [0x03] rec0=00 rec1=00 rec2=0c rec3=008
        [0x04] rec0=1e rec1=00 rec2=04 rec3=010
        [0x05] rec0=1a rec1=00 rec2=05 rec3=048
        [0x06] rec0=02 rec1=00 rec2=0b rec3=00c
        [0x07] rec0=19 rec1=00 rec2=06 rec3=040
        [0x08] rec0=20 rec1=00 rec2=07 rec3=012
        [0x09] rec0=1d rec1=00 rec2=08 rec3=03e
        [0x0a] rec0=20 rec1=00 rec2=09 rec3=00e
        [0x0b] rec0=1d rec1=00 rec2=0a rec3=000
    tail 0x21700245c815c65c7283d 0x42a00088462061e03