DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

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 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ B T

⟦199997e65⟧ TextFile

    Length: 17241 (0x4359)
    Types: TextFile
    Names: »B«

Derivation

└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
    └─ ⟦77aa8350c⟧ »DATA« 
        └─⟦f794ecd1d⟧ 
            └─⟦4c85d69e2⟧ 
                └─⟦this⟧ 

TextFile

--    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 Literal_Parser;
with Numeric_Literals;
with Integer_Conversions;

with Primitive_Io;  -- For debugging only

separate (Common_Text_Io)

package body Integer_Io is


    -- This constant should be large enough so that all but really wierd
    -- integer-valued numeric literals will fit in this many characters.
    Default_Numeric_Literal_Max_Length : constant := 20;

    -- procedure Pput (S : in String;
    --                 Abosrb_Output : Boolean :=
    --                    Primitive_Io.Global_Absorb_Output)
    --     renames Primitive_Io.Put_Line;

    -----------------------------------------------------------------
    -- Visible procedure to GET an INTEGER from a file:
    -- This is the routine of RM 14.3.7 (5-8), except only for
    -- SYSTEM_TYPES.LONG_INTEGER, which one hopes is the longest
    -- integer available on the target:
    --
    -- If the value of the parameter WIDTH is zero, skips any leading
    -- blanks, line terminators, or page terminators, then reads a
    -- plus or a minus sign if present, then reads according to the
    -- syntax of an integer literal (which may be a based literal).
    -- If a nonzero value of WIDTH is supplied, then exactly WIDTH
    -- characters are input, or the characters (possibly none) up to
    -- a line terminator, whichever comes first; any skipped leading
    -- blanks are included in the count.  Returns, in the parameter
    -- ITEM, the value of type LONG_INTEGER that corresponds to the
    -- sequence input.  The exception DATA_ERROR is raised if the
    -- sequence input does not have the required syntax or if the
    -- value obtained is not of the type LONG_INTEGER.
    -----------------------------------------------------------------

    procedure Get (File  : in  File_Type;
                   Item  : out Long_Integer;
                   Width : in  Field) is

        S : Input_State renames State_Handling.Get_Input_State (File).all;
        B : Buffering.Data_Buffer := Dio.Get (File);
        Numeric_Literal_Max_Length : Natural :=
           Default_Numeric_Literal_Max_Length;
        Status : Literal_Parser.Parse_Status;
        Last : Natural;

        function "=" (L, R : Literal_Parser.Parse_Status) return Boolean
            renames Literal_Parser."=";

    begin

        -- If Width = 0 then the syntax of the input determines how
        -- many characters are read, that is, read until you can't
        -- add the character to a numeric literal.  If Width > 0 then
        -- exactly that many characters or until end-of-line, whichever
        -- comes first must be read and must be a valid numeric literal.

        if Width = 0 then
            -- Pput ("Cti.Integer_Io.Get(file) with Width = 0");
            <<Force_Reparse>> null;
            declare
                Result : Numeric_Literals.Numeric_Literal
                            (Max_Length => Numeric_Literal_Max_Length);
            begin
                loop
                    Next_Buffer (File, S, B);
                    -- ^ Can raise End_Error here

                    declare
                        N : constant Natural := B.Head - B.Tail + 1;  
                        S : String (1 .. N);  
                    begin
                        -- Too bad we seem to need a copy here!
                        if N > 0 then  
                            Machine_Primitive_Operations.Move_Bytes
                               (B.Buffer (B.Tail .. B.Max_Length), S, N);
                        end if;  
                        Literal_Parser.Parse_Numeric_Literal  
                           (Source         => S,  
                            Integral       => True,  
                            Result         => Result,  
                            Status         => Status,  
                            Last_Of_Source => Last);
                    exception
                        when Constraint_Error =>
                            -- Pput
                            --    ("Cti.Integer_Io.Get(file) Parse_Numeric_Literal raised Constraint_Error");
                            Status := Literal_Parser.Syntax_Error;  
                        when Numeric_Error =>
                            -- Pput
                            --    ("Cti.Integer_Io.Get(file) Parse_Numeric_Literal raised Numeric_Error");
                            Status := Literal_Parser.Syntax_Error;  
                        when others =>
                            -- Pput
                            --    ("Cti.Integer_Io.Get(file) Parse_Numeric_Literal raised some exception");
                            Status := Literal_Parser.Syntax_Error;  
                    end;
                    -- Check to see if a valid but unusually long numeric
                    -- literal was read from the current buffer.  If so,
                    -- then we need to reallocate the Numeric_Literal and
                    -- try to parse it again.
                    if Status = Literal_Parser.Numeric_Literal_Too_Short then
                        Numeric_Literal_Max_Length := Result.L;
                        goto Force_Reparse;
                    end if;
                    -- Since we're in a copy of the source, the following line
                    -- won't work anymore:
                    -- Buffering.Consume (B, Last - B.Tail + 1);
                    Buffering.Consume (B, Last);  
                    exit when Status /= Literal_Parser.Empty_Field;

                    -- Pput ("Cti.Integer_Io.Get(file) Empty_Field");
                    -- Here we may have to skip a terminator next
                    if not Buffering.Is_Empty (B) then  
                        declare  
                            C : Character := Buffering.Peek (B);  
                        begin  
                            if C = Line_Terminator then
                                -- Pput
                                --    ("Cti.Integer_Io.Get(file) skipping line terminator");
                                Buffering.Consume (B, 1);  
                                New_Line (S);  
                            elsif C = Page_Terminator then
                                -- Pput
                                --    ("Cti.Integer_Io.Get(file) skipping page terminator");
                                Buffering.Consume (B, 1);  
                                if not Buffering.Is_Empty (B) then
                                    C := Buffering.Peek (B);
                                    if C = Line_Terminator then
                                        Buffering.Consume (B, 1);
                                    end if;
                                end if;

                                New_Page (S);  
                            else
                                -- and if it isn't a terminator ?????????
                                -- Pput ("Cti.Integer_Io.Get(file) have " &
                                --       Character'Image (C) &
                                --      " as separator, which is invalid");
                                raise Data_Error;  
                            end if;  
                        end;  
                    end if;
                end loop;

                case Status is
                    when Literal_Parser.Ok =>
                        -- Pput ("Cti.Integer_Io.Get(file) Ok");
                        declare
                            Xxx : Long_Integer;
                        begin
                            Xxx := Integer_Conversions.Value (Result);
                            -- Pput ("Cti.Integer_Io.Get result is " &
                            --       Long_Integer'Image (Xxx));
                            Item := Xxx;
                        exception
                            when Constraint_Error | Numeric_Error =>
                                -- Pput
                                --   ("Cti.Integer_Io.Get(file) Numeric_Conversions.Value raised exception");
                                raise Iof.Input_Value_Error;
                        end;  
                    when Literal_Parser.Syntax_Error =>
                        -- Pput ("Cti.Integer_Io.Get(file) Syntax_Error");
                        raise Iof.Input_Syntax_Error;
                    when Literal_Parser.Empty_Field =>
                        -- Pput ("Cti.Integer_Io.Get(file) Empty_Field");
                        raise Data_Error;
                        -- How can this happen?
                    when Literal_Parser.Numeric_Literal_Too_Short =>
                        -- Already taken care of elsewhere
                        null;
                end case;
            end;
        else

            -- if not Primitive_Io.Absorb_Output then
            -- Pput ("Cti.Integer_Io.Get(file) Width =" & Field'Image (Width));
            -- end if;

            declare  
                Result : Numeric_Literals.Numeric_Literal (Max_Length => Width);
                Buffer : String (1 .. Width);
                Buffer_Filled : Natural;
                Eol, Eop, Eof : Boolean;
            begin

                Get_A_Line (File, S, Buffer, Buffer_Filled,
                            False,  -- don't skip terminators
                            Eol, Eop, Eof);
                -- ^ Can raise End_Error

                Literal_Parser.Parse_Numeric_Literal
                   (Source         => Buffer (1 .. Buffer_Filled),
                    Integral       => True,
                    Result         => Result,
                    Status         => Status,
                    Last_Of_Source => Last);

                case Status is
                    -- If we get this far, we will only return a value or raise
                    -- Data_Error, as per the Ada LRM.
                    when Literal_Parser.Ok =>
                        -- Pput ("Cti.Integer_Io.Get(file) Ok");
                        -- Make sure the entire value was read.  Any trailing
                        -- junk, including spaces, causes Data_Error.
                        if Last /= Buffer_Filled then
                            -- Pput
                            --    ("Cti.Integer_Io.Get(file) except didn't ready everything");
                            raise Iof.Input_Syntax_Error;
                        end if;
                        declare
                            Xxx : Long_Integer;
                        begin
                            Xxx := Integer_Conversions.Value (Result);
                            -- Pput ("Cti.Integer_Io.Get result is " &
                            --       Long_Integer'Image (Xxx));
                            Item := Xxx;
                        exception
                            when Constraint_Error | Numeric_Error =>
                                -- Pput
                                --    ("Cti.Integer_Io.Get(file) Numeric_Conversions.Value raised exception");
                                raise Iof.Input_Value_Error;
                        end;
                    when Literal_Parser.Empty_Field =>
                        -- Pput ("Cti.Integer_Io.Get(file) Empty Field 2");
                        raise Iof.Input_Syntax_Error;
                    when Literal_Parser.Syntax_Error =>
                        -- Pput ("Cti.Integer_Io.Get(file) Syntax Error 2");
                        raise Iof.Input_Syntax_Error;
                    when Literal_Parser.Numeric_Literal_Too_Short =>
                        -- Pput ("Cti.Integer_Io.Get(file) Too short?");
                        -- Can't really happen!
                        raise Data_Error;
                end case;
            end;
        end if;

        Dio.Release (File);
    exception
        when others =>
            Dio.Release (File);
            raise;
    end Get;


    -----------------------------------------------------------------
    -- Visible procedure GET an INTEGER from a STRING:
    -- This procedure reads an Integer from a string, as described in
    -- RM 14.3.7 (13-15), except that it always reads a Long_Integer.
    -- One hopes that Long_Integer is the highest-precision integer
    -- type on the machine.
    -----------------------------------------------------------------

    procedure Get (From : in  String;
                   Item : out Long_Integer;
                   Last : out Positive) is

        Result : Numeric_Literals.Numeric_Literal (Max_Length => From'Length);
        Status : Literal_Parser.Parse_Status;
        Last_Of_Source : Natural;

    begin
        -- if not Primitive_Io.Absorb_Output then
        --     Pput ("Cti.Integer_Io.Get(string) from '" & From & ''');
        -- end if;
        Literal_Parser.Parse_Numeric_Literal (Source         => From,
                                              Integral       => True,
                                              Result         => Result,
                                              Status         => Status,
                                              Last_Of_Source => Last_Of_Source);

        case Status is
            when Literal_Parser.Ok =>
                -- Pput ("Cti.Integer_Io.Get(string) Ok");
                begin
                    Item := Integer_Conversions.Value (Result);
                exception
                    when Constraint_Error | Numeric_Error =>
                        -- Pput
                        --    ("Cti.Integer_Io.Get(string) Numeric_Conversions.Value raised exception");
                        raise Iof.Input_Value_Error;
                end;
                -- if not Primitive_Io.Absorb_Output then
                --     Pput ("Cti.Integer_Io.Get(string) Converted to " &
                --           Long_Integer'Image (Numeric_Conversions.Value
                --                                  (Result)));
                -- end if;
                Last := Last_Of_Source;
                return;

            when Literal_Parser.Empty_Field =>
                -- Pput ("Cti.Integer_Io.Get(string) Empty_Field");
                raise End_Error;

            when Literal_Parser.Syntax_Error =>
                -- Pput ("Cti.Integer_Io.Get(string) Syntax_Error");
                raise Iof.Input_Syntax_Error;

            when Literal_Parser.Numeric_Literal_Too_Short =>
                -- Pput ("Cti.Integer_Io.Get(string) Too_Short?");
                -- Actually, this can't happen
                raise Data_Error;

        end case;
    end Get;

    procedure Put (File  : in File_Type;
                   Item  : in Long_Integer;
                   Width : in Field;
                   Base  : in Number_Base) is
        S : Output_State renames State_Handling.Get_Output_State (File).all;
    begin

        -- if not Primitive_Io.Absorb_Output then
        --     Pput ("Cti.Integer_Io.Put(file) putting " &
        --           Long_Integer'Image (Item) & " in width" &
        --           Field'Image (Width) & " and base" & Number_Base'Image (Base));
        -- end if;
        Put_Unbroken (File, S, Integer_Conversions.Image (Item, Width, Base));
        Dio.Release (File);
    exception
        when others =>
            Dio.Release (File);
            raise;
    end Put;

    procedure Put (To   : out String;
                   Item : in  Long_Integer;
                   Base : in  Number_Base) is
        To_Length : constant Natural := To'Length;
    begin
        -- if not Primitive_Io.Absorb_Output then
        --  Pput ("Cti.Integer_Io.Put(string) putting " &
        --        Long_Integer'Image (Item) & " in string of width" &
        --        Natural'Image (To'Length) &
        --        " and base" & Number_Base'Image (Base), False);
        -- end if;

        declare
            Image        : constant String  :=
               Integer_Conversions.Image (Item, 0, Base);
            Image_Length : constant Natural := Image'Length;
            Bf_Length    : constant Integer := To_Length - Image_Length;
        begin
            if Image_Length > To_Length then
                -- Pput ("Cti.Integer_Io.Put(string) its too long");
                raise Iof.Item_Length_Error;
            end if;

            if Bf_Length > 0 then
                Machine_Primitive_Operations.Blank_Fill (To, Bf_Length);
            end if;
            To (To'First + Bf_Length .. To'Last) := Image;
        end;
    end Put;

end Integer_Io;