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

⟦bb14a101d⟧ TextFile

    Length: 28154 (0x6dfa)
    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_Heap;
use Vstring_Heap;
with Vstring_Type;
use Vstring_Type;

package body Vstring_Assign 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 Assign (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Vstring_Data) is
        Pos2 : S_Natural := Vstr2.Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Vstring) is
        Pos2 : S_Natural := Vstr2.Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        E_String) is
        Pos2 : S_Natural := Vstr2'Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) :=  
           Vstr2 (Vstr2'First .. Vstr2'First + Pos2 - 1);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Character) is
    begin
        if Vstr1.Maximum_Length < 1 then
            return;
        end if;
        Vstr1.Chars (1) := Vstr2;
        Vstr1.Length    := 1;
    end Assign;

--\f

    procedure Assign (Vstr1  : in out Vstring_Data;  
                      Vstr2  :        Character;  
                      Copies :        S_Natural) is
    begin
        if Vstr1.Maximum_Length < Copies then
            Vstr1.Chars  := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length              := Copies;
        end if;
    end Assign;

--\f

    procedure Assign (Vstr1 : Vstring;  
                      Vstr2 : Vstring_Data) is
        Pos2 : S_Natural := Vstr2.Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : Vstring;  
                      Vstr2 : Vstring) is
        Pos2 : S_Natural := Vstr2.Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : Vstring;  
                      Vstr2 : E_String) is
        Pos2 : S_Natural := Vstr2'Length;
    begin
        if Pos2 > Vstr1.Maximum_Length then
            Pos2 := Vstr1.Maximum_Length;
        end if;
        Vstr1.Chars (1 .. Pos2) :=  
           Vstr2 (Vstr2'First .. Vstr2'First + Pos2 - 1);
        Vstr1.Length            := Pos2;
    end Assign;

--\f

    procedure Assign (Vstr1 : Vstring;  
                      Vstr2 : Character) is
    begin
        if Vstr1.Maximum_Length < 1 then
            return;
        end if;
        Vstr1.Chars (1) := Vstr2;
        Vstr1.Length    := 1;
    end Assign;

--\f

    procedure Assign (Vstr1  : Vstring;  
                      Vstr2  : Character;  
                      Copies : S_Natural) is
    begin
        if Vstr1.Maximum_Length < Copies then
            Vstr1.Chars  := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length              := Copies;
        end if;
    end Assign;

--\f

    procedure Assign_New (Vstr1 : out Vstring;  
                          Vstr2 :     Vstring_Data) is
        V    : Vstring   := New_Vstring (Vstr2.Length);
        Pos2 : S_Natural := Vstr2.Length;
    begin
        Vstr1               := V;
        V.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        V.Length            := Pos2;
    end Assign_New;

--\f

    procedure Assign_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        E_String;  
                             Resize_Amount :        S_Positive := 256) is
----Just line Assign except that Vstr1 is resized upwards if necessary to
--  hold all of Vstr1&Vstr2.
        Ns     : S_Natural;
        Length : S_Natural := Vstr2'Length;
    begin
        Ns := Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (1 .. Length) := Vstr2;
        Vstr1.Length              := Length;
    end Assign_Resize;

--\f

    procedure Assign_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Vstring_Data;  
                             Resize_Amount :        S_Positive := 256) is
----Just line Assign except that Vstr1 is resized upwards if necessary to
--  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr2.Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
        Vstr1.Length                    := Vstr2.Length;
    end Assign_Resize;

--\f

    procedure Assign_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Vstring;  
                             Resize_Amount :        S_Positive := 256) is
----Just line Assign except that Vstr1 is resized upwards if necessary to
--  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr2.Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
        Vstr1.Length                    := Vstr2.Length;
    end Assign_Resize;

--\f

    procedure Assign_New (Vstr1 : out Vstring;  
                          Vstr2 :     Vstring) is
        V    : Vstring   := New_Vstring (Vstr2.Length);
        Pos2 : S_Natural := Vstr2.Length;
    begin
        Vstr1               := V;
        V.Chars (1 .. Pos2) := Vstr2.Chars (1 .. Pos2);
        V.Length            := Pos2;
    end Assign_New;

