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-stwiun.adb < prev    next >
Text File  |  1996-09-28  |  22KB  |  831 lines

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