OSDN Git Service

./:
[pf3gnuchains/gcc-fork.git] / gcc / ada / widechar.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             W I D E C H A R                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2006, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
19 -- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
20 -- Boston, MA 02110-1301, USA.                                              --
21 --                                                                          --
22 -- As a special exception,  if other files  instantiate  generics from this --
23 -- unit, or you link  this unit with other files  to produce an executable, --
24 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
25 -- covered  by the  GNU  General  Public  License.  This exception does not --
26 -- however invalidate  any other reasons why  the executable file  might be --
27 -- covered by the  GNU Public License.                                      --
28 --                                                                          --
29 -- GNAT was originally developed  by the GNAT team at  New York University. --
30 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
31 --                                                                          --
32 ------------------------------------------------------------------------------
33
34 --  Note: this package uses the generic subprograms in System.Wch_Cnv, which
35 --  completely encapsulate the set of wide character encoding methods, so no
36 --  modifications are required when adding new encoding methods.
37
38 with Opt; use Opt;
39
40 with System.WCh_Cnv; use System.WCh_Cnv;
41 with System.WCh_Con; use System.WCh_Con;
42
43 package body Widechar is
44
45    ---------------------------
46    -- Is_Start_Of_Wide_Char --
47    ---------------------------
48
49    function Is_Start_Of_Wide_Char
50      (S : Source_Buffer_Ptr;
51       P : Source_Ptr) return Boolean
52    is
53    begin
54       case Wide_Character_Encoding_Method is
55
56          --  For Hex mode, just test for an ESC character. The ESC character
57          --  cannot appear in any other context in a legal Ada program.
58
59          when WCEM_Hex =>
60             return S (P) = ASCII.ESC;
61
62          --  For brackets, just test ["x where x is a hex character. This is
63          --  sufficient test, since this sequence cannot otherwise appear in a
64          --  legal Ada program.
65
66          when WCEM_Brackets =>
67             return P <= S'Last - 2
68               and then S (P) = '['
69               and then S (P + 1) = '"'
70               and then (S (P + 2) in '0' .. '9'
71                             or else
72                            S (P + 2) in 'a' .. 'f'
73                             or else
74                         S (P + 2) in 'A' .. 'F');
75
76          --  All other encoding methods use the upper bit set in the first
77          --  character to uniquely represent a wide character.
78
79          when WCEM_Upper     |
80               WCEM_Shift_JIS |
81               WCEM_EUC       |
82               WCEM_UTF8      =>
83             return S (P) >= Character'Val (16#80#);
84       end case;
85    end Is_Start_Of_Wide_Char;
86
87    -----------------
88    -- Length_Wide --
89    -----------------
90
91    function Length_Wide return Nat is
92    begin
93       return WC_Longest_Sequence;
94    end Length_Wide;
95
96    ---------------
97    -- Scan_Wide --
98    ---------------
99
100    procedure Scan_Wide
101      (S   : Source_Buffer_Ptr;
102       P   : in out Source_Ptr;
103       C   : out Char_Code;
104       Err : out Boolean)
105    is
106       P_Init : constant Source_Ptr := P;
107       Chr    : Character;
108
109       function In_Char return Character;
110       --  Function to obtain characters of wide character escape sequence
111
112       -------------
113       -- In_Char --
114       -------------
115
116       function In_Char return Character is
117       begin
118          P := P + 1;
119          return S (P - 1);
120       end In_Char;
121
122       function WC_In is new Char_Sequence_To_UTF_32 (In_Char);
123
124    --  Start of processingf for Scan_Wide
125
126    begin
127       Chr := In_Char;
128
129       --  Scan out the wide character. if the first character is a bracket,
130       --  we allow brackets encoding regardless of the standard encoding
131       --  method being used, but otherwise we use this standard method.
132
133       if Chr = '[' then
134          C := Char_Code (WC_In (Chr, WCEM_Brackets));
135       else
136          C := Char_Code (WC_In (Chr, Wide_Character_Encoding_Method));
137       end if;
138
139       Err := False;
140       Wide_Char_Byte_Count := Wide_Char_Byte_Count + Nat (P - P_Init - 1);
141
142    exception
143       when Constraint_Error =>
144          C := Char_Code (0);
145          P := P - 1;
146          Err := True;
147    end Scan_Wide;
148
149    --------------
150    -- Set_Wide --
151    --------------
152
153    procedure Set_Wide
154      (C : Char_Code;
155       S : in out String;
156       P : in out Natural)
157    is
158       procedure Out_Char (C : Character);
159       --  Procedure to store one character of wide character sequence
160
161       --------------
162       -- Out_Char --
163       --------------
164
165       procedure Out_Char (C : Character) is
166       begin
167          P := P + 1;
168          S (P) := C;
169       end Out_Char;
170
171       procedure WC_Out is new UTF_32_To_Char_Sequence (Out_Char);
172
173    --  Start of processing for Set_Wide
174
175    begin
176       WC_Out (UTF_32_Code (C), Wide_Character_Encoding_Method);
177    end Set_Wide;
178
179    ---------------
180    -- Skip_Wide --
181    ---------------
182
183    procedure Skip_Wide (S : String; P : in out Natural) is
184       P_Init : constant Natural := P;
185
186       function Skip_Char return Character;
187       --  Function to skip one character of wide character escape sequence
188
189       ---------------
190       -- Skip_Char --
191       ---------------
192
193       function Skip_Char return Character is
194       begin
195          P := P + 1;
196          return S (P - 1);
197       end Skip_Char;
198
199       function WC_Skip is new Char_Sequence_To_UTF_32 (Skip_Char);
200
201       Discard : UTF_32_Code;
202       pragma Warnings (Off, Discard);
203
204    --  Start of processing for Skip_Wide
205
206    begin
207       Discard := WC_Skip (Skip_Char, Wide_Character_Encoding_Method);
208       Wide_Char_Byte_Count := Wide_Char_Byte_Count + Nat (P - P_Init - 1);
209    end Skip_Wide;
210
211    ---------------
212    -- Skip_Wide --
213    ---------------
214
215    procedure Skip_Wide (S : Source_Buffer_Ptr; P : in out Source_Ptr) is
216       P_Init : constant Source_Ptr := P;
217
218       function Skip_Char return Character;
219       --  Function to skip one character of wide character escape sequence
220
221       ---------------
222       -- Skip_Char --
223       ---------------
224
225       function Skip_Char return Character is
226       begin
227          P := P + 1;
228          return S (P - 1);
229       end Skip_Char;
230
231       function WC_Skip is new Char_Sequence_To_UTF_32 (Skip_Char);
232
233       Discard : UTF_32_Code;
234       pragma Warnings (Off, Discard);
235
236    --  Start of processing for Skip_Wide
237
238    begin
239       Discard := WC_Skip (Skip_Char, Wide_Character_Encoding_Method);
240       Wide_Char_Byte_Count := Wide_Char_Byte_Count + Nat (P - P_Init - 1);
241    end Skip_Wide;
242
243 end Widechar;