OSDN Git Service

PR middle-end/42068
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-imgwch.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT RUN-TIME COMPONENTS                         --
4 --                                                                          --
5 --                     S Y S T E M . I M G _ W C H A R                      --
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 Interfaces; use Interfaces;
33
34 with System.Img_Char; use System.Img_Char;
35
36 package body System.Img_WChar is
37
38    --------------------------
39    -- Image_Wide_Character --
40    --------------------------
41
42    procedure Image_Wide_Character
43      (V        : Wide_Character;
44       S        : in out String;
45       P        : out Natural;
46       Ada_2005 : Boolean)
47    is
48       pragma Assert (S'First = 1);
49
50    begin
51       --  Annoying Ada 95 incompatibility with FFFE/FFFF
52
53       if V >= Wide_Character'Val (16#FFFE#)
54         and then not Ada_2005
55       then
56          if V = Wide_Character'Val (16#FFFE#) then
57             S (1 .. 4) := "FFFE";
58          else
59             S (1 .. 4) := "FFFF";
60          end if;
61
62          P := 4;
63
64       --  Normal case, same as Wide_Wide_Character
65
66       else
67          Image_Wide_Wide_Character
68            (Wide_Wide_Character'Val (Wide_Character'Pos (V)), S, P);
69       end if;
70    end Image_Wide_Character;
71
72    -------------------------------
73    -- Image_Wide_Wide_Character --
74    -------------------------------
75
76    procedure Image_Wide_Wide_Character
77      (V : Wide_Wide_Character;
78       S : in out String;
79       P : out Natural)
80    is
81       pragma Assert (S'First = 1);
82
83       Val : Unsigned_32 := Wide_Wide_Character'Pos (V);
84
85    begin
86       --  If in range of standard Character, use Character routine
87
88       if Val <= 16#FF# then
89          Image_Character (Character'Val (Wide_Wide_Character'Pos (V)), S, P);
90
91       --  Otherwise value returned is Hex_hhhhhhhh
92
93       else
94          declare
95             Hex : constant array (Unsigned_32 range 0 .. 15) of Character :=
96                     "0123456789ABCDEF";
97
98          begin
99             S (1 .. 4) := "Hex_";
100
101             for J in reverse 5 .. 12 loop
102                S (J) := Hex (Val mod 16);
103                Val := Val / 16;
104             end loop;
105
106             P := 12;
107          end;
108       end if;
109    end Image_Wide_Wide_Character;
110
111 end System.Img_WChar;