OSDN Git Service

optimize
[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-2002 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,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, 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)
52       return Boolean
53    is
54    begin
55       case Wide_Character_Encoding_Method is
56          when WCEM_Hex =>
57             return S (P) = ASCII.ESC;
58
59          when WCEM_Upper     |
60               WCEM_Shift_JIS |
61               WCEM_EUC       |
62               WCEM_UTF8      =>
63             return S (P) >= Character'Val (16#80#);
64
65          when WCEM_Brackets =>
66             return P <= S'Last - 2
67               and then S (P) = '['
68               and then S (P + 1) = '"'
69               and then S (P + 2) /= '"';
70       end case;
71    end Is_Start_Of_Wide_Char;
72
73    -----------------
74    -- Length_Wide --
75    -----------------
76
77    function Length_Wide return Nat is
78    begin
79       return WC_Longest_Sequence;
80    end Length_Wide;
81
82    ---------------
83    -- Scan_Wide --
84    ---------------
85
86    procedure Scan_Wide
87      (S   : Source_Buffer_Ptr;
88       P   : in out Source_Ptr;
89       C   : out Char_Code;
90       Err : out Boolean)
91    is
92       function In_Char return Character;
93       --  Function to obtain characters of wide character escape sequence
94
95       function In_Char return Character is
96       begin
97          P := P + 1;
98          return S (P - 1);
99       end In_Char;
100
101       function WC_In is new Char_Sequence_To_Wide_Char (In_Char);
102
103    begin
104       C := Char_Code (Wide_Character'Pos
105                        (WC_In (In_Char, Wide_Character_Encoding_Method)));
106       Err := False;
107
108    exception
109       when Constraint_Error =>
110          C := Char_Code (0);
111          P := P - 1;
112          Err := True;
113    end Scan_Wide;
114
115    --------------
116    -- Set_Wide --
117    --------------
118
119    procedure Set_Wide
120      (C : Char_Code;
121       S : in out String;
122       P : in out Natural)
123    is
124       procedure Out_Char (C : Character);
125       --  Procedure to store one character of wide character sequence
126
127       procedure Out_Char (C : Character) is
128       begin
129          P := P + 1;
130          S (P) := C;
131       end Out_Char;
132
133       procedure WC_Out is new Wide_Char_To_Char_Sequence (Out_Char);
134
135    begin
136       WC_Out (Wide_Character'Val (C), Wide_Character_Encoding_Method);
137    end Set_Wide;
138
139    ---------------
140    -- Skip_Wide --
141    ---------------
142
143    procedure Skip_Wide (S : String; P : in out Natural) is
144       function Skip_Char return Character;
145       --  Function to skip one character of wide character escape sequence
146
147       function Skip_Char return Character is
148       begin
149          P := P + 1;
150          return S (P - 1);
151       end Skip_Char;
152
153       function WC_Skip is new Char_Sequence_To_Wide_Char (Skip_Char);
154
155       Discard : Wide_Character;
156       pragma Warnings (Off, Discard);
157
158    begin
159       Discard := WC_Skip (Skip_Char, Wide_Character_Encoding_Method);
160    end Skip_Wide;
161
162 end Widechar;