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

⟦cdb54dbdf⟧ Ada Source

    Length: 25600 (0x6400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Vstring_Scan, seg_005843

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with Arithmetic;
use Arithmetic;
with Vstring_Case;
use Vstring_Case;
with Vstring_Type;
use Vstring_Type;

package body Vstring_Scan is
------------------------------------------------------------------------------
-- Copyright 1988 - 1991 by Rational, Santa Clara, California.
--
--                  All Rights Reserved.
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright notice(s) appear in all copies and that
-- both that copyright notice(s) and this permission notice appear in
-- supporting documentation, and that the name of Rational not be used in
-- advertising or publicity pertaining to distribution of the software
-- without specific, written prior permission.
--
-- Rational disclaims all warranties with regard to this software, including
-- all implied warranties of merchantability and fitness, in no event shall
-- Rational be liable for any special, indirect or consequential damages or
-- any damages whatsoever resulting from loss of use, data or profits, whether
-- in an action of contract, negligence or other tortious action, arising out
-- of or in connection with the use or performance of this software.
------------------------------------------------------------------------------

--\x0c
    procedure Scan_Body (To         : in out Vstring_Data;
                         To_Start   :        S_Natural;
                         From       : in out Vstring_Data;
                         Brk        :        Breakset;
                         Break_Char : out    Character) is
        To_Pos : S_Natural := To_Start;
        Pos    : S_Natural := 1;
        Last   : S_Natural := From.Length;
    begin

----If From is longer than To then this loop will scan just the start of the
--  From string.

        Break_Char := Ascii.Nul;
        if Last > To.Maximum_Length then
            Last := To.Maximum_Length;
        end if;

----Scan the whole string as directed by the Breakset.  When the loop exits
--  the string to be kept will be From.Chars(Pos..From.Length).

        while Pos <= Last loop
            case Brk (From.Chars (Pos)) is
                when Sa_Transfer =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := From.Chars (Pos);
                when Sa_Skip =>
                    null;
                when Sa_Transfer_Uc =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := Uc_Char (From.Chars (Pos));
                when Sa_Transfer_Lc =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := Lc_Char (From.Chars (Pos));
                when Sa_Transfer_Break =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := From.Chars (Pos);
                    Break_Char        := From.Chars (Pos);
                    Pos               := Pos + 1;
                    goto Found_Break;
                when Sa_Transfer_Uc_Break =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := Uc_Char (From.Chars (Pos));
                    Break_Char        := From.Chars (Pos);
                    Pos               := Pos + 1;
                    goto Found_Break;
                when Sa_Transfer_Lc_Break =>
                    To_Pos            := To_Pos + 1;
                    To.Chars (To_Pos) := Lc_Char (From.Chars (Pos));
                    Break_Char        := From.Chars (Pos);
                    Pos               := Pos + 1;
                    goto Found_Break;
                when Sa_Skip_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    goto Found_Break;
                when Sa_Retain_Break =>
                    Break_Char := From.Chars (Pos);
                    goto Found_Break;
            end case;
            Pos := Pos + 1;
        end loop;

----Scan the rest of the string as directed by the Breakset.  When the loop
--  exits the string to be kept will be From.Chars(Pos..From.Length).

        Last := From.Length;
        while Pos <= Last loop
            case Brk (From.Chars (Pos)) is
                when Sa_Transfer =>
                    null;
                when Sa_Skip =>
                    null;
                when Sa_Transfer_Uc =>
                    null;
                when Sa_Transfer_Lc =>
                    null;
                when Sa_Transfer_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Transfer_Uc_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Transfer_Lc_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Skip_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Retain_Break =>
                    Break_Char := From.Chars (Pos);
                    exit;
            end case;
            Pos := Pos + 1;
        end loop;

----Copy the unscanned portion of the string down to the start of the array
--  and set the length and return.

        <<Found_Break>> null;
        Last                   := From.Length - Pos + 1;
        From.Chars (1 .. Last) := From.Chars (Pos .. From.Length);
        From.Length            := Last;
        To.Length              := To_Pos;

    end Scan_Body;

--\x0c
    procedure Scan (To         : in out Vstring_Data;
                    From       : in out Vstring_Data;
                    Brk        :        Breakset;
                    Break_Char : out    Character) is
    begin       Scan_Body (To, 0, From, Brk, Break_Char);
    end Scan;

    procedure Scan (To         : in out Vstring_Data;
                    From       :        Vstring;
                    Brk        :        Breakset;
                    Break_Char : out    Character) is
    begin
        Scan_Body (To, 0, From.all, Brk, Break_Char);
    end Scan;

    procedure Scan (To         :        Vstring;
                    From       : in out Vstring_Data;
                    Brk        :        Breakset;
                    Break_Char : out    Character) is
    begin
        Scan_Body (To.all, 0, From, Brk, Break_Char);
    end Scan;

    procedure Scan (To         :     Vstring;
                    From       :     Vstring;
                    Brk        :     Breakset;
                    Break_Char : out Character) is
    begin
        Scan_Body (To.all, 0, From.all, Brk, Break_Char);
    end Scan;

--\x0c
    procedure Append_Scan (To         : in out Vstring_Data;
                           From       : in out Vstring_Data;
                           Brk        :        Breakset;
                           Break_Char : out    Character) is
    begin
        Scan_Body (To, To.Length, From, Brk, Break_Char);
    end Append_Scan;

    procedure Append_Scan (To         : in out Vstring_Data;
                           From       :        Vstring;
                           Brk        :        Breakset;
                           Break_Char : out    Character) is
    begin
        Scan_Body (To, To.Length, From.all, Brk, Break_Char);
    end Append_Scan;

    procedure Append_Scan (To         : in out Vstring;
                           From       : in out Vstring_Data;
                           Brk        :        Breakset;
                           Break_Char : out    Character) is
    begin
        Scan_Body (To.all, To.Length, From, Brk, Break_Char);
    end Append_Scan;

    procedure Append_Scan (To         : in out Vstring;
                           From       :        Vstring;
                           Brk        :        Breakset;
                           Break_Char : out    Character) is
    begin
        Scan_Body (To.all, To.Length, From.all, Brk, Break_Char);
    end Append_Scan;

--\x0c
    procedure Trunc_Scan (From       : in out Vstring_Data;  
                          Brk        :        Breakset;  
                          Break_Char : out    Character) is
        Pos  : S_Natural := 1;
        Last : S_Natural := From.Length;
    begin

----Scan the whole string as directed by the Breakset.  When the loop exits
--  the string to be kept will be From.Chars(Pos..Last).

        Break_Char := Ascii.Nul;
        while Pos <= Last loop
            case Brk (From.Chars (Pos)) is
                when Sa_Transfer =>
                    null;
                when Sa_Skip =>
                    null;
                when Sa_Transfer_Uc =>
                    null;
                whenSa_Transfer_Lc =>
                    null;
                when Sa_Transfer_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Transfer_Uc_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Transfer_Lc_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Skip_Break =>
                    Break_Char := From.Chars (Pos);
                    Pos        := Pos + 1;
                    exit;
                when Sa_Retain_Break =>
                    Break_Char := From.Chars (Pos);
                    exit;
            end case;
            Pos := Pos + 1;
        end loop;

----Copy the unscanned portion of the string down to the start of the array
--  and set the length and return.

        From.Length                   := Last - Pos + 1;
        From.Chars (1 .. From.Length) := From.Chars (Pos .. Last);

    end Trunc_Scan;

--\x0c
    procedure Trunc_Scan (From       :     Vstring;  
                          Brk        :     Breakset;  
                          Break_Char : out Character) is
    begin
        Trunc_Scan (From.all, Brk, Break_Char);
    end Trunc_Scan;

--\x0c
    procedure Set_Breakset (Brk   : in out Breakset;  
                            Break :        E_String;  
                            Omit  :        E_String;  
                            Mode  :        E_String) is
------------------------------------------------------------------------------
----Initialize a Breakset.
--  Break   - Contains all characters that will (not) stop the scan.
--  Omit    - Contains all characters to be dropped as From is scanned.
--  Mode    - Mode setting characters:
--              I - Break contains scan stopping characters (Inclusive scan)
--              X - Break contains scan non-stopping chars (eXclusive scan)
--              A - Append break character in To string and stop
--              R - Retain break character in From string and stop
--              S - Skip (drop) break character and stop
--              U - Convert characters to Upper case as they are copied
--              L - Convert characters to Lower case as they are copied
------------------------------------------------------------------------------
        Stop_Type     : Scan_Action := Sa_Skip_Break;
        Transfer_Type : Scan_Action := Sa_Transfer;
        Inclusive     : Boolean     := True;
    begin

----Loop over the Mode characters and set up our state variables accordingly.
--  Stop_Type       - The Scan_Action to use for a Break character
--  Transfer_Type   - The Scan_Action to use for a non-Break character
--  Inclusive       - Inclusive or eXclusive scan

        for I in Mode'Range loop
            case Mode (I) is
                when 'I' | 'i' =>                   -- Inclusive Scan
                    Inclusive := True;
                when 'X' | 'x' =>                   -- eXclusive Scan
                    Inclusive := False;
                when 'A' | 'a' =>                   -- Append break character
                    case Transfer_Type is
                        when Sa_Transfer =>
                            Stop_Type := Sa_Transfer_Break;
                        when Sa_Transfer_Uc =>
                            Stop_Type := Sa_Transfer_Uc_Break;
                        when Sa_Transfer_Lc =>
                            Stop_Type := Sa_Transfer_Lc_Break;
                        when others =>
                            null;
                    end case;
                when 'R' | 'r' =>                   -- Retain break character
                    Stop_Type := Sa_Retain_Break;
                when 'S' | 's' =>                   -- Skip break character
                    Stop_Type := Sa_Skip_Break;
                when 'U' | 'u' =>                   -- Upper case transfers
                    Transfer_Type := Sa_Transfer_Uc;
                    if Stop_Type /= Sa_Retain_Break and then  
                       Stop_Type /= Sa_Skip_Break then
                        Stop_Type := Sa_Transfer_Uc_Break;
                    end if;
                when 'L' | 'l' =>                   -- Lower case transfers
                    Transfer_Type := Sa_Transfer_Lc;
                    if Stop_Type /= Sa_Retain_Break and then  
                       Stop_Type /= Sa_Skip_Break then
                        Stop_Type := Sa_Transfer_Lc_Break;
                    end if;
                when others =>
                    raise Program_Error;
            end case;
        end loop;

----Init the Breakset to always stop or to always transfer depending upon the
--  type of scan being set up.

        if Inclusive then
            Brk := (others => Transfer_Type);
        else
            Brk := (others => Stop_Type);
        end if;

----Set all Omit characters to Sa_Skip.

        for I in Omit'Range loop
            Brk (Omit (I)) := Sa_Skip;
        end loop;

----Set all Break characters to Stop or to Transfer depending upon the scan
--  type.

        if Inclusive then
            for I in Break'Range loop
                Brk (Break (I)) := Stop_Type;
            end loop;
        else
            for I in Break'Range loop
                Brk (Break (I)) := Transfer_Type;
            end loop;
        end if;

    end Set_Breakset;

--\x0c
end Vstring_Scan;

E3 Meta Data

    nblk1=18
    nid=0
    hdr6=30
        [0x00] rec0=19 rec1=00 rec2=01 rec3=00c
        [0x01] rec0=16 rec1=00 rec2=02 rec3=012
        [0x02] rec0=00 rec1=00 rec2=18 rec3=00a
        [0x03] rec0=16 rec1=00 rec2=03 rec3=044
        [0x04] rec0=01 rec1=00 rec2=17 rec3=04c
        [0x05] rec0=14 rec1=00 rec2=04 rec3=048
        [0x06] rec0=03 rec1=00 rec2=16 rec3=01a
        [0x07] rec0=1a rec1=00 rec2=05 rec3=042
        [0x08] rec0=01 rec1=00 rec2=15 rec3=012
        [0x09] rec0=1d rec1=00 rec2=06 rec3=002
        [0x0a] rec0=00 rec1=00 rec2=14 rec3=060
        [0x0b] rec0=1d rec1=00 rec2=07 rec3=048
        [0x0c] rec0=18 rec1=00 rec2=08 rec3=02c
        [0x0d] rec0=1b rec1=00 rec2=09 rec3=028
        [0x0e] rec0=00 rec1=00 rec2=13 rec3=002
        [0x0f] rec0=1a rec1=00 rec2=0a rec3=008
        [0x10] rec0=00 rec1=00 rec2=12 rec3=038
        [0x11] rec0=19 rec1=00 rec2=0b rec3=072
        [0x12] rec0=00 rec1=00 rec2=11 rec3=024
        [0x13] rec0=13 rec1=00 rec2=0c rec3=036
        [0x14] rec0=01 rec1=00 rec2=10 rec3=010
        [0x15] rec0=12 rec1=00 rec2=0d rec3=026
        [0x16] rec0=16 rec1=00 rec2=0e rec3=036
        [0x17] rec0=1c rec1=00 rec2=0f rec3=000
    tail 0x21500affa81978f26b9f6 0x42a00088462063203