File: strings_edit-utf8-handling.adb

package info (click to toggle)
asis 2018-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 13,528 kB
  • sloc: ada: 155,205; makefile: 297; sh: 67; xml: 48; csh: 10
file content (154 lines) | stat: -rw-r--r-- 5,790 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
--                                                                    --
--  package                         Copyright (c)  Dmitry A. Kazakov  --
--     Strings_Edit.UTF8.Handling                  Luebeck            --
--  Implementation                                 Spring, 2005       --
--                                                                    --
--                                Last revision :  10:11 25 Jun 2005  --
--                                                                    --
--  This  library  is  free software; you can redistribute it and/or  --
--  modify it under the terms of the GNU General Public  License  as  --
--  published by the Free Software Foundation; either version  2  of  --
--  the License, or (at your option) any later version. This library  --
--  is distributed in the hope that it will be useful,  but  WITHOUT  --
--  ANY   WARRANTY;   without   even   the   implied   warranty   of  --
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  --
--  General  Public  License  for  more  details.  You  should  have  --
--  received  a  copy  of  the GNU General Public License along with  --
--  this library; if not, write to  the  Free  Software  Foundation,  --
--  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.    --
--                                                                    --
--                                                                          --
--                                                                          --
--                                                                          --
--                                                                          --
--                                                                          --
--                                                                          --
--____________________________________________________________________--

package body Strings_Edit.UTF8.Handling is

   function To_UTF8 (Value : Character) return String is
      Result  : String (1..2);
      Pointer : Integer := Result'First;
   begin
      Put (Result, Pointer, UTF8_Code_Point (Character'Pos (Value)));
      return Result (1..Pointer - 1);
   end To_UTF8;
   
   function To_UTF8 (Value : String) return String is
      Result  : String (1..Value'Length * 2);
      Pointer : Integer := Result'First;
   begin
      for Item in Value'Range loop
         Put
         (  Result,
            Pointer,
            UTF8_Code_Point (Character'Pos (Value (Item)))
         );
      end loop;
      return Result (Result'First..Pointer - 1);
   end To_UTF8;

   function To_UTF8 (Value : Wide_Character) return String is
      Result  : String (1..3);
      Pointer : Integer := Result'First;
   begin
      Put
      (  Result,
         Pointer,
         UTF8_Code_Point (Wide_Character'Pos (Value))
      );
      return Result (1..Pointer - 1);
   end To_UTF8;

   function To_UTF8 (Value : Wide_String) return String is
      Result  : String (1..Value'Length * 3);
      Pointer : Integer := Result'First;
   begin
      for Item in Value'Range loop
         Put
         (  Result,
            Pointer,
            UTF8_Code_Point (Wide_Character'Pos (Value (Item)))
         );
      end loop;
      return Result (Result'First..Pointer - 1);
   end To_UTF8;

   function To_String (Value : String) return String is
      Result  : String (1..Value'Length);
      Pointer : Integer := Value'First;
      Index   : Integer := Result'First;
      Item    : UTF8_Code_Point;
   begin
      while Pointer <= Value'Last loop
         Get (Value, Pointer, Item);
         if Item > 16#FF# then
            raise Constraint_Error;
         end if;
         Result (Index) := Character'Val (Item);
         Index := Index + 1;
      end loop;
      return Result (Result'First..Index - 1);
   end To_String;

   function To_String
            (  Value      : String;
               Substitute : Character
            )  return String is
      Result  : String (1..Value'Length);
      Pointer : Integer := Value'First;
      Index   : Integer := Result'First;
      Item    : UTF8_Code_Point;
   begin
      while Pointer <= Value'Last loop
         Get (Value, Pointer, Item);
         if Item > 16#FF# then
            Result (Index) := Substitute;
         else
            Result (Index) := Character'Val (Item);
         end if;
         Index := Index + 1;
      end loop;
      return Result (Result'First..Index - 1);
   end To_String;

   function To_Wide_String (Value : String) return Wide_String is
      Result  : Wide_String (1..Value'Length);
      Pointer : Integer := Value'First;
      Index   : Integer := Result'First;
      Item    : UTF8_Code_Point;
   begin
      while Pointer <= Value'Last loop
         Get (Value, Pointer, Item);
         if Item > 16#FFFF# then
            raise Constraint_Error;
         end if;
         Result (Index) := Wide_Character'Val (Item);
         Index := Index + 1;
      end loop;
      return Result (Result'First..Index - 1);
   end To_Wide_String;

   function To_Wide_String
            (  Value      : String;
               Substitute : Wide_Character
            )  return Wide_String is
      Result  : Wide_String (1..Value'Length);
      Pointer : Integer := Value'First;
      Index   : Integer := Result'First;
      Item    : UTF8_Code_Point;
   begin
      while Pointer <= Value'Last loop
         Get (Value, Pointer, Item);
         if Item > 16#FFFF# then
            Result (Index) := Substitute;
         else
            Result (Index) := Wide_Character'Val (Item);
         end if;
         Index := Index + 1;
      end loop;
      return Result (Result'First..Index - 1);
   end To_Wide_String;

end Strings_Edit.UTF8.Handling;