|
|
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: 9216 (0x2400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Sequential_Io, seg_04ba70
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with File_Support;
use File_Support;
with Safe_Support;
with System;
with A_Strings;
with Memory;
with Unchecked_Conversion;
package body Sequential_Io is
pragma Suppress (Access_Check);
pragma Suppress (Discriminant_Check);
pragma Suppress (Index_Check);
pragma Suppress (Length_Check);
pragma Suppress (Range_Check);
pragma Suppress (Division_Check);
pragma Suppress (Elaboration_Check);
Elem_Size : Integer;
Bits_Per_Byte : constant := 8;
function Mode_Of (Mode : File_Mode) return File_Support.File_Mode is
begin
case Mode is
when In_File =>
return Input;
when Out_File =>
return Output;
end case;
end Mode_Of;
procedure Reject_Null_File (File : File_Type) is
begin
if File = null then
raise Status_Error;
end if;
end Reject_Null_File;
-- pragma inline(reject_null_file);
-- file management
-- No file locking. file can't be referenced until create() returns.
procedure Create (File : in out File_Type;
Mode : in File_Mode := Out_File;
Name : in String := "";
Form : in String := "") is
Fmode : File_Support.File_Mode := Mode_Of (Mode);
begin
-- Upon entry/exit: file is unlocked for the following two calls
File_Open (Name, File_Ptr (File), Fmode, True,
Form, Sequential, Elem_Size);
File_Support.Setup_Buffer (File_Ptr (File), Elem_Size);
end Create;
-- No file locking. file can't be referenced until open() returns.
procedure Open (File : in out File_Type;
Mode : in File_Mode;
Name : in String;
Form : in String := "") is
Fmode : File_Support.File_Mode := Mode_Of (Mode);
begin
-- Upon entry/exit: file is unlocked for the following two calls
File_Open (Name, File_Ptr (File), Fmode, False, Form, Sequential);
File_Support.Setup_Buffer (File_Ptr (File), Elem_Size);
end Open;
procedure Close (File : in out File_Type) is
begin
Reject_Null_File (File);
Safe_Support.File_Lock (File_Ptr (File));
File_Close (File_Ptr (File)); -- upon return, file is unlocked
File := null;
end Close;
procedure Delete (File : in out File_Type) is
begin
Reject_Null_File (File);
Safe_Support.File_Lock (File_Ptr (File));
File_Delete (File_Ptr (File)); -- upon return, file is unlocked
File := null;
end Delete;
procedure Reset (File : in out File_Type; Mode : in File_Mode) is
Fmode : File_Support.File_Mode := Mode_Of (Mode);
begin
Safe_Support.File_Lock (File_Ptr (File));
Reject_Null_File (File);
File_Reset (File_Ptr (File), Fmode);
Safe_Support.File_Unlock (File_Ptr (File));
exception
when others =>
Safe_Support.File_Unlock (File_Ptr (File));
raise;
end Reset;
procedure Reset (File : in out File_Type) is
begin
Safe_Support.File_Lock (File_Ptr (File));
Reject_Null_File (File);
File_Reset (File_Ptr (File), File.Mode);
Safe_Support.File_Unlock (File_Ptr (File));
exception
when others =>
Safe_Support.File_Unlock (File_Ptr (File));
raise;
end Reset;
function Mode (File : in File_Type) return File_Mode is
begin
Reject_Null_File (File);
case File.Mode is
when Input =>
return In_File;
when Output =>
return Out_File;
when others =>
null;
end case;
end Mode;
function Name (File : in File_Type) return String is
use A_Strings;
begin
Reject_Null_File (File);
if File.Name = null then
return "";
else
return File.Name.S;
end if;
end Name;
function Form (File : in File_Type) return String is
use A_Strings;
begin
Reject_Null_File (File);
if File.Form = null then
return "";
end if;
return File.Form.S;
end Form;
function Is_Open (File : in File_Type) return Boolean is
begin
return File /= null;
end Is_Open;
-- input and output operations
procedure Read (File : in File_Type; Item : out Element_Type) is
Actual, Desired : Integer;
begin
Safe_Support.File_Lock (File_Ptr (File));
Reject_Null_File (File);
if File.Mode = Output then
raise Mode_Error;
end if;
Desired := Item'Size / Bits_Per_Byte;
Actual := Read (File.Fd, Item'Long_Address, Desired);
if Actual /= Item'Size / Bits_Per_Byte then
File.Pagelength := Actual;
raise End_Error;
end if;
if not Element_Type'Constrained then
Skip_In_File (File.Fd, Elem_Size - Desired);
end if;
Safe_Support.File_Unlock (File_Ptr (File));
exception
when others =>
Safe_Support.File_Unlock (File_Ptr (File));
raise;
end Read;
procedure Copy (From, To : System.Long_Address; Bytes : Integer) is
type Buffer is array (1 .. Bytes) of Character;
type Acc_Buf is access Buffer;
pragma Remote_Access (Acc_Buf);
function To_Acc is new Unchecked_Conversion
(System.Long_Address, Acc_Buf);
begin
To_Acc (To).all := To_Acc (From).all;
end Copy;
procedure Write (File : in File_Type; Item : in Element_Type) is
This_Elem_Size : Integer := Item'Size / Bits_Per_Byte;
Item_Addr : System.Long_Address;
begin
Safe_Support.File_Lock (File_Ptr (File));
Reject_Null_File (File);
if File.Mode = Input then
raise Mode_Error;
end if;
if This_Elem_Size < Elem_Size then
-- copy item into buffer, to fill out waste space.
Item_Addr := File.Buffer.Elem'Long_Address;
Copy (Item'Long_Address, Item_Addr, This_Elem_Size);
else
Item_Addr := Item'Long_Address;
end if;
Write (File.Fd, Item_Addr, Elem_Size);
Safe_Support.File_Unlock (File_Ptr (File));
exception
when others =>
Safe_Support.File_Unlock (File_Ptr (File));
raise;
end Write;
function End_Of_File (File : in File_Type) return Boolean is
Result : Boolean;
begin
Safe_Support.File_Lock (File_Ptr (File));
Reject_Null_File (File);
if File.Mode = Output then
raise Mode_Error;
end if;
-- check for end of file
Result := File_Eof (File_Ptr (File));
Safe_Support.File_Unlock (File_Ptr (File));
return Result;
exception
when others =>
Safe_Support.File_Unlock (File_Ptr (File));
raise;
end End_Of_File;
begin
Elem_Size := Element_Type'Size / Bits_Per_Byte;
if not Element_Type'Constrained then
if Elem_Size > System.Max_Rec_Size or else Elem_Size <= 0 then
Elem_Size := System.Max_Rec_Size;
end if;
end if;
exception
when Numeric_Error | Constraint_Error =>
Elem_Size := System.Max_Rec_Size;
end Sequential_Io;
nblk1=8
nid=0
hdr6=10
[0x00] rec0=27 rec1=00 rec2=01 rec3=046
[0x01] rec0=18 rec1=00 rec2=02 rec3=042
[0x02] rec0=1a rec1=00 rec2=03 rec3=058
[0x03] rec0=22 rec1=00 rec2=04 rec3=01c
[0x04] rec0=24 rec1=00 rec2=05 rec3=05a
[0x05] rec0=1a rec1=00 rec2=06 rec3=064
[0x06] rec0=1c rec1=00 rec2=07 rec3=02e
[0x07] rec0=18 rec1=00 rec2=08 rec3=000
tail 0x21750c0fe86843ba18fc3 0x42a00088462060003