--\f

    procedure Assign_New (Vstr1 : out Vstring;  
                          Vstr2 :     E_String) is
        V    : Vstring   := New_Vstring (Vstr2'Length);
        Pos2 : S_Natural := Vstr2'Length;
    begin
        Vstr1               := V;
        V.Chars (1 .. Pos2) :=  
           Vstr2 (Vstr2'First .. Vstr2'First + Pos2 - 1);
        V.Length            := Pos2;
    end Assign_New;

--\f

    procedure Assign_New (Vstr1 : out Vstring;  
                          Vstr2 :     Character) is
        V : Vstring := New_Vstring (1);
    begin
        Vstr1       := V;
        V.Chars (1) := Vstr2;
        V.Length    := 1;
    end Assign_New;

--\f

    procedure Assign_New (Vstr1  : out Vstring;  
                          Vstr2  :     Character;  
                          Copies :     S_Natural) is
        V : Vstring := New_Vstring (Copies);
    begin
        Vstr1                 := V;
        V.Chars (1 .. Copies) := (others => Vstr2);
        V.Length              := Copies;
    end Assign_New;

--\f

    procedure Append (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Vstring_Data) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2.Length then
            Left := Vstr2.Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2.Chars (1 .. Left);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Vstring) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2.Length then
            Left := Vstr2.Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2.Chars (1 .. Left);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        E_String) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2'Length then
            Left := Vstr2'Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2 (Vstr2'First .. Vstr2'First + Left - 1);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : in out Vstring_Data;  
                      Vstr2 :        Character) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left >= 1 then
            Vstr1.Chars (Vstr1.Length + 1) := Vstr2;
            Vstr1.Length                   := Vstr1.Length + 1;
        end if;
    end Append;

--\f

    procedure Append (Vstr1  : in out Vstring_Data;  
                      Vstr2  :        Character;  
                      Copies :        S_Natural) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Copies then
            Left := Copies;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=
           (others => Vstr2);
        Vstr1.Length := Vstr1.Length + Copies;
    end Append;

--\f

    procedure Append (Vstr1 : Vstring;  
                      Vstr2 : Vstring_Data) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2.Length then
            Left := Vstr2.Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2.Chars (1 .. Left);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : Vstring;  
                      Vstr2 : Vstring) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2.Length then
            Left := Vstr2.Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2.Chars (1 .. Left);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : Vstring;  
                      Vstr2 : E_String) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Vstr2'Length then
            Left := Vstr2'Length;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=  
           Vstr2 (Vstr2'First .. Vstr2'First + Left - 1);
        Vstr1.Length := Vstr1.Length + Left;
    end Append;

--\f

    procedure Append (Vstr1 : Vstring;  
                      Vstr2 : Character) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left >= 1 then
            Vstr1.Chars (Vstr1.Length + 1) := Vstr2;
            Vstr1.Length                   := Vstr1.Length + 1;
        end if;
    end Append;

--\f

    procedure Append (Vstr1  : Vstring;  
                      Vstr2  : Character;  
                      Copies : S_Natural) is
        Left : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
    begin
        if Left > Copies then
            Left := Copies;
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Left) :=
           (others => Vstr2);
        Vstr1.Length := Vstr1.Length + Copies;
    end Append;

--\f

    procedure Append_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        E_String;  
                             Resize_Amount :        S_Positive := 256) is
        ----Just line Append except that Vstr1 is resized upwards if necessary to
        --  hold all of Vstr1&Vstr2.
        Ns     : S_Natural;
        Length : S_Natural := Vstr2'Length;
    begin
        Ns := Vstr1.Length + Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Length) :=  
           Vstr2 (Vstr2'First .. Vstr2'Last);
        Vstr1.Length := Vstr1.Length + Length;
    end Append_Resize;

--\f

    procedure Append_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Character;  
                             Resize_Amount :        S_Positive := 256) is
        ----Just line Append except that Vstr1 is resized upwards if necessary to
        --  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr1.Length + 1;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (Vstr1.Length + 1) := Vstr2;
        Vstr1.Length                   := Vstr1.Length + 1;
    end Append_Resize;

--\f

    procedure Append_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Character;  
                             Copies        :        S_Natural;  
                             Resize_Amount :        S_Positive := 256) is
        ----Just line Append except that Vstr1 is resized upwards if necessary to
        --  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr1.Length + Copies;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Copies) :=
           (others => Vstr2);
        Vstr1.Length := Vstr1.Length + Copies;
    end Append_Resize;

--\f

    procedure Append_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Vstring_Data;  
                             Resize_Amount :        S_Positive := 256) is
        ----Just line Append except that Vstr1 is resized upwards if necessary to
        --  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr1.Length + Vstr2.Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Vstr2.Length) :=
           Vstr2.Chars (1 .. Vstr2.Length);
        Vstr1.Length := Vstr1.Length + Vstr2.Length;
    end Append_Resize;

