home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / a-strunb.adb < prev    next >
Text File  |  1996-09-28  |  21KB  |  816 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT RUNTIME COMPONENTS                          --
  4. --                                                                          --
  5. --                A D A . S T R I N G S . U N B O U N D E D                 --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.13 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with Ada.Strings.Fixed;
  27. with Ada.Strings.Search;
  28. with Ada.Unchecked_Deallocation;
  29.  
  30. package body Ada.Strings.Unbounded is
  31.  
  32.    ----------------
  33.    -- Initialize --
  34.    ----------------
  35.  
  36.    procedure Initialize (Object : in out Unbounded_String) is
  37.    begin
  38.       Object.Reference := Null_Unbounded_String.Reference;
  39.    end Initialize;
  40.  
  41.    ------------
  42.    -- Adjust --
  43.    ------------
  44.  
  45.    procedure Adjust (Object : in out Unbounded_String) is
  46.    begin
  47.       Object.Reference := new String'(Object.Reference.all);
  48.    end Adjust;
  49.  
  50.    ----------
  51.    -- Free --
  52.    ----------
  53.  
  54.    procedure Free (X : in out String_Access) is
  55.       procedure Deallocate is
  56.          new Ada.Unchecked_Deallocation (String, String_Access);
  57.    begin
  58.       Deallocate (X);
  59.    end Free;
  60.  
  61.    --------------
  62.    -- Finalize --
  63.    --------------
  64.  
  65.    procedure Finalize   (Object : in out Unbounded_String) is
  66.    begin
  67.       if Object.Reference /= Null_Unbounded_String.Reference then
  68.          Free (Object.Reference);
  69.       end if;
  70.    end Finalize;
  71.  
  72.    ---------
  73.    -- "=" --
  74.    ---------
  75.  
  76.    function "=" (Left, Right : in Unbounded_String) return Boolean is
  77.    begin
  78.       return Left.Reference.all = Right.Reference.all;
  79.    end "=";
  80.  
  81.    function "="
  82.      (Left  : in Unbounded_String;
  83.       Right : in String)
  84.       return  Boolean
  85.    is
  86.    begin
  87.       return Left.Reference.all = Right;
  88.    end "=";
  89.  
  90.    function "="
  91.      (Left  : in String;
  92.       Right : in Unbounded_String)
  93.       return  Boolean
  94.    is
  95.    begin
  96.       return Left = Right.Reference.all;
  97.    end "=";
  98.  
  99.    ---------
  100.    -- "<" --
  101.    ---------
  102.  
  103.    function "<" (Left, Right : in Unbounded_String) return Boolean is
  104.    begin
  105.       return Left.Reference.all < Right.Reference.all;
  106.    end "<";
  107.  
  108.    function "<"
  109.      (Left  : in Unbounded_String;
  110.       Right : in String)
  111.       return  Boolean
  112.    is
  113.    begin
  114.       return Left.Reference.all < Right;
  115.    end "<";
  116.  
  117.    function "<"
  118.      (Left  : in String;
  119.       Right : in Unbounded_String)
  120.       return  Boolean
  121.    is
  122.    begin
  123.       return Left < Right.Reference.all;
  124.    end "<";
  125.  
  126.    ----------
  127.    -- "<=" --
  128.    ----------
  129.  
  130.    function "<=" (Left, Right : in Unbounded_String) return Boolean is
  131.    begin
  132.       return Left.Reference.all <= Right.Reference.all;
  133.    end "<=";
  134.  
  135.    function "<="
  136.      (Left  : in Unbounded_String;
  137.       Right : in String)
  138.       return  Boolean
  139.    is
  140.    begin
  141.       return Left.Reference.all <= Right;
  142.    end "<=";
  143.  
  144.    function "<="
  145.      (Left  : in String;
  146.       Right : in Unbounded_String)
  147.       return  Boolean
  148.    is
  149.    begin
  150.       return Left <= Right.Reference.all;
  151.    end "<=";
  152.  
  153.    ---------
  154.    -- ">" --
  155.    ---------
  156.  
  157.    function ">"  (Left, Right : in Unbounded_String) return Boolean is
  158.    begin
  159.       return Left.Reference.all > Right.Reference.all;
  160.    end ">";
  161.  
  162.    function ">"
  163.      (Left  : in Unbounded_String;
  164.       Right : in String)
  165.       return  Boolean
  166.    is
  167.    begin
  168.       return Left.Reference.all > Right;
  169.    end ">";
  170.  
  171.    function ">"
  172.      (Left  : in String;
  173.       Right : in Unbounded_String)
  174.       return  Boolean
  175.    is
  176.    begin
  177.       return Left > Right.Reference.all;
  178.    end ">";
  179.  
  180.    ----------
  181.    -- ">=" --
  182.    ----------
  183.  
  184.    function ">=" (Left, Right : in Unbounded_String) return Boolean is
  185.    begin
  186.       return Left.Reference.all >= Right.Reference.all;
  187.    end ">=";
  188.  
  189.    function ">="
  190.      (Left  : in Unbounded_String;
  191.       Right : in String)
  192.       return  Boolean
  193.    is
  194.    begin
  195.       return Left.Reference.all >= Right;
  196.    end ">=";
  197.  
  198.    function ">="
  199.      (Left  : in String;
  200.       Right : in Unbounded_String)
  201.       return  Boolean
  202.    is
  203.    begin
  204.       return Left >= Right.Reference.all;
  205.    end ">=";
  206.  
  207.    ---------
  208.    -- "*" --
  209.    ---------
  210.  
  211.    function "*"
  212.      (Left  : Natural;
  213.       Right : Character)
  214.       return  Unbounded_String
  215.    is
  216.       Result : Unbounded_String;
  217.  
  218.    begin
  219.       Result.Reference := new String (1 .. Left);
  220.       for J in Result.Reference'Range loop
  221.          Result.Reference (J) := Right;
  222.       end loop;
  223.  
  224.       return Result;
  225.    end "*";
  226.  
  227.    function "*"
  228.      (Left  : Natural;
  229.       Right : String)
  230.      return   Unbounded_String
  231.    is
  232.       Len    : constant Integer := Right'Length;
  233.       Result : Unbounded_String;
  234.  
  235.    begin
  236.       Result.Reference := new String (1 .. Left * Len);
  237.       for J in 1 .. Left loop
  238.          Result.Reference.all (Len * J - Len + 1 .. Len * J) := Right;
  239.       end loop;
  240.  
  241.       return Result;
  242.    end "*";
  243.  
  244.    function "*"
  245.      (Left  : Natural;
  246.       Right : Unbounded_String)
  247.       return  Unbounded_String
  248.    is
  249.       Len    : constant Integer := Right.Reference.all'Length;
  250.       Result : Unbounded_String;
  251.  
  252.    begin
  253.       Result.Reference := new String (1 .. Left * Len);
  254.       for I in 1 .. Left loop
  255.          Result.Reference.all (Len * I - Len + 1 .. Len * I) :=
  256.            Right.Reference.all;
  257.       end loop;
  258.  
  259.       return Result;
  260.    end "*";
  261.  
  262.    ---------
  263.    -- "&" --
  264.    ---------
  265.  
  266.    function "&" (Left, Right : Unbounded_String) return Unbounded_String is
  267.       L_Length : constant Integer := Left.Reference.all'Length;
  268.       R_Length : constant Integer := Right.Reference.all'Length;
  269.       Length   : constant Integer :=  L_Length + R_Length;
  270.       Result   : Unbounded_String;
  271.  
  272.    begin
  273.       Result.Reference := new String (1 .. Length);
  274.       Result.Reference.all (1 .. L_Length)          := Left.Reference.all;
  275.       Result.Reference.all (L_Length + 1 .. Length) := Right.Reference.all;
  276.       return Result;
  277.    end "&";
  278.  
  279.    function "&"
  280.      (Left  : Unbounded_String;
  281.       Right : String)
  282.       return  Unbounded_String
  283.    is
  284.       L_Length : constant Integer := Left.Reference.all'Length;
  285.       Length   : constant Integer := L_Length +  Right'Length;
  286.       Result   : Unbounded_String;
  287.  
  288.    begin
  289.       Result.Reference := new String (1 .. Length);
  290.       Result.Reference.all (1 .. L_Length)          := Left.Reference.all;
  291.       Result.Reference.all (L_Length + 1 .. Length) := Right;
  292.       return Result;
  293.    end "&";
  294.  
  295.    function "&"
  296.      (Left  : String;
  297.       Right : Unbounded_String)
  298.       return  Unbounded_String
  299.    is
  300.       R_Length : constant Integer := Right.Reference.all'Length;
  301.       Length   : constant Integer := Left'Length + R_Length;
  302.       Result   : Unbounded_String;
  303.  
  304.    begin
  305.       Result.Reference := new String (1 .. Length);
  306.       Result.Reference.all (1 .. Left'Length)          := Left;
  307.       Result.Reference.all (Left'Length + 1 .. Length) := Right.Reference.all;
  308.       return Result;
  309.    end "&";
  310.  
  311.    function "&"
  312.      (Left  : Unbounded_String;
  313.       Right : Character)
  314.       return  Unbounded_String
  315.    is
  316.       Length : constant Integer := Left.Reference.all'Length + 1;
  317.       Result : Unbounded_String;
  318.  
  319.    begin
  320.       Result.Reference := new String (1 .. Length);
  321.       Result.Reference.all (1 .. Length - 1) := Left.Reference.all;
  322.       Result.Reference.all (Length)          := Right;
  323.       return Result;
  324.    end "&";
  325.  
  326.    function "&"
  327.      (Left  : Character;
  328.       Right : Unbounded_String)
  329.       return  Unbounded_String
  330.    is
  331.       Length : constant Integer := Right.Reference.all'Length + 1;
  332.       Result : Unbounded_String;
  333.  
  334.    begin
  335.       Result.Reference := new String (1 .. Length);
  336.       Result.Reference.all (1)           := Left;
  337.       Result.Reference.all (2 .. Length) := Right.Reference.all;
  338.       return Result;
  339.    end "&";
  340.  
  341.    -----------
  342.    -- Count --
  343.    -----------
  344.  
  345.    function Count
  346.      (Source   : Unbounded_String;
  347.       Pattern  : String;
  348.       Mapping  : Maps.Character_Mapping := Maps.Identity)
  349.       return     Natural
  350.    is
  351.    begin
  352.       return Search.Count (Source.Reference.all, Pattern, Mapping);
  353.    end Count;
  354.  
  355.    function Count
  356.      (Source   : in Unbounded_String;
  357.       Pattern  : in String;
  358.       Mapping  : in Maps.Character_Mapping_Function)
  359.       return     Natural
  360.    is
  361.    begin
  362.       return Search.Count (Source.Reference.all, Pattern, Mapping);
  363.    end Count;
  364.  
  365.    function Count
  366.      (Source   : Unbounded_String;
  367.       Set      : Maps.Character_Set)
  368.       return     Natural
  369.    is
  370.    begin
  371.       return Search.Count (Source.Reference.all, Set);
  372.    end Count;
  373.  
  374.    ------------
  375.    -- Delete --
  376.    ------------
  377.  
  378.    function Delete
  379.      (Source  : Unbounded_String;
  380.       From    : Positive;
  381.       Through : Natural)
  382.       return    Unbounded_String
  383.    is
  384.    begin
  385.       return
  386.         To_Unbounded_String
  387.           (Fixed.Delete (Source.Reference.all, From, Through));
  388.    end Delete;
  389.  
  390.    procedure Delete
  391.      (Source  : in out Unbounded_String;
  392.       From    : in Positive;
  393.       Through : in Natural)
  394.    is
  395.  
  396.    begin
  397.       Source := To_Unbounded_String
  398.         (Fixed.Delete (Source.Reference.all, From, Through));
  399.    end Delete;
  400.  
  401.    -------------
  402.    -- Element --
  403.    -------------
  404.  
  405.    function Element
  406.      (Source : Unbounded_String;
  407.       Index  : Positive)
  408.       return   Character
  409.    is
  410.    begin
  411.       if Index <= Source.Reference.all'Last then
  412.          return Source.Reference.all (Index);
  413.       else
  414.          raise Strings.Index_Error;
  415.       end if;
  416.    end Element;
  417.  
  418.    ----------------
  419.    -- Find_Token --
  420.    ----------------
  421.  
  422.    procedure Find_Token
  423.      (Source : Unbounded_String;
  424.       Set    : Maps.Character_Set;
  425.       Test   : Strings.Membership;
  426.       First  : out Positive;
  427.       Last   : out Natural)
  428.    is
  429.    begin
  430.       Search.Find_Token (Source.Reference.all, Set, Test, First, Last);
  431.    end Find_Token;
  432.  
  433.    ----------
  434.    -- Head --
  435.    ----------
  436.  
  437.    function Head
  438.      (Source : Unbounded_String;
  439.       Count  : Natural;
  440.       Pad    : Character := Space)
  441.       return   Unbounded_String
  442.    is
  443.    begin
  444.       return
  445.         To_Unbounded_String (Fixed.Head (Source.Reference.all, Count, Pad));
  446.    end Head;
  447.  
  448.    procedure Head
  449.      (Source : in out Unbounded_String;
  450.       Count  : in Natural;
  451.       Pad    : in Character := Space)
  452.    is
  453.    begin
  454.       Source := To_Unbounded_String
  455.         (Fixed.Head (Source.Reference.all, Count, Pad));
  456.    end Head;
  457.  
  458.    -----------
  459.    -- Index --
  460.    -----------
  461.  
  462.    function Index
  463.      (Source   : Unbounded_String;
  464.       Pattern  : String;
  465.       Going    : Strings.Direction := Strings.Forward;
  466.       Mapping  : Maps.Character_Mapping := Maps.Identity)
  467.       return     Natural
  468.    is
  469.    begin
  470.       return Search.Index (Source.Reference.all, Pattern, Going, Mapping);
  471.    end Index;
  472.  
  473.    function Index
  474.      (Source   : in Unbounded_String;
  475.       Pattern  : in String;
  476.       Going    : in Direction := Forward;
  477.       Mapping  : in Maps.Character_Mapping_Function)
  478.       return Natural
  479.    is
  480.    begin
  481.       return Search.Index (Source.Reference.all, Pattern, Going, Mapping);
  482.    end Index;
  483.  
  484.    function Index
  485.      (Source : Unbounded_String;
  486.       Set    : Maps.Character_Set;
  487.       Test   : Strings.Membership := Strings.Inside;
  488.       Going  : Strings.Direction  := Strings.Forward)
  489.       return   Natural
  490.    is
  491.    begin
  492.       return Search.Index (Source.Reference.all, Set, Test, Going);
  493.    end Index;
  494.  
  495.    function Index_Non_Blank
  496.      (Source : Unbounded_String;
  497.       Going  : Strings.Direction := Strings.Forward)
  498.       return   Natural
  499.    is
  500.    begin
  501.       return Search.Index_Non_Blank (Source.Reference.all, Going);
  502.    end Index_Non_Blank;
  503.  
  504.    ------------
  505.    -- Insert --
  506.    ------------
  507.  
  508.    function Insert
  509.      (Source   : Unbounded_String;
  510.       Before   : Positive;
  511.       New_Item : String)
  512.       return     Unbounded_String
  513.    is
  514.    begin
  515.       return
  516.         To_Unbounded_String
  517.           (Fixed.Insert (Source.Reference.all, Before, New_Item));
  518.    end Insert;
  519.  
  520.    procedure Insert
  521.      (Source   : in out Unbounded_String;
  522.       Before   : in Positive;
  523.       New_Item : in String)
  524.    is
  525.    begin
  526.       Source := To_Unbounded_String
  527.         (Fixed.Insert (Source.Reference.all, Before, New_Item));
  528.    end Insert;
  529.  
  530.    ------------
  531.    -- Length --
  532.    ------------
  533.  
  534.    function Length (Source : Unbounded_String) return Natural is
  535.    begin
  536.       return Source.Reference.all'Length;
  537.    end Length;
  538.  
  539.    ---------------
  540.    -- Overwrite --
  541.    ---------------
  542.  
  543.    function Overwrite
  544.      (Source    : Unbounded_String;
  545.       Position  : Positive;
  546.       New_Item  : String)
  547.       return      Unbounded_String is
  548.  
  549.    begin
  550.       return To_Unbounded_String
  551.         (Fixed.Overwrite (Source.Reference.all, Position, New_Item));
  552.    end Overwrite;
  553.  
  554.    procedure Overwrite
  555.      (Source    : in out Unbounded_String;
  556.       Position  : in Positive;
  557.       New_Item  : in String)
  558.    is
  559.    begin
  560.       Source := To_Unbounded_String
  561.         (Fixed.Overwrite (Source.Reference.all, Position, New_Item));
  562.    end Overwrite;
  563.  
  564.    ---------------------
  565.    -- Replace_Element --
  566.    ---------------------
  567.  
  568.    procedure Replace_Element
  569.      (Source : in out Unbounded_String;
  570.       Index  : Positive;
  571.       By     : Character)
  572.    is
  573.    begin
  574.       if Index <= Source.Reference.all'Last then
  575.          Source.Reference.all (Index) := By;
  576.       else
  577.          raise Strings.Index_Error;
  578.       end if;
  579.    end Replace_Element;
  580.  
  581.    -------------------
  582.    -- Replace_Slice --
  583.    -------------------
  584.  
  585.    function Replace_Slice
  586.      (Source   : Unbounded_String;
  587.       Low      : Positive;
  588.       High     : Natural;
  589.       By       : String)
  590.       return     Unbounded_String
  591.    is
  592.    begin
  593.       return
  594.         To_Unbounded_String
  595.           (Fixed.Replace_Slice (Source.Reference.all, Low, High, By));
  596.    end Replace_Slice;
  597.  
  598.    procedure Replace_Slice
  599.      (Source   : in out Unbounded_String;
  600.       Low      : in Positive;
  601.       High     : in Natural;
  602.       By       : in String)
  603.    is
  604.    begin
  605.       Source := To_Unbounded_String
  606.         (Fixed.Replace_Slice (Source.Reference.all, Low, High, By));
  607.    end Replace_Slice;
  608.  
  609.    -----------
  610.    -- Slice --
  611.    -----------
  612.  
  613.    function Slice
  614.      (Source : Unbounded_String;
  615.       Low    : Positive;
  616.       High   : Natural)
  617.       return   String
  618.    is
  619.       Result : String (1 .. High - Low + 1);
  620.  
  621.    begin
  622.       Result := Source.Reference.all (Low .. High);
  623.       return Result;
  624.    end Slice;
  625.  
  626.    ----------
  627.    -- Tail --
  628.    ----------
  629.  
  630.    function Tail
  631.      (Source : Unbounded_String;
  632.       Count  : Natural;
  633.       Pad    : Character := Space)
  634.       return   Unbounded_String is
  635.  
  636.    begin
  637.       return
  638.         To_Unbounded_String (Fixed.Tail (Source.Reference.all, Count, Pad));
  639.    end Tail;
  640.  
  641.    procedure Tail
  642.      (Source : in out Unbounded_String;
  643.       Count  : in Natural;
  644.       Pad    : in Character := Space)
  645.    is
  646.       Temp : String_Access := Source.Reference;
  647.  
  648.    begin
  649.       Source := To_Unbounded_String
  650.         (Fixed.Tail (Temp.all, Count, Pad));
  651.       Free (Temp);
  652.    end Tail;
  653.  
  654.    ---------------
  655.    -- To_String --
  656.    ---------------
  657.  
  658.    function To_String (Source : Unbounded_String) return String is
  659.    begin
  660.       return Source.Reference.all;
  661.    end To_String;
  662.  
  663.    -------------------------
  664.    -- To_Unbounded_String --
  665.    -------------------------
  666.  
  667.    function To_Unbounded_String (Source : String) return Unbounded_String is
  668.       Result : Unbounded_String;
  669.  
  670.    begin
  671.       Result.Reference := new String'(Source);
  672.       return Result;
  673.    end To_Unbounded_String;
  674.  
  675.    function To_Unbounded_String (Length : in Natural)
  676.       return Unbounded_String
  677.    is
  678.       Result : Unbounded_String;
  679.  
  680.    begin
  681.       Result.Reference := new String (1 .. Length);
  682.       return Result;
  683.    end To_Unbounded_String;
  684.  
  685.    ------------
  686.    -- Append --
  687.    ------------
  688.  
  689.    procedure Append
  690.      (Source   : in out Unbounded_String;
  691.       New_Item : in Unbounded_String)
  692.    is
  693.       S_Length : constant Integer := Source.Reference.all'Length;
  694.       Length   : constant Integer := S_Length + New_Item.Reference.all'Length;
  695.       Tmp      : String_Access;
  696.  
  697.    begin
  698.       Tmp := new String (1 .. Length);
  699.       Tmp (1 .. S_Length) := Source.Reference.all;
  700.       Tmp (S_Length + 1 .. Length) := New_Item.Reference.all;
  701.       Source := (Controlled with Reference => Tmp);
  702.    end Append;
  703.  
  704.    procedure Append
  705.      (Source   : in out Unbounded_String;
  706.       New_Item : in String)
  707.    is
  708.       S_Length : constant Integer := Source.Reference.all'Length;
  709.       Length   : constant Integer := S_Length + New_Item'Length;
  710.       Tmp      : String_Access;
  711.  
  712.    begin
  713.       Tmp := new String (1 .. Length);
  714.       Tmp (1 .. S_Length) := Source.Reference.all;
  715.       Tmp (S_Length + 1 .. Length) := New_Item;
  716.       Source := (Controlled with Reference => Tmp);
  717.    end Append;
  718.  
  719.    procedure Append
  720.      (Source   : in out Unbounded_String;
  721.       New_Item : in Character)
  722.    is
  723.       S_Length : constant Integer := Source.Reference.all'Length;
  724.       Length   : constant Integer := S_Length + 1;
  725.       Tmp      : String_Access;
  726.  
  727.    begin
  728.       Tmp := new String (1 .. Length);
  729.       Tmp (1 .. S_Length) := Source.Reference.all;
  730.       Tmp (S_Length + 1) := New_Item;
  731.       Source := (Controlled with Reference => Tmp);
  732.    end Append;
  733.  
  734.    ---------------
  735.    -- Translate --
  736.    ---------------
  737.  
  738.    function Translate
  739.      (Source  : Unbounded_String;
  740.       Mapping : Maps.Character_Mapping)
  741.       return    Unbounded_String
  742.    is
  743.    begin
  744.       return
  745.         To_Unbounded_String (Fixed.Translate (Source.Reference.all, Mapping));
  746.    end Translate;
  747.  
  748.    procedure Translate
  749.      (Source  : in out Unbounded_String;
  750.       Mapping : Maps.Character_Mapping)
  751.    is
  752.    begin
  753.       Fixed.Translate (Source.Reference.all, Mapping);
  754.    end Translate;
  755.  
  756.    function Translate
  757.      (Source  : in Unbounded_String;
  758.       Mapping : in Maps.Character_Mapping_Function)
  759.       return    Unbounded_String
  760.    is
  761.    begin
  762.       return
  763.         To_Unbounded_String (Fixed.Translate (Source.Reference.all, Mapping));
  764.    end Translate;
  765.  
  766.    procedure Translate
  767.      (Source  : in out Unbounded_String;
  768.       Mapping : in Maps.Character_Mapping_Function)
  769.    is
  770.    begin
  771.       Fixed.Translate (Source.Reference.all, Mapping);
  772.    end Translate;
  773.  
  774.    ----------
  775.    -- Trim --
  776.    ----------
  777.  
  778.    function Trim
  779.      (Source : in Unbounded_String;
  780.       Side   : in Trim_End)
  781.       return   Unbounded_String
  782.    is
  783.    begin
  784.       return To_Unbounded_String (Fixed.Trim (Source.Reference.all, Side));
  785.    end Trim;
  786.  
  787.    procedure Trim
  788.      (Source : in out Unbounded_String;
  789.       Side   : in Trim_End)
  790.    is
  791.    begin
  792.       Fixed.Trim (Source.Reference.all, Side);
  793.    end Trim;
  794.  
  795.    function Trim
  796.      (Source : in Unbounded_String;
  797.       Left   : in Maps.Character_Set;
  798.       Right  : in Maps.Character_Set)
  799.       return   Unbounded_String
  800.    is
  801.    begin
  802.       return
  803.         To_Unbounded_String (Fixed.Trim (Source.Reference.all, Left, Right));
  804.    end Trim;
  805.  
  806.    procedure Trim
  807.      (Source : in out Unbounded_String;
  808.       Left   : in Maps.Character_Set;
  809.       Right  : in Maps.Character_Set)
  810.    is
  811.    begin
  812.       Fixed.Trim (Source.Reference.all, Left, Right);
  813.    end Trim;
  814.  
  815. end Ada.Strings.Unbounded;
  816.