OSDN Git Service

Add NIOS2 support. Code from SourceyG++.
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-wchstw.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT RUN-TIME 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-2009, 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 3,  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.                                     --
17 --                                                                          --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception,   --
20 -- version 3.1, as published by the Free Software Foundation.               --
21 --                                                                          --
22 -- You should have received a copy of the GNU General Public License and    --
23 -- a copy of the GCC Runtime Library Exception along with this program;     --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
25 -- <http://www.gnu.org/licenses/>.                                          --
26 --                                                                          --
27 -- GNAT was originally developed  by the GNAT team at  New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
29 --                                                                          --
30 ------------------------------------------------------------------------------
31
32 with System.WCh_Con; use System.WCh_Con;
33 with System.WCh_Cnv; use System.WCh_Cnv;
34
35 package body System.WCh_StW is
36
37    -----------------------
38    -- Local Subprograms --
39    -----------------------
40
41    procedure Get_Next_Code
42      (S  : String;
43       P  : in out Natural;
44       V  : out UTF_32_Code;
45       EM : WC_Encoding_Method);
46    --  Scans next character starting at S(P) and returns its value in V. On
47    --  exit P is updated past the last character read. Raises Constraint_Error
48    --  if the string is not well formed. Raises Constraint_Error if the code
49    --  value is greater than 16#7FFF_FFFF#. On entry P <= S'Last.
50
51    -------------------
52    -- Get_Next_Code --
53    -------------------
54
55    procedure Get_Next_Code
56      (S  : String;
57       P  : in out Natural;
58       V  : out UTF_32_Code;
59       EM : WC_Encoding_Method)
60    is
61       function In_Char return Character;
62       --  Function to return a character, bumping P, raises Constraint_Error
63       --  if P > S'Last on entry.
64
65       function Get_UTF_32 is new Char_Sequence_To_UTF_32 (In_Char);
66       --  Function to get next UFT_32 value
67
68       -------------
69       -- In_Char --
70       -------------
71
72       function In_Char return Character is
73       begin
74          if P > S'Last then
75             raise Constraint_Error with "badly formed wide character code";
76          else
77             P := P + 1;
78             return S (P - 1);
79          end if;
80       end In_Char;
81
82    --  Start of processing for Get_Next_Code
83
84    begin
85       --  Check for wide character encoding
86
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;
93
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;
99
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;
110
111       --  If it is not a wide character code, just get it
112
113       V := Character'Pos (S (P));
114       P := P + 1;
115    end Get_Next_Code;
116
117    ---------------------------
118    -- String_To_Wide_String --
119    ---------------------------
120
121    procedure String_To_Wide_String
122      (S  : String;
123       R  : out Wide_String;
124       L  : out Natural;
125       EM : System.WCh_Con.WC_Encoding_Method)
126    is
127       SP : Natural;
128       V  : UTF_32_Code;
129
130    begin
131       pragma Assert (S'First = 1);
132
133       SP := S'First;
134       L  := 0;
135       while SP <= S'Last loop
136          Get_Next_Code (S, SP, V, EM);
137
138          if V > 16#FFFF# then
139             raise Constraint_Error with
140               "out of range value for wide character";
141          end if;
142
143          L := L + 1;
144          R (L) := Wide_Character'Val (V);
145       end loop;
146    end String_To_Wide_String;
147
148    --------------------------------
149    -- String_To_Wide_Wide_String --
150    --------------------------------
151
152    procedure String_To_Wide_Wide_String
153      (S  : String;
154       R  : out Wide_Wide_String;
155       L  : out Natural;
156       EM : System.WCh_Con.WC_Encoding_Method)
157    is
158       pragma Assert (S'First = 1);
159
160       SP : Natural;
161       V  : UTF_32_Code;
162
163    begin
164       SP := S'First;
165       L := 0;
166       while SP <= S'Last loop
167          Get_Next_Code (S, SP, V, EM);
168          L := L + 1;
169          R (L) := Wide_Wide_Character'Val (V);
170       end loop;
171    end String_To_Wide_Wide_String;
172
173 end System.WCh_StW;