annotate gcc/ada/lib-util.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- L I B . U T I L --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Hostparm;
kono
parents:
diff changeset
27 with Osint.C; use Osint.C;
kono
parents:
diff changeset
28 with Stringt; use Stringt;
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 package body Lib.Util is
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 Max_Line : constant Natural := 2 * Hostparm.Max_Name_Length + 64;
kono
parents:
diff changeset
33 Max_Buffer : constant Natural := 1000 * Max_Line;
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 Info_Buffer : String (1 .. Max_Buffer);
kono
parents:
diff changeset
36 -- Info_Buffer used to prepare lines of library output
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 Info_Buffer_Len : Natural := 0;
kono
parents:
diff changeset
39 -- Number of characters stored in Info_Buffer
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 Info_Buffer_Col : Natural := 1;
kono
parents:
diff changeset
42 -- Column number of next character to be written.
kono
parents:
diff changeset
43 -- Can be different from Info_Buffer_Len + 1 because of tab characters
kono
parents:
diff changeset
44 -- written by Write_Info_Tab.
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 procedure Write_Info_Hex_Byte (J : Natural);
kono
parents:
diff changeset
47 -- Place two hex digits representing the value J (which is in the range
kono
parents:
diff changeset
48 -- 0-255) in Info_Buffer, incrementing Info_Buffer_Len by 2. The digits
kono
parents:
diff changeset
49 -- are output using lower case letters.
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 ---------------------
kono
parents:
diff changeset
52 -- Write_Info_Char --
kono
parents:
diff changeset
53 ---------------------
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 procedure Write_Info_Char (C : Character) is
kono
parents:
diff changeset
56 begin
kono
parents:
diff changeset
57 Info_Buffer_Len := Info_Buffer_Len + 1;
kono
parents:
diff changeset
58 Info_Buffer (Info_Buffer_Len) := C;
kono
parents:
diff changeset
59 Info_Buffer_Col := Info_Buffer_Col + 1;
kono
parents:
diff changeset
60 end Write_Info_Char;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 --------------------------
kono
parents:
diff changeset
63 -- Write_Info_Char_Code --
kono
parents:
diff changeset
64 --------------------------
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 procedure Write_Info_Char_Code (Code : Char_Code) is
kono
parents:
diff changeset
67 begin
kono
parents:
diff changeset
68 -- 00 .. 7F
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 if Code <= 16#7F# then
kono
parents:
diff changeset
71 Write_Info_Char (Character'Val (Code));
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 -- 80 .. FF
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 elsif Code <= 16#FF# then
kono
parents:
diff changeset
76 Write_Info_Char ('U');
kono
parents:
diff changeset
77 Write_Info_Hex_Byte (Natural (Code));
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 -- 0100 .. FFFF
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 else
kono
parents:
diff changeset
82 Write_Info_Char ('W');
kono
parents:
diff changeset
83 Write_Info_Hex_Byte (Natural (Code / 256));
kono
parents:
diff changeset
84 Write_Info_Hex_Byte (Natural (Code mod 256));
kono
parents:
diff changeset
85 end if;
kono
parents:
diff changeset
86 end Write_Info_Char_Code;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 --------------------
kono
parents:
diff changeset
89 -- Write_Info_Col --
kono
parents:
diff changeset
90 --------------------
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 function Write_Info_Col return Positive is
kono
parents:
diff changeset
93 begin
kono
parents:
diff changeset
94 return Info_Buffer_Col;
kono
parents:
diff changeset
95 end Write_Info_Col;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 --------------------
kono
parents:
diff changeset
98 -- Write_Info_EOL --
kono
parents:
diff changeset
99 --------------------
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 procedure Write_Info_EOL is
kono
parents:
diff changeset
102 begin
kono
parents:
diff changeset
103 if Info_Buffer_Len + Max_Line + 1 > Max_Buffer then
kono
parents:
diff changeset
104 Write_Info_Terminate;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 else
kono
parents:
diff changeset
107 -- Delete any trailing blanks
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 while Info_Buffer_Len > 0
kono
parents:
diff changeset
110 and then Info_Buffer (Info_Buffer_Len) = ' '
kono
parents:
diff changeset
111 loop
kono
parents:
diff changeset
112 Info_Buffer_Len := Info_Buffer_Len - 1;
kono
parents:
diff changeset
113 end loop;
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 Info_Buffer_Len := Info_Buffer_Len + 1;
kono
parents:
diff changeset
116 Info_Buffer (Info_Buffer_Len) := ASCII.LF;
kono
parents:
diff changeset
117 Info_Buffer_Col := 1;
kono
parents:
diff changeset
118 end if;
kono
parents:
diff changeset
119 end Write_Info_EOL;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 -------------------------
kono
parents:
diff changeset
122 -- Write_Info_Hex_Byte --
kono
parents:
diff changeset
123 -------------------------
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 procedure Write_Info_Hex_Byte (J : Natural) is
kono
parents:
diff changeset
126 Hexd : constant array (0 .. 15) of Character := "0123456789abcdef";
kono
parents:
diff changeset
127 begin
kono
parents:
diff changeset
128 Write_Info_Char (Hexd (J / 16));
kono
parents:
diff changeset
129 Write_Info_Char (Hexd (J mod 16));
kono
parents:
diff changeset
130 end Write_Info_Hex_Byte;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 -------------------------
kono
parents:
diff changeset
133 -- Write_Info_Initiate --
kono
parents:
diff changeset
134 -------------------------
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 procedure Write_Info_Initiate (Key : Character) renames Write_Info_Char;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 --------------------
kono
parents:
diff changeset
139 -- Write_Info_Int --
kono
parents:
diff changeset
140 --------------------
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 procedure Write_Info_Int (N : Int) is
kono
parents:
diff changeset
143 begin
kono
parents:
diff changeset
144 if N >= 0 then
kono
parents:
diff changeset
145 Write_Info_Nat (N);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 -- Negative numbers, use Write_Info_Uint to avoid problems with largest
kono
parents:
diff changeset
148 -- negative number.
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 else
kono
parents:
diff changeset
151 Write_Info_Uint (UI_From_Int (N));
kono
parents:
diff changeset
152 end if;
kono
parents:
diff changeset
153 end Write_Info_Int;
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 ---------------------
kono
parents:
diff changeset
156 -- Write_Info_Name --
kono
parents:
diff changeset
157 ---------------------
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 procedure Write_Info_Name (Name : Name_Id) is
kono
parents:
diff changeset
160 begin
kono
parents:
diff changeset
161 Get_Name_String (Name);
kono
parents:
diff changeset
162 Info_Buffer (Info_Buffer_Len + 1 .. Info_Buffer_Len + Name_Len) :=
kono
parents:
diff changeset
163 Name_Buffer (1 .. Name_Len);
kono
parents:
diff changeset
164 Info_Buffer_Len := Info_Buffer_Len + Name_Len;
kono
parents:
diff changeset
165 Info_Buffer_Col := Info_Buffer_Col + Name_Len;
kono
parents:
diff changeset
166 end Write_Info_Name;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 procedure Write_Info_Name (Name : File_Name_Type) is
kono
parents:
diff changeset
169 begin
kono
parents:
diff changeset
170 Write_Info_Name (Name_Id (Name));
kono
parents:
diff changeset
171 end Write_Info_Name;
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 procedure Write_Info_Name (Name : Unit_Name_Type) is
kono
parents:
diff changeset
174 begin
kono
parents:
diff changeset
175 Write_Info_Name (Name_Id (Name));
kono
parents:
diff changeset
176 end Write_Info_Name;
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 -----------------------------------
kono
parents:
diff changeset
179 -- Write_Info_Name_May_Be_Quoted --
kono
parents:
diff changeset
180 -----------------------------------
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 procedure Write_Info_Name_May_Be_Quoted (Name : File_Name_Type) is
kono
parents:
diff changeset
183 Quoted : Boolean := False;
kono
parents:
diff changeset
184 Cur : Positive;
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 begin
kono
parents:
diff changeset
187 Get_Name_String (Name);
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 -- The file/path name is quoted only if it includes spaces
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 for J in 1 .. Name_Len loop
kono
parents:
diff changeset
192 if Name_Buffer (J) = ' ' then
kono
parents:
diff changeset
193 Quoted := True;
kono
parents:
diff changeset
194 exit;
kono
parents:
diff changeset
195 end if;
kono
parents:
diff changeset
196 end loop;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 -- Deal with quoting string if needed
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 if Quoted then
kono
parents:
diff changeset
201 Insert_Str_In_Name_Buffer ("""", 1);
kono
parents:
diff changeset
202 Add_Char_To_Name_Buffer ('"');
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 -- Any character '"' is doubled
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 Cur := 2;
kono
parents:
diff changeset
207 while Cur < Name_Len loop
kono
parents:
diff changeset
208 if Name_Buffer (Cur) = '"' then
kono
parents:
diff changeset
209 Insert_Str_In_Name_Buffer ("""", Cur);
kono
parents:
diff changeset
210 Cur := Cur + 2;
kono
parents:
diff changeset
211 else
kono
parents:
diff changeset
212 Cur := Cur + 1;
kono
parents:
diff changeset
213 end if;
kono
parents:
diff changeset
214 end loop;
kono
parents:
diff changeset
215 end if;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 Info_Buffer (Info_Buffer_Len + 1 .. Info_Buffer_Len + Name_Len) :=
kono
parents:
diff changeset
218 Name_Buffer (1 .. Name_Len);
kono
parents:
diff changeset
219 Info_Buffer_Len := Info_Buffer_Len + Name_Len;
kono
parents:
diff changeset
220 Info_Buffer_Col := Info_Buffer_Col + Name_Len;
kono
parents:
diff changeset
221 end Write_Info_Name_May_Be_Quoted;
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 --------------------
kono
parents:
diff changeset
224 -- Write_Info_Nat --
kono
parents:
diff changeset
225 --------------------
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 procedure Write_Info_Nat (N : Nat) is
kono
parents:
diff changeset
228 begin
kono
parents:
diff changeset
229 if N > 9 then
kono
parents:
diff changeset
230 Write_Info_Nat (N / 10);
kono
parents:
diff changeset
231 end if;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 Write_Info_Char (Character'Val (N mod 10 + Character'Pos ('0')));
kono
parents:
diff changeset
234 end Write_Info_Nat;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 ---------------------
kono
parents:
diff changeset
237 -- Write_Info_Slit --
kono
parents:
diff changeset
238 ---------------------
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 procedure Write_Info_Slit (S : String_Id) is
kono
parents:
diff changeset
241 C : Character;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 begin
kono
parents:
diff changeset
244 Write_Info_Str ("""");
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 for J in 1 .. String_Length (S) loop
kono
parents:
diff changeset
247 C := Get_Character (Get_String_Char (S, J));
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 if C in Character'Val (16#20#) .. Character'Val (16#7E#)
kono
parents:
diff changeset
250 and then C /= '{'
kono
parents:
diff changeset
251 then
kono
parents:
diff changeset
252 Write_Info_Char (C);
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 if C = '"' then
kono
parents:
diff changeset
255 Write_Info_Char (C);
kono
parents:
diff changeset
256 end if;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 else
kono
parents:
diff changeset
259 Write_Info_Char ('{');
kono
parents:
diff changeset
260 Write_Info_Hex_Byte (Character'Pos (C));
kono
parents:
diff changeset
261 Write_Info_Char ('}');
kono
parents:
diff changeset
262 end if;
kono
parents:
diff changeset
263 end loop;
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 Write_Info_Char ('"');
kono
parents:
diff changeset
266 end Write_Info_Slit;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 --------------------
kono
parents:
diff changeset
269 -- Write_Info_Str --
kono
parents:
diff changeset
270 --------------------
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 procedure Write_Info_Str (Val : String) is
kono
parents:
diff changeset
273 begin
kono
parents:
diff changeset
274 Info_Buffer (Info_Buffer_Len + 1 .. Info_Buffer_Len + Val'Length)
kono
parents:
diff changeset
275 := Val;
kono
parents:
diff changeset
276 Info_Buffer_Len := Info_Buffer_Len + Val'Length;
kono
parents:
diff changeset
277 Info_Buffer_Col := Info_Buffer_Col + Val'Length;
kono
parents:
diff changeset
278 end Write_Info_Str;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 --------------------
kono
parents:
diff changeset
281 -- Write_Info_Tab --
kono
parents:
diff changeset
282 --------------------
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 procedure Write_Info_Tab (Col : Positive) is
kono
parents:
diff changeset
285 Next_Tab : Positive;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 begin
kono
parents:
diff changeset
288 if Col <= Info_Buffer_Col then
kono
parents:
diff changeset
289 Write_Info_Str (" ");
kono
parents:
diff changeset
290 else
kono
parents:
diff changeset
291 loop
kono
parents:
diff changeset
292 Next_Tab := 8 * ((Info_Buffer_Col - 1) / 8) + 8 + 1;
kono
parents:
diff changeset
293 exit when Col < Next_Tab;
kono
parents:
diff changeset
294 Write_Info_Char (ASCII.HT);
kono
parents:
diff changeset
295 Info_Buffer_Col := Next_Tab;
kono
parents:
diff changeset
296 end loop;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 while Info_Buffer_Col < Col loop
kono
parents:
diff changeset
299 Write_Info_Char (' ');
kono
parents:
diff changeset
300 end loop;
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302 end Write_Info_Tab;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 --------------------------
kono
parents:
diff changeset
305 -- Write_Info_Terminate --
kono
parents:
diff changeset
306 --------------------------
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 procedure Write_Info_Terminate is
kono
parents:
diff changeset
309 begin
kono
parents:
diff changeset
310 -- Delete any trailing blanks
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 while Info_Buffer_Len > 0
kono
parents:
diff changeset
313 and then Info_Buffer (Info_Buffer_Len) = ' '
kono
parents:
diff changeset
314 loop
kono
parents:
diff changeset
315 Info_Buffer_Len := Info_Buffer_Len - 1;
kono
parents:
diff changeset
316 end loop;
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 -- Write_Library_Info adds the EOL
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 Write_Library_Info (Info_Buffer (1 .. Info_Buffer_Len));
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 Info_Buffer_Len := 0;
kono
parents:
diff changeset
323 Info_Buffer_Col := 1;
kono
parents:
diff changeset
324 end Write_Info_Terminate;
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 ---------------------
kono
parents:
diff changeset
327 -- Write_Info_Uint --
kono
parents:
diff changeset
328 ---------------------
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 procedure Write_Info_Uint (N : Uint) is
kono
parents:
diff changeset
331 begin
kono
parents:
diff changeset
332 UI_Image (N, Decimal);
kono
parents:
diff changeset
333 Write_Info_Str (UI_Image_Buffer (1 .. UI_Image_Length));
kono
parents:
diff changeset
334 end Write_Info_Uint;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 end Lib.Util;