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

⟦85890c3bf⟧ TextFile

    Length: 14450 (0x3872)
    Types: TextFile
    Names: »B«

Derivation

└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00
    └─ ⟦0c20f784e⟧ »DATA« 
        └─⟦1abbe589f⟧ 
            └─⟦591c5b094⟧ 
                └─⟦this⟧ 

TextFile

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.
------------------------------------------------------------------------------

--\f

    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;

--\f

    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;

--\f

    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;

--\f

    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;
                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.

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

    end Trunc_Scan;

--\f

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

--\f

    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;

--\f

end Vstring_Scan;