|
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: 32768 (0x8000) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Constraint_Utilities, seg_00461e
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Io; with Expression_Utilities; with Size_Utilities; with String_Utilities; with Type_Information; with Bounds_Utilities; with Ada_Program; with Declarations; with Names_And_Expressions; package body Constraint_Utilities is package Ada renames Ada_Program; package Expressions renames Names_And_Expressions; package Float_Conversion is new Io.Float_Io (Float); Others_Choice_Found : exception; function Another_Object (Original_Decl : Ada_Program.Element) return Object is Obj : Object (Kind => Other_Object); begin Obj.Decl := Original_Decl; return Obj; end Another_Object; function Is_Character (Type_Def : Type_Information.Type_Definition) return Boolean is Last : Ada.Element := Type_Information.Last_Constraint (Type_Def); begin return String_Utilities.Equal (Ada.Image (Last), "CHARACTER") or else String_Utilities.Equal (Declarations.Name (Ada.Parent (Last)), "CHARACTER"); end Is_Character; function Is_String (Array_Type_Def : Type_Information.Type_Definition) return Boolean is Component_Type : Type_Information.Subtype_Indication := Type_Information.Component_Type (Array_Type_Def); begin return Is_Character (Component_Type); end Is_String; function Compute_Array (Type_Def : Type_Information.Type_Definition) return Object is Index_Constraints : Ada.Element_Iterator := Type_Information.Index_Constraints (Type_Def); Num_Elements : Size_Utilities.Long_Natural; Static : Boolean; begin Size_Utilities.Number_Of_Elements (Index_Constraints, Num_Elements, Static); if Static then if Is_String (Type_Def) then return Object'(A_String_Object, Type_Def, Natural (Num_Elements)); else return Object'(An_Array_Object, Type_Def, Natural (Num_Elements)); end if; else return Another_Object (Type_Def); end if; end Compute_Array; procedure Non_Static_Value (For_Name_Expression : Ada_Program.Expression; Value : out Long_Integer; Has_Value : out Boolean) is begin Value := 0; Has_Value := False; end Non_Static_Value; function Integer_Val is new Expression_Utilities.Integer_Value (Non_Static_Value); procedure Non_Static_Value (For_Name_Expression : Ada_Program.Expression; Value : out Float; Has_Value : out Boolean) is begin Value := 0.0; Has_Value := False; end Non_Static_Value; function Float_Val is new Expression_Utilities.Float_Value (Non_Static_Value); procedure Non_Static_Value (For_Name_Expression : Ada_Program.Expression; Value : out String; Last : out Positive; Has_Value : out Boolean) is begin Value := ""; Last := 1; Has_Value := False; end Non_Static_Value; function String_Val is new Expression_Utilities.String_Value (Non_Static_Value); function Range_Object (A_Range : Type_Information.Range_Info; Original_Decl : Ada_Program.Element) return Object is Lbound_Expr, Ubound_Expr : Ada_Program.Element; Lbound, Ubound : Long_Integer; L_Bound, U_Bound : Float; Type_Def : Type_Information.Type_Definition; begin Type_Information.Bounds (A_Range, Lbound_Expr, Ubound_Expr); Type_Def := Expressions.Expression_Type (Lbound_Expr); if String_Utilities.Equal (Ada_Program.Image (Type_Def), "[universal_integer]") then Lbound := Integer_Val (Lbound_Expr); Ubound := Integer_Val (Ubound_Expr); return Object'(An_Integer_Object, Original_Decl, Lbound, Ubound); elsif String_Utilities.Equal (Ada_Program.Image (Type_Def), "[universal_real]") then L_Bound := Float_Val (Lbound_Expr); U_Bound := Float_Val (Ubound_Expr); return Object'(A_Float_Object, Original_Decl, L_Bound, U_Bound); end if; begin case Type_Information.Kind (Type_Information.Ground_Type (Type_Def)) is when Type_Information.An_Integer_Type_Definition => Lbound := Integer_Val (Lbound_Expr); Ubound := Integer_Val (Ubound_Expr); return Object'(An_Integer_Object, Original_Decl, Lbound, Ubound); when Type_Information.A_Float_Type_Definition => L_Bound := Float_Val (Lbound_Expr); U_Bound := Float_Val (Ubound_Expr); return Object'(A_Float_Object, Original_Decl, L_Bound, U_Bound); when others => return Another_Object (Original_Decl); end case; exception when Expression_Utilities.Not_Static => return Another_Object (Original_Decl); end; end Range_Object; function Actual_String_Size (Index_Constraints : Ada_Program.Element; Original_Decl : Ada_Program.Element) return Object is Ranges : Ada_Program.Element_Iterator := Type_Information.Discrete_Ranges (Index_Constraints); A_Range : Ada_Program.Element; Current_Size : Long_Integer; Total_Elems : Long_Integer := 1; Static : Boolean; Lbound, Ubound : Long_Integer; Lbound_Expr, Ubound_Expr : Names_And_Expressions.Expression; begin while not Ada_Program.Done (Ranges) loop A_Range := Ada_Program.Value (Ranges); Bounds_Utilities.Find_Range (The_Range => A_Range, Lbound => Lbound, Ubound => Ubound, Static => Static, Non_Static_Lbound => Lbound_Expr, Non_Static_Ubound => Ubound_Expr); if Static then Current_Size := Ubound - Lbound + 1; Total_Elems := Total_Elems * Current_Sie; else return Another_Object (Original_Decl); end if; Ada_Program.Next (Ranges); end loop; return Object'(A_String_Object, Original_Decl, Natural (Total_Elems)); end Actual_String_Size; function Analyze (Object_Decl : Declarations.Object_Declaration) return Object is Type_Def : Ada.Element; Type_Spec : Ada.Element; Static : Boolean; Ubound, Lbound : Long_Integer; U_Bound, L_Bound : Float; Constraint : Type_Information.Type_Constraint; begin if Declarations.Is_Subprogram_Formal (Object_Decl) or else Declarations.Is_Generic_Formal (Object_Decl) then Type_Def := Declarations.Type_Mark (Object_Decl); Type_Spec := Declarations.Type_Specification (Ada_Program.Definition (Type_Def)); else Type_Def := Declarations.Object_Type (Object_Decl); Type_Spec := Type_Information.Last_Constraint (Type_Def); end if; loop case Type_Information.Kind (Type_Spec) is when Type_Information.A_Subtype_Indication => Constraint := Type_Information.Constraint (Type_Spec); case Type_Information.Constraint_Kind (Constraint) is when Type_Information.A_Floating_Point_Constraint => Bounds_Utilities.Float_Range_Constraint_Bounds (Type_Information.Floating_Point_Constraint (Type_Spec), L_Bound, U_Bound, Static); if Static then return Object'(A_Float_Object, Object_Decl, L_Bound, U_Bound); else return Another_Object (Object_Decl); end if; when Type_Information.A_Fixed_Point_Constraint => -- currently unimplemented return Another_Object (Object_Decl); when Type_Information.A_Simple_Range => return Range_Object (Constraint, Object_Decl); when Type_Information.A_Range_Attribute => Bounds_Utilities.Integer_Range_Constraint_Bounds (Type_Spec, Lbound, Ubound, Static); if Static then return Object'(An_Integer_Object, Object_Decl, Lbound, Ubound); else return Another_Object (Object_Decl); end if; when Type_Information.An_Index_Constraint => return Actual_String_Size (Constraint, Object_Decl); when others => return Another_Object (Object_Decl); end case; when Type_Information.An_Integer_Type_Definition => Bounds_Utilities.Integer_Range_Constraint_Bounds (Type_Information.Integer_Constraint (Type_Spec), Lbound, Ubound, Static); if Static then return Object'(An_Integer_Object, Object_Decl, Lbound, Ubound); else return Another_Object (Object_Decl); end if; when Type_Information.A_Float_Type_Definition => Bounds_Utilities.Float_Range_Constraint_Bounds (Type_Information.Floating_Point_Constraint (Type_Spec), L_Bound, U_Bound, Static); if Static then return Object'(A_Float_Object, Object_Decl, L_Bound, U_Bound); else return Another_Object (Object_Decl); end if; when Type_Information.An_Array_Type_Definition => return Compute_Array (Type_Spec); when Type_Information.A_Derived_Type_Definition => Type_Spec := Type_Information.Last_Constraint (Type_Information.Derived_From (Type_Spec)); -- loop on type that was derived when Type_Information.A_Private_Type_Definition .. Type_Information.A_Limited_Private_Type_Definition => Type_Spec := Declarations.Type_Specification (Type_Spec); -- loop on private type specification when others => return Another_Object (Object_Decl); end case; end loop; exception when others => return Another_Object (Object_Decl); end Analyze; function Another_Value (Expr : Ada_Program.Element) return Value is Val : Value (Other_Value); begin Val.Expr := Expr; return Val; end Another_Value; procedure Check_Choices (List : in out Ada.Element_Iterator) is begin while not Ada.Done (List) loop case Type_Information.Choice_Kind (Ada.Value (List)) is when Type_Information.Others_Choice => raise Others_Choice_Found; when Type_Information.A_Discrete_Range => raise Others_Choice_Found; when others => null; end case; Ada.Next (List); end loop; end Check_Choices; function Compute_Aggregate (Agg : Ada.Expression) return Value is Components : Ada.Element_Iterator := Expressions.Components (Agg); Count : Natural := 0; Choices : Ada.Element_Iterator; begin while not Ada.Done (Components) loop Choices := Expressions.Component_Choices (Ada.Value (Components)); Check_Choices (Choices); Count := Count + 1; Ada.Next (Components); end loop; return Value'(An_Array_Aggregate, Agg, Count); end Compute_Aggregate; function Analyze (Value_Expression : Ada_Program.Expression) return Value is Type_Def : Type_Information.Type_Definition; Integer_Value : Long_Integer; Float_Value : Float; Static : Boolean; begin case Expressions.Kind (Value_Expression) is when Expressions.An_Integer_Literal => return Value'(An_Integer_Value, Value_Expression, Expressions.Static_Value (Value_Expression)); when Expressions.A_Real_Literal => return Value'(A_Float_Value, Value_Expression, Expressions.Static_Value (Value_Expression)); when Expressions.A_String_Literal => declare Val : constant String := Expressions.Static_Value (Value_Expression); begin return Value'(A_String_Value, Value_Expression, Val'Length); end; when Expressions.An_Aggregate => return Compute_Aggregate (Value_Expression); when others => Type_Def := Expressions.Expression_Type (Value_Expression); begin case Type_Information.Kind (Type_Information.Ground_Type (Type_Def)) is when Type_Information.An_Integer_Type_Definition => return Value'(An_Integer_Value, Value_Expression, Integer_Val (Value_Expression)); when Type_Information.A_Float_Type_Definition => return Value'(A_Float_Value, Value_Expression, Float_Val (Value_Expression)); when Type_Information.An_Array_Type_Definition => declare Val : constant String := String_Val (Value_Expression); begin return Value'(A_String_Value, Value_Expression, Val'Length); end; when others => return Another_Value (Value_Expression); end case; exception when Expression_Utilities.Not_Static => return Another_Value (Value_Expression); end; end case; exception when others => return Another_Value (Value_Expression); end Analyze; function Match (A_Value : Value; In_Object : Object) return Boolean is begin case A_Value.Kind is when A_String_Value => case In_Object.Kind is when A_String_Object => return True; when others => return False; end case; when An_Array_Aggregate => case In_Object.Kind is when An_Array_Object => return True; when others => return False; end case; when An_Integer_Value => case In_Object.Kind is when An_Integer_Object => return True; when others => return False; end case; when A_Float_Value => case In_Object.Kind is when A_Float_Object => return True; when others => return False; end case; when Other_Value => case In_Object.Kind is when Other_Object => return True; when others => return False; end case; end case; end Match; function Fits (A_Value : Value; In_Object : Object) return Boolean is begin if Match (A_Value, In_Object) then case A_Value.Kind is when A_String_Value | An_Array_Aggregate => return Length (A_Value) = Length (In_Object); when An_Integer_Value => if A_Value.Int_Value < Lower_Bound (In_Object) or else A_Value.Int_Value > Upper_Bound (In_Object) then return False; else return True; end if; when A_Float_Value => if A_Value.Flt_Value < Lower_Bound (In_Object) or else A_Value.Flt_Value > Upper_Bound (In_Object) then return False; else return True; end if; when Other_Value => return True; end case; else raise Bad_Kind; end if; end Fits; function Image (F : Float) return String is Local : String (1 .. 100); begin Float_Conversion.Put (Local, F); return String_Utilities.Strip (Local); end Image; function Problem_Description (A_Value : Value; In_Object : Object) return String is begin if Match (A_Value, In_Object) then case A_Value.Kind is when A_String_Value | An_Array_Aggregate => if Length (A_Value) /= Length (In_Object) then return "The size of the value " & Integer'Image (Length (A_Value)) & " does not match the object's length " & Integer'Image (Length (In_Object)); else return "NO PROBLEM"; end if; when An_Integer_Value => if A_Value.Int_Value > Upper_Bound (In_Object) then return "The value " & Long_Integer'Image (A_Value.Int_Value) & " exceeds the upper bound " & Long_Integer'Image (Upper_Bound (In_Object)); elsif A_Value.Int_Value < Lower_Bound (In_Object) then return "The value " & Long_Integer'Image (A_Value.Int_Value) & " is less than the lower bound " & Long_Integer'Image (Lower_Bound (In_Object)); else return "NO PROBLEM"; end if; when A_Float_Value => if A_Value.Flt_Value < Lower_Bound (In_Object) then return "The value " & Image (A_Value.Flt_Value) & " is less than the lower bound " & Image (Lower_Bound (In_Object)); elsif A_Value.Flt_Value > Upper_Bound (In_Object) then return "The value " & Image (A_Value.Flt_Value) & " exceeds the upper bound " & Image (Upper_Bound (In_Object)); else return "NO PROBLEM"; end if; when Other_Value => return ""; end case; else return "BAD MATCH"; end if; end Problem_Description; function Lower_Bound (Of_Integer_Or_String_Object : Object) return Long_Integer is begin case Of_Integer_Or_String_Object.Kind is when A_String_Object | An_Integer_Object | An_Array_Object => return Of_Integer_Or_String_Object.Lower_Bound; when others => raise Bad_Kind; end case; end Lower_Bound; function Upper_Bound (Of_Integer_Or_String_Object : Object) return Long_Integer is begin case Of_Integer_Or_String_Object.Kind is when A_String_Object | An_Integer_Object | An_Array_Object => return Of_Integer_Or_String_Object.Upper_Bound; when others => raise Bad_Kind; end case; end Upper_Bound; function Lower_Bound (Of_Float_Object : Object) return Float is begin case Of_Float_Object.Kind is when A_Float_Object => return Of_Float_Object.Lower_Flt_Bound; when others => raise Bad_Kind; end case; end Lower_Bound; function Upper_Bound (Of_Float_Object : Object) return Float is begin case Of_Float_Object.Kind is when A_Float_Object => return Of_Float_Object.Upper_Flt_Bound; when others => raise Bad_Kind; end case; end Upper_Bound; function Length (Of_String_Or_Array_Object : Object) return Natural is begin case Of_String_Or_Array_Object.Kind is when A_String_Object | An_Array_Object => return Of_String_Or_Array_Object.Size; when others => raise Bad_Kind; end case; end Length; function Length (Of_String_Or_Array_Aggregate : Value) return Natural is begin case Of_String_Or_Array_Aggregate.Kind is when A_String_Value | An_Array_Aggregate => return Of_String_Or_Array_Aggregate.Size; when others => raise Bad_Kind; end case; end Length; function Static_Value (Of_Integer_Value_Or_Constant : Value) return Long_Integer is begin case Of_Integer_Value_Or_Constant.Kind is when An_Integer_Value => return Of_Integer_Value_Or_Constant.Int_Value; when others => raise Bad_Kind; end case; end Static_Value; function Static_Value (Of_Float_Value_Or_Constant : Value) return Float is begin case Of_Float_Value_Or_Constant.Kind is when A_Float_Value => return Of_Float_Value_Or_Constant.Flt_Value; when others => raise Bad_Kind; end case; end Static_Value; end Constraint_Utilities;
nblk1=1f nid=0 hdr6=3e [0x00] rec0=20 rec1=00 rec2=01 rec3=034 [0x01] rec0=1a rec1=00 rec2=1e rec3=00a [0x02] rec0=00 rec1=00 rec2=02 rec3=01c [0x03] rec0=1a rec1=00 rec2=03 rec3=032 [0x04] rec0=01 rec1=00 rec2=1f rec3=006 [0x05] rec0=1a rec1=00 rec2=04 rec3=00c [0x06] rec0=01 rec1=00 rec2=1d rec3=02a [0x07] rec0=15 rec1=00 rec2=05 rec3=01e [0x08] rec0=19 rec1=00 rec2=06 rec3=020 [0x09] rec0=13 rec1=00 rec2=07 rec3=070 [0x0a] rec0=00 rec1=00 rec2=1c rec3=002 [0x0b] rec0=1b rec1=00 rec2=08 rec3=038 [0x0c] rec0=00 rec1=00 rec2=1b rec3=01e [0x0d] rec0=13 rec1=00 rec2=09 rec3=004 [0x0e] rec0=13 rec1=00 rec2=0a rec3=008 [0x0f] rec0=13 rec1=00 rec2=0b rec3=026 [0x10] rec0=13 rec1=00 rec2=0c rec3=000 [0x11] rec0=1e rec1=00 rec2=0d rec3=02c [0x12] rec0=1a rec1=00 rec2=0e rec3=046 [0x13] rec0=01 rec1=00 rec2=1a rec3=004 [0x14] rec0=12 rec1=00 rec2=0f rec3=078 [0x15] rec0=15 rec1=00 rec2=10 rec3=008 [0x16] rec0=1d rec1=00 rec2=11 rec3=048 [0x17] rec0=22 rec1=00 rec2=12 rec3=03c [0x18] rec0=1a rec1=00 rec2=13 rec3=038 [0x19] rec0=18 rec1=00 rec2=14 rec3=002 [0x1a] rec0=11 rec1=00 rec2=15 rec3=000 [0x1b] rec0=1c rec1=00 rec2=16 rec3=020 [0x1c] rec0=1e rec1=00 rec2=17 rec3=008 [0x1d] rec0=1d rec1=00 rec2=18 rec3=048 [0x1e] rec0=14 rec1=00 rec2=19 rec3=000 tail 0x217002460815c65cf283f 0x42a00088462061e03