DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 10553 (0x2939) Types: TextFile Names: »B«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2 └─ ⟦77aa8350c⟧ »DATA« └─⟦f794ecd1d⟧ └─⟦4c85d69e2⟧ └─⟦this⟧
-- The use of this system is subject to the software license terms and -- conditions agreed upon between Rational and the Customer. -- -- Copyright 1988 by Rational. -- -- RESTRICTED RIGHTS LEGEND -- -- Use, duplication, or disclosure by the Government is subject to -- restrictions as set forth in subdivision (b)(3)(ii) of the Rights in -- Technical Data and Computer Software clause at 52.227-7013. -- -- -- Rational -- 3320 Scott Boulevard -- Santa Clara, California 95054-3197 -- -- PROPRIETARY AND CONFIDENTIAL INFORMATION OF RATIONAL; -- USE OR COPYING WITHOUT EXPRESS WRITTEN AUTHORIZATION -- IS STRICTLY PROHIBITED. THIS MATERIAL IS PROTECTED AS -- AN UNPUBLISHED WORK UNDER THE U.S. COPYRIGHT ACT OF -- 1976. CREATED 1988. ALL RIGHTS RESERVED. -- -- with System; with System_Types; with Unchecked_Conversion; with Io_Exception_Flavors; with Typed_Io_Support; with Device_Independent_Io; pragma Elaborate (Typed_Io_Support); pragma Elaborate (Device_Independent_Io); package body Direct_Io is package Iof renames Io_Exception_Flavors; package Dio renames Device_Independent_Io; package Tio renames Typed_Io_Support; function Tio_File_Type is new Unchecked_Conversion (File_Type, Typed_Io_Support.File_Type); function External_File_Type is new Unchecked_Conversion (Typed_Io_Support.File_Type, File_Type); subtype Byte_String is System_Types.Byte_String; Item_Size : Natural; -- number of bytes for an object of Element_Type -- logically constant (Element_Type'Size + 7) / 8; -- but may raise numeric error, so initialized in statement list Items_Too_Large : Boolean := False; -- object of Element_Type too large Items_Constrained : constant Boolean := Element_Type'Constrained; Xchng : constant array (File_Mode) of Dio.File_Mode := (In_File => Dio.In_File, Inout_File => Dio.Inout_File, Out_File => Dio.Out_File); \f procedure Create (File : in out File_Type; Mode : File_Mode := Inout_File; Name : String := ""; Form : String := "") is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Create (F, Xchng (Mode), Name, Form); File := External_File_Type (F); end Create; procedure Open (File : in out File_Type; Mode : File_Mode; Name : String; Form : String := "") is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Open (F, Xchng (Mode), Name, Form); File := External_File_Type (F); end Open; procedure Close (File : in out File_Type) is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Close (F); File := External_File_Type (F); end Close; procedure Delete (File : in out File_Type) is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Delete (F); File := External_File_Type (F); end Delete; procedure Reset (File : in out File_Type; Mode : File_Mode) is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Reset (F, Xchng (Mode)); File := External_File_Type (F); end Reset; procedure Reset (File : in out File_Type) is F : Tio.File_Type := Tio_File_Type (File); begin Tio.Reset (F); File := External_File_Type (F); end Reset; function Mode (File : File_Type) return File_Mode is begin case Tio.Mode (Tio_File_Type (File)) is when Dio.In_File => return In_File; when Dio.Inout_File => return Inout_File; when Dio.Out_File => return Out_File; when Dio.Closed => raise Status_Error; end case; end Mode; function Name (File : File_Type) return String is begin return Tio.Name (Tio_File_Type (File)); end Name; function Form (File : File_Type) return String is begin return Tio.Form (Tio_File_Type (File)); end Form; function Is_Open (File : File_Type) return Boolean is begin return Tio.Is_Open (Tio_File_Type (File)); end Is_Open; function End_Of_File (File : File_Type) return Boolean is begin return Tio.End_Of_File (Tio_File_Type (File)); end End_Of_File; function Index (For_Item : Positive_Count) return Tio.Byte_Count is begin return Tio.Byte_Count (Item_Size * Natural (For_Item - 1)); end Index; procedure Read (File : File_Type; Item : out Element_Type; From : Positive_Count) is This_Item_Size : constant Natural := (Item'Size + 7) / 8; subtype Item_As_Byte_String is Byte_String (1 .. Item_Size); type Item_Ptr is access Item_As_Byte_String; for Item_Ptr'Storage_Size use 0; -- suppress collection function Convert is new Unchecked_Conversion (System.Address, Item_Ptr); begin if Items_Constrained or else This_Item_Size = Item_Size then declare Item_Bs : constant Item_Ptr := Convert (Item'Address); begin Tio.Read (Tio_File_Type (File), Item_Bs.all, Index (From), Items_Constrained); end; elsif not Items_Too_Large then declare Unconstrained_Item : Element_Type; Unconstrained_Item_Bs : constant Item_Ptr := Convert (Unconstrained_Item'Address); begin Tio.Read (Tio_File_Type (File), Unconstrained_Item_Bs.all, Index (From), Items_Constrained); Item := Unconstrained_Item; end; else raise Data_Error; end if; end Read; procedure Read (File : File_Type; Item : out Element_Type) is This_Item_Size : constant Natural := (Item'Size + 7) / 8; subtype Item_As_Byte_String is Byte_String (1 .. Item_Size); type Item_Ptr is access Item_As_Byte_String; for Item_Ptr'Storage_Size use 0; -- suppress collection function Convert is new Unchecked_Conversion (System.Address, Item_Ptr); begin if Items_Constrained or else This_Item_Size = Item_Size then declare Item_Bs : constant Item_Ptr := Convert (Item'Address); begin Tio.Read (Tio_File_Type (File), Item_Bs.all, Tio.Use_Current_Index, Items_Constrained); end; elsif not Items_Too_Large then declare Unconstrained_Item : Element_Type; Unconstrained_Item_Bs : constant Item_Ptr := Convert (Unconstrained_Item'Address); begin Tio.Read (Tio_File_Type (File), Unconstrained_Item_Bs.all, Tio.Use_Current_Index, Items_Constrained); Item := Unconstrained_Item; end; else raise Data_Error; end if; end Read; procedure Write (File : File_Type; Item : Element_Type; To : Positive_Count) is This_Item_Size : constant Natural := (Item'Size + 7) / 8; subtype Item_As_Byte_String is Byte_String (1 .. Item_Size); type Item_Ptr is access Item_As_Byte_String; for Item_Ptr'Storage_Size use 0; -- suppress collection function Convert is new Unchecked_Conversion (System.Address, Item_Ptr); begin if Items_Constrained or else This_Item_Size = Item_Size then declare Item_Bs : constant Item_Ptr := Convert (Item'Address); begin Tio.Write (Tio_File_Type (File), Item_Bs.all, Index (To)); end; elsif not Items_Too_Large then declare Unconstrained_Item : Element_Type := Item; Unconstrained_Item_Bs : constant Item_Ptr := Convert (Unconstrained_Item'Address); begin Tio.Write (Tio_File_Type (File), Unconstrained_Item_Bs.all, Index (To)); end; else raise Use_Error; end if; end Write; procedure Write (File : File_Type; Item : Element_Type) is This_Item_Size : constant Natural := (Item'Size + 7) / 8; subtype Item_As_Byte_String is Byte_String (1 .. Item_Size); type Item_Ptr is access Item_As_Byte_String; for Item_Ptr'Storage_Size use 0; -- suppress collection function Convert is new Unchecked_Conversion (System.Address, Item_Ptr); begin if Items_Constrained or else This_Item_Size = Item_Size then declare Item_Bs : constant Item_Ptr := Convert (Item'Address); begin Tio.Write (Tio_File_Type (File), Item_Bs.all, Tio.Use_Current_Index); end; elsif not Items_Too_Large then declare Unconstrained_Item : Element_Type := Item; Unconstrained_Item_Bs : constant Item_Ptr := Convert (Unconstrained_Item'Address); begin Tio.Write (Tio_File_Type (File), Unconstrained_Item_Bs.all, Tio.Use_Current_Index); end; else raise Use_Error; end if; end Write; procedure Set_Index (File : File_Type; To : Positive_Count) is begin Tio.Set_Index (Tio_File_Type (File), Index (To)); end Set_Index; function Index (File : File_Type) return Positive_Count is begin return Positive_Count (Natural (Tio.Index (Tio_File_Type (File)) / Item_Size) + 1); end Index; function Size (File : File_Type) return Count is begin return Count (Natural (Tio.Size (Tio_File_Type (File))) / Item_Size); end Size; begin Item_Size := (Element_Type'Size + 7) / 8; exception when Constraint_Error | Numeric_Error => if not Items_Constrained then Item_Size := Natural'Last; Items_Too_Large := True; end if; end Direct_Io;