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

⟦35e356f98⟧ Ada Source

    Length: 8192 (0x2000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Interchange, seg_0244c4

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 Bit_Ops;
with Mac_Types;
with Communications;
with Mac_Text;
package body Interchange is

-- R1000 RPC interchange package for Unix C

    use Bit_Ops;
    procedure Put_Short (A_Connection : in out Communications.Connection;
                         Value : Mac_Types.Integer) is

        Buf : Communications.Bytearray (0 .. 1);
    begin
        Buf (0) := Mac_Types.Byte ((Value / 256) and 8#377#);
        Buf (1) := Mac_Types.Byte (Value and 8#377#);
        Communications.Write (A_Connection, Buf);
    end Put_Short;

    procedure Get_Short (A_Connection : in out Communications.Connection;
                         Value : out Mac_Types.Integer) is

        Buf : Communications.Bytearray (0 .. 1);
        Read_Count : Natural;

    begin
        Communications.Read (A_Connection, Buf);
        Value := Mac_Types.Integer (Buf (0)) * 256 +
                    Mac_Types.Integer (Buf (1));
    end Get_Short;


    procedure Put_Int (A_Connection : in out Communications.Connection;
                       Value : Mac_Types.Longint) is   -- 32 bit signed, 4 bytes

        Buf : Communications.Bytearray (0 .. 3);
    begin
        Buf (0) := Mac_Types.Byte ((Value / (2 ** 24)) and 8#377#);
        Buf (1) := Mac_Types.Byte ((Value / (2 ** 16)) and 8#377#);
        Buf (2) := Mac_Types.Byte ((Value / (2 ** 8)) and 8#377#);
        Buf (3) := Mac_Types.Byte (Value and 8#377#);
        Communications.Write (A_Connection, Buf);
    end Put_Int;

    procedure Get_Int (A_Connection : in out Communications.Connection;
                       Value : out Mac_Types.Longint) is

        Buf : Communications.Bytearray (0 .. 3);
        Read_Count : Natural;

    begin
        Communications.Read (A_Connection, Buf);
        Value :=
           ((Mac_Types.Longint (Buf (0)) * 256 + Mac_Types.Longint (Buf (1))) *
            256 + Mac_Types.Longint (Buf (2))) * 256 +
           Mac_Types.Longint (Buf (3));
    end Get_Int;

    procedure Put_Bool (A_Connection : in out Communications.Connection;
                        Value : Boolean) is

    begin
        if Value then
            Put_Short (A_Connection, 1);
        else
            Put_Short (A_Connection, 0);
        end if;
    end Put_Bool;

    procedure Get_Bool (A_Connection : in out Communications.Connection;
                        Value : out Boolean) is
        I : Mac_Types.Integer;
    begin
        Get_Short (A_Connection, I);
        Value := I /= 0;
    end Get_Bool;

    procedure Put_Text (A_Connection : in out Communications.Connection;
                        Value : in Mac_Text.Text) is
        Text_Length : Mac_Text.Index;
    begin
        Text_Length := Mac_Text.Length (Value);
        Put_Int (A_Connection, Text_Length);
        if Text_Length > 0 then
            declare
                Buf : Communications.Bytearray (1 .. Text_Length);
                Extra : Communications.Bytearray (1 .. 1) := (others => 0);
            begin
                for I in 1 .. Text_Length loop
                    Buf (I) := Mac_Types.Char'Pos (Mac_Text.Value (I, Value));
                end loop;
                Communications.Write (A_Connection, Buf);
                if Text_Length mod 2 /= 0 then
                    Communications.Write (A_Connection, Extra);
                end if;
            end;
        end if;
    end Put_Text;

    procedure Get_Text (A_Connection : in out Communications.Connection;
                        Value : in out Mac_Text.Text) is

        Length : Mac_Types.Longint;
        Remaining : Mac_Types.Longint;
        Load : Mac_Types.Longint;

    begin
        Get_Int (A_Connection, Length);
        Mac_Text.Set_Empty (Value);
        if Length = 0 then
            return;
        end if;
        if Length <= Mac_Text.Maximum_Length (Value) then
            declare
                Buf : Communications.Bytearray (1 .. Length);
            begin
                Communications.Read (A_Connection, Buf);
                for I in 1 .. Length loop
                    Mac_Text.Append (Mac_Types.Char'Val (Buf (I)), Value);
                end loop;
            end;
        else
            -- Must truncate string
            declare
                Buf : Communications.Bytearray
                         (1 .. Mac_Text.Maximum_Length (Value));

            begin
                Communications.Read (A_Connection, Buf);
                for I in 1 .. Mac_Text.Maximum_Length (Value) loop
                    Mac_Text.Append (Mac_Types.Char'Val (Buf (I)), Value);
                end loop;
            end;

            Remaining := Length - Mac_Text.Maximum_Length (Value);
            while Remaining > 0 loop
                if Remaining > 256 then
                    Load := 256;
                else
                    Load := Remaining;
                end if;
                declare
                    Buf : Communications.Bytearray (1 .. Load);

                begin
                    Communications.Read (A_Connection, Buf);
                end;
                Remaining := Remaining - Load;
            end loop;
        end if;
        if Length mod 2 /= 0 then
            declare
                Buf : Communications.Bytearray (1 .. 1);

            begin
                Communications.Read (A_Connection, Buf);
            end;
        end if;
    end Get_Text;

end Interchange;

E3 Meta Data

    nblk1=7
    nid=6
    hdr6=c
        [0x00] rec0=22 rec1=00 rec2=01 rec3=02c
        [0x01] rec0=17 rec1=00 rec2=07 rec3=044
        [0x02] rec0=1f rec1=00 rec2=02 rec3=02c
        [0x03] rec0=1c rec1=00 rec2=03 rec3=030
        [0x04] rec0=1a rec1=00 rec2=05 rec3=018
        [0x05] rec0=15 rec1=00 rec2=04 rec3=000
        [0x06] rec0=80 rec1=80 rec2=80 rec3=404
    tail 0x2171f83dc839c6b800fc5 0x42a00088462060003
Free Block Chain:
  0x6: 0000  00 00 02 38 80 10 20 20 20 20 20 20 20 20 20 64  ┆   8           d┆