OSDN Git Service

* sem_ch3.adb (Find_Type_Of_Subtype_Indic): If subtype indication
[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 --                            $Revision: 1.15 $
10 --                                                                          --
11 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
12 --                                                                          --
13 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
14 -- terms of the  GNU General Public License as published  by the Free Soft- --
15 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
16 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
17 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
18 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
19 -- for  more details.  You should have  received  a copy of the GNU General --
20 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
21 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
22 -- MA 02111-1307, USA.                                                      --
23 --                                                                          --
24 -- As a special exception,  if other files  instantiate  generics from this --
25 -- unit, or you link  this unit with other files  to produce an executable, --
26 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
27 -- covered  by the  GNU  General  Public  License.  This exception does not --
28 -- however invalidate  any other reasons why  the executable file  might be --
29 -- covered by the  GNU Public License.                                      --
30 --                                                                          --
31 -- GNAT was originally developed  by the GNAT team at  New York University. --
32 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
33 --                                                                          --
34 ------------------------------------------------------------------------------
35
36 --  Note: this package uses the generic subprograms in System.Wch_Cnv, which
37 --  completely encapsulate the set of wide character encoding methods, so no
38 --  modifications are required when adding new encoding methods.
39
40 with Opt; use Opt;
41
42 with System.WCh_Cnv; use System.WCh_Cnv;
43 with System.WCh_Con; use System.WCh_Con;
44
45 package body Widechar is
46
47    ---------------------------
48    -- Is_Start_Of_Wide_Char --
49    ---------------------------
50
51    function Is_Start_Of_Wide_Char
52      (S    : Source_Buffer_Ptr;
53       P    : Source_Ptr)
54       return Boolean
55    is
56    begin
57       case Wide_Character_Encoding_Method is
58          when WCEM_Hex =>
59             return S (P) = ASCII.ESC;
60
61          when WCEM_Upper     |
62               WCEM_Shift_JIS |
63               WCEM_EUC       |
64               WCEM_UTF8      =>
65             return S (P) >= Character'Val (16#80#);
66
67          when WCEM_Brackets =>
68             return P <= S'Last - 2
69               and then S (P) = '['
70               and then S (P + 1) = '"'
71               and then S (P + 2) /= '"';
72       end case;
73    end Is_Start_Of_Wide_Char;
74
75    -----------------
76    -- Length_Wide --
77    -----------------
78
79    function Length_Wide return Nat is
80    begin
81       return WC_Longest_Sequence;
82    end Length_Wide;
83
84    ---------------
85    -- Scan_Wide --
86    ---------------
87
88    procedure Scan_Wide
89      (S   : Source_Buffer_Ptr;
90       P   : in out Source_Ptr;
91       C   : out Char_Code;
92       Err : out Boolean)
93    is
94       function In_Char return Character;
95       --  Function to obtain characters of wide character escape sequence
96
97       function In_Char return Character is
98       begin
99          P := P + 1;
100          return S (P - 1);
101       end In_Char;
102
103       function WC_In is new Char_Sequence_To_Wide_Char (In_Char);
104
105    begin
106       C := Char_Code (Wide_Character'Pos
107                        (WC_In (In_Char, Wide_Character_Encoding_Method)));
108       Err := False;
109
110    exception
111       when Constraint_Error =>
112          C := Char_Code (0);
113          P := P - 1;
114          Err := True;
115    end Scan_Wide;
116
117    --------------
118    -- Set_Wide --
119    --------------
120
121    procedure Set_Wide
122      (C : Char_Code;
123       S : in out String;
124       P : in out Natural)
125    is
126       procedure Out_Char (C : Character);
127       --  Procedure to store one character of wide character sequence
128
129       procedure Out_Char (C : Character) is
130       begin
131          P := P + 1;
132          S (P) := C;
133       end Out_Char;
134
135       procedure WC_Out is new Wide_Char_To_Char_Sequence (Out_Char);
136
137    begin
138       WC_Out (Wide_Character'Val (C), Wide_Character_Encoding_Method);
139    end Set_Wide;
140
141    ---------------
142    -- Skip_Wide --
143    ---------------
144
145    procedure Skip_Wide (S : String; P : in out Natural) is
146       function Skip_Char return Character;
147       --  Function to skip one character of wide character escape sequence
148
149       function Skip_Char return Character is
150       begin
151          P := P + 1;
152          return S (P - 1);
153       end Skip_Char;
154
155       function WC_Skip is new Char_Sequence_To_Wide_Char (Skip_Char);
156
157       Discard : Wide_Character;
158
159    begin
160       Discard := WC_Skip (Skip_Char, Wide_Character_Encoding_Method);
161    end Skip_Wide;
162
163 end Widechar;