--\f

    procedure Append_Resize (Vstr1         : in out Vstring;  
                             Vstr2         :        Vstring;  
                             Resize_Amount :        S_Positive := 256) is
        ----Just line Append except that Vstr1 is resized upwards if necessary to
        --  hold all of Vstr1&Vstr2.
        Ns : S_Natural;
    begin
        Ns := Vstr1.Length + Vstr2.Length;
        if Vstr1.Maximum_Length < Ns then
            Ns := Ns + Resize_Amount - 1;
            Ns := Ns - Ns rem Resize_Amount;
            Resize_Vstring (Vstr1, Ns);
        end if;
        Vstr1.Chars (Vstr1.Length + 1 .. Vstr1.Length + Vstr2.Length) :=
           Vstr2.Chars (1 .. Vstr2.Length);
        Vstr1.Length := Vstr1.Length + Vstr2.Length;
    end Append_Resize;

--\f

    procedure Prepend (Vstr1 : in out Vstring_Data;  
                       Vstr2 :        Vstring_Data) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Vstr2.Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr2.Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Length + Vstr2.Length;
        elsif Vstr2.Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := Vstr2.Chars (1 .. Vstr1.Maximum_Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : in out Vstring_Data;  
                       Vstr2 :        Vstring) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Vstr2.Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr2.Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Length + Vstr2.Length;
        elsif Vstr2.Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := Vstr2.Chars (1 .. Vstr1.Maximum_Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : in out Vstring_Data;  
                       Vstr2 :        E_String) is
        Left         : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right        : S_Natural;
        Vstr2_Length : S_Natural := Vstr2'Length;
    begin
        if Left >= Vstr2_Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2_Length + 1 .. Vstr2_Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2_Length) := Vstr2 (1 .. Vstr2_Length);
            Vstr1.Length := Vstr1.Length + Vstr2_Length;
        elsif Vstr2_Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  :=  
               Vstr2 (Vstr2'First .. Vstr2'First + Vstr1.Maximum_Length - 1);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2_Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2_Length) := Vstr2;
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : in out Vstring_Data;  
                       Vstr2 :        Character) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= 1 then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (1 + 1 .. 1 + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1) := Vstr2;
            Vstr1.Length := Vstr1.Length + 1;
        elsif 1 > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            null;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (1 + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - 1);
            Vstr1.Chars (1) := Vstr2;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1  : in out Vstring_Data;  
                       Vstr2  :        Character;  
                       Copies :        S_Natural) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Copies then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Copies + 1 .. Copies + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length := Vstr1.Length + Copies;
        elsif Copies > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Copies + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : Vstring;  
                       Vstr2 : Vstring_Data) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Vstr2.Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr2.Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Length + Vstr2.Length;
        elsif Vstr2.Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := Vstr2.Chars (1 .. Vstr1.Maximum_Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : Vstring;  
                       Vstr2 : Vstring) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Vstr2.Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr2.Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Length + Vstr2.Length;
        elsif Vstr2.Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := Vstr2.Chars (1 .. Vstr1.Maximum_Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2.Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2.Length) := Vstr2.Chars (1 .. Vstr2.Length);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : Vstring;  
                       Vstr2 : E_String) is
        Left         : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right        : S_Natural;
        Vstr2_Length : S_Natural := Vstr2'Length;
    begin
        if Left >= Vstr2_Length then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Vstr2_Length + 1 .. Vstr2_Length + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Vstr2_Length) := Vstr2;
            Vstr1.Length := Vstr1.Length + Vstr2_Length;
        elsif Vstr2_Length > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  :=  
               Vstr2 (Vstr2'First .. Vstr2'First + Vstr1.Maximum_Length - 1);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Vstr2_Length + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Vstr2_Length) := Vstr2;
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1 : Vstring;  
                       Vstr2 : Character) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= 1 then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (1 + 1 .. 1 + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1) := Vstr2;
            Vstr1.Length := Vstr1.Length + 1;
        elsif 1 > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            null;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (1 + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - 1);
            Vstr1.Chars (1) := Vstr2;
        end if;
    end Prepend;

--\f

    procedure Prepend (Vstr1  : Vstring;  
                       Vstr2  : Character;  
                       Copies : S_Natural) is
        Left  : S_Natural := Vstr1.Maximum_Length - Vstr1.Length;
        Right : S_Natural;
    begin
        if Left >= Copies then
            ----Come here if 1&2 will both fit in 1.
            Vstr1.Chars (Copies + 1 .. Copies + Vstr1.Length) :=
               Vstr1.Chars (1 .. Vstr1.Length);
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length := Vstr1.Length + Copies;
        elsif Copies > Vstr1.Maximum_Length then
            ----Come here if 2 is longer than 1 can hold.
            Vstr1.Chars  := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        else
            ----Come here if 1 must be truncated in order to fit in 2.
            Vstr1.Chars (Copies + 1 .. Vstr1.Maximum_Length) :=
               Vstr1.Chars (1 .. Vstr1.Maximum_Length - Right);
            Vstr1.Chars (1 .. Copies) := (others => Vstr2);
            Vstr1.Length := Vstr1.Maximum_Length;
        end if;
    end Prepend;

--\f

end Vstring_Assign;