OSDN Git Service

Delete all lines containing "$Revision:".
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-wtcoau.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT RUNTIME COMPONENTS                          --
4 --                                                                          --
5 --         A D A . W I D E _ T E X T _ I O . C O M P L E X _ A U X          --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --                                                                          --
10 --   Copyright (C) 1992,1993,1994,1995,1996 Free Software Foundation, Inc.  --
11 --                                                                          --
12 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
13 -- terms of the  GNU General Public License as published  by the Free Soft- --
14 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
15 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
18 -- for  more details.  You should have  received  a copy of the GNU General --
19 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
20 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
21 -- MA 02111-1307, USA.                                                      --
22 --                                                                          --
23 -- As a special exception,  if other files  instantiate  generics from this --
24 -- unit, or you link  this unit with other files  to produce an executable, --
25 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
26 -- covered  by the  GNU  General  Public  License.  This exception does not --
27 -- however invalidate  any other reasons why  the executable file  might be --
28 -- covered by the  GNU Public License.                                      --
29 --                                                                          --
30 -- GNAT was originally developed  by the GNAT team at  New York University. --
31 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
32 --                                                                          --
33 ------------------------------------------------------------------------------
34
35 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
36 with Ada.Wide_Text_IO.Float_Aux;
37
38 with System.Img_Real; use System.Img_Real;
39
40 package body Ada.Wide_Text_IO.Complex_Aux is
41
42    package Aux renames Ada.Wide_Text_IO.Float_Aux;
43
44    ---------
45    -- Get --
46    ---------
47
48    procedure Get
49      (File  : in  File_Type;
50       ItemR : out Long_Long_Float;
51       ItemI : out Long_Long_Float;
52       Width : Field)
53    is
54       Buf   : String (1 .. Field'Last);
55       Stop  : Integer := 0;
56       Ptr   : aliased Integer;
57       Paren : Boolean := False;
58
59    begin
60       --  General note for following code, exceptions from the calls
61       --  to Get for components of the complex value are propagated.
62
63       if Width /= 0 then
64          Load_Width (File, Width, Buf, Stop);
65          Gets (Buf (1 .. Stop), ItemR, ItemI, Ptr);
66
67          for J in Ptr + 1 .. Stop loop
68             if not Is_Blank (Buf (J)) then
69                raise Data_Error;
70             end if;
71          end loop;
72
73       --  Case of width = 0
74
75       else
76          Load_Skip (File);
77          Ptr := 0;
78          Load (File, Buf, Ptr, '(', Paren);
79          Aux.Get (File, ItemR, 0);
80          Load_Skip (File);
81          Load (File, Buf, Ptr, ',');
82          Aux.Get (File, ItemI, 0);
83
84          if Paren then
85             Load_Skip (File);
86             Load (File, Buf, Ptr, ')', Paren);
87
88             if not Paren then
89                raise Data_Error;
90             end if;
91          end if;
92       end if;
93    end Get;
94
95    ----------
96    -- Gets --
97    ----------
98
99    procedure Gets
100      (From  : in String;
101       ItemR : out Long_Long_Float;
102       ItemI : out Long_Long_Float;
103       Last  : out Positive)
104    is
105       Paren : Boolean;
106       Pos   : Integer;
107
108    begin
109       String_Skip (From, Pos);
110
111       if From (Pos) = '(' then
112          Pos := Pos + 1;
113          Paren := True;
114       else
115          Paren := False;
116       end if;
117
118       Aux.Gets (From (Pos .. From'Last), ItemR, Pos);
119
120       String_Skip (From (Pos + 1 .. From'Last), Pos);
121
122       if From (Pos) = ',' then
123          Pos := Pos + 1;
124       end if;
125
126       Aux.Gets (From (Pos .. From'Last), ItemI, Pos);
127
128       if Paren then
129          String_Skip (From (Pos + 1 .. From'Last), Pos);
130
131          if From (Pos) /= ')' then
132             raise Data_Error;
133          end if;
134       end if;
135
136       Last := Pos;
137    end Gets;
138
139    ---------
140    -- Put --
141    ---------
142
143    procedure Put
144      (File  : File_Type;
145       ItemR : Long_Long_Float;
146       ItemI : Long_Long_Float;
147       Fore  : Field;
148       Aft   : Field;
149       Exp   : Field)
150    is
151    begin
152       Put (File, '(');
153       Aux.Put (File, ItemR, Fore, Aft, Exp);
154       Put (File, ',');
155       Aux.Put (File, ItemI, Fore, Aft, Exp);
156       Put (File, ')');
157    end Put;
158
159    ----------
160    -- Puts --
161    ----------
162
163    procedure Puts
164      (To    : out String;
165       ItemR : Long_Long_Float;
166       ItemI : Long_Long_Float;
167       Aft   : in  Field;
168       Exp   : in  Field)
169    is
170       I_String : String (1 .. 3 * Field'Last);
171       R_String : String (1 .. 3 * Field'Last);
172
173       Iptr : Natural;
174       Rptr : Natural;
175
176    begin
177       --  Both parts are initially converted with a Fore of 0
178
179       Rptr := 0;
180       Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
181       Iptr := 0;
182       Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
183
184       --  Check room for both parts plus parens plus comma (RM G.1.3(34))
185
186       if Rptr + Iptr + 3 > To'Length then
187          raise Layout_Error;
188       end if;
189
190       --  If there is room, layout result according to (RM G.1.3(31-33))
191
192       To (To'First) := '(';
193       To (To'First + 1 .. To'First + Rptr) := R_String (1 .. Rptr);
194       To (To'First + Rptr + 1) := ',';
195
196       To (To'Last) := ')';
197
198
199       To (To'Last - Iptr .. To'Last - 1) := I_String (1 .. Iptr);
200
201       for J in To'First + Rptr + 2 .. To'Last - Iptr - 1 loop
202          To (J) := ' ';
203       end loop;
204    end Puts;
205
206 end Ada.Wide_Text_IO.Complex_Aux;