* config/rs6000/predicates.md (branch_comparison_operator): Change
[official-gcc.git] / gcc / ada / s-wchstw.adb
blob0deb55631e2f3faa26af5928640fc14b09fd6183
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUNTIME COMPONENTS --
4 -- --
5 -- S Y S T E M . W C H _ S T W --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1992-2005 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 ------------------------------------------------------------------------------
34 with System.WCh_Con; use System.WCh_Con;
35 with System.WCh_Cnv; use System.WCh_Cnv;
37 package body System.WCh_StW is
39 -----------------------
40 -- Local Subprograms --
41 -----------------------
43 procedure Get_Next_Code
44 (S : String;
45 P : in out Natural;
46 V : out UTF_32_Code;
47 EM : WC_Encoding_Method);
48 -- Scans next character starting at S(P) and returns its value in V. On
49 -- exit P is updated past the last character read. Raises Constraint_Error
50 -- if the string is not well formed. Raises Constraint_Error if the code
51 -- value is greater than 16#7FFF_FFFF#. On entry P <= S'Last.
53 -------------------
54 -- Get_Next_Code --
55 -------------------
57 procedure Get_Next_Code
58 (S : String;
59 P : in out Natural;
60 V : out UTF_32_Code;
61 EM : WC_Encoding_Method)
63 function In_Char return Character;
64 -- Function to return a character, bumping P, raises Constraint_Error
65 -- if P > S'Last on entry.
67 function Get_UTF_32 is new Char_Sequence_To_UTF_32 (In_Char);
68 -- Function to get next UFT_32 value.
70 -------------
71 -- In_Char --
72 -------------
74 function In_Char return Character is
75 begin
76 if P > S'Last then
77 raise Constraint_Error;
78 else
79 P := P + 1;
80 return S (P - 1);
81 end if;
82 end In_Char;
84 begin
85 -- Check for wide character encoding
87 case EM is
88 when WCEM_Hex =>
89 if S (P) = ASCII.ESC then
90 V := Get_UTF_32 (In_Char, EM);
91 return;
92 end if;
94 when WCEM_Upper | WCEM_Shift_JIS | WCEM_EUC | WCEM_UTF8 =>
95 if S (P) >= Character'Val (16#80#) then
96 V := Get_UTF_32 (In_Char, EM);
97 return;
98 end if;
100 when WCEM_Brackets =>
101 if P + 2 <= S'Last
102 and then S (P) = '['
103 and then S (P + 1) = '"'
104 and then S (P + 2) /= '"'
105 then
106 V := Get_UTF_32 (In_Char, EM);
107 return;
108 end if;
109 end case;
111 -- If it is not a wide character code, just get it
113 V := Character'Pos (S (P));
114 P := P + 1;
115 end Get_Next_Code;
117 ---------------------------
118 -- String_To_Wide_String --
119 ---------------------------
121 function String_To_Wide_String
122 (S : String;
123 EM : WC_Encoding_Method) return Wide_String
125 R : Wide_String (1 .. S'Length);
126 RP : Natural;
127 SP : Natural;
128 V : UTF_32_Code;
130 begin
131 SP := S'First;
132 RP := 0;
133 while SP <= S'Last loop
134 Get_Next_Code (S, SP, V, EM);
136 if V > 16#FFFF# then
137 raise Constraint_Error;
138 end if;
140 RP := RP + 1;
141 R (RP) := Wide_Character'Val (V);
142 end loop;
144 return R (1 .. RP);
145 end String_To_Wide_String;
147 --------------------------------
148 -- String_To_Wide_Wide_String --
149 --------------------------------
151 function String_To_Wide_Wide_String
152 (S : String;
153 EM : WC_Encoding_Method) return Wide_Wide_String
155 R : Wide_Wide_String (1 .. S'Length);
156 RP : Natural;
157 SP : Natural;
158 V : UTF_32_Code;
160 begin
161 SP := S'First;
162 RP := 0;
163 while SP <= S'Last loop
164 Get_Next_Code (S, SP, V, EM);
165 RP := RP + 1;
166 R (RP) := Wide_Wide_Character'Val (V);
167 end loop;
169 return R (1 .. RP);
170 end String_To_Wide_Wide_String;
172 end System.WCh_StW;