|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 13312 (0x3400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Case_Analysis, seg_00461c
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
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;
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