annotate gcc/ada/libgnat/s-resfil.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S Y S T E M . R E S P O N S E _ F I L E --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2007-2018, 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. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 pragma Compiler_Unit_Warning;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with Ada.Unchecked_Deallocation;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 with System.OS_Lib; use System.OS_Lib;
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 package body System.Response_File is
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 type File_Rec;
kono
parents:
diff changeset
41 type File_Ptr is access File_Rec;
kono
parents:
diff changeset
42 type File_Rec is record
kono
parents:
diff changeset
43 Name : String_Access;
kono
parents:
diff changeset
44 Next : File_Ptr;
kono
parents:
diff changeset
45 Prev : File_Ptr;
kono
parents:
diff changeset
46 end record;
kono
parents:
diff changeset
47 -- To build a stack of response file names
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 procedure Free is new Ada.Unchecked_Deallocation (File_Rec, File_Ptr);
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 type Argument_List_Access is access Argument_List;
kono
parents:
diff changeset
52 procedure Free is new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
53 (Argument_List, Argument_List_Access);
kono
parents:
diff changeset
54 -- Free only the allocated Argument_List, not allocated String components
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 --------------------
kono
parents:
diff changeset
57 -- Arguments_From --
kono
parents:
diff changeset
58 --------------------
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 function Arguments_From
kono
parents:
diff changeset
61 (Response_File_Name : String;
kono
parents:
diff changeset
62 Recursive : Boolean := False;
kono
parents:
diff changeset
63 Ignore_Non_Existing_Files : Boolean := False)
kono
parents:
diff changeset
64 return Argument_List
kono
parents:
diff changeset
65 is
kono
parents:
diff changeset
66 First_File : File_Ptr := null;
kono
parents:
diff changeset
67 Last_File : File_Ptr := null;
kono
parents:
diff changeset
68 -- The stack of response files
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 Arguments : Argument_List_Access := new Argument_List (1 .. 4);
kono
parents:
diff changeset
71 Last_Arg : Natural := 0;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 procedure Add_Argument (Arg : String);
kono
parents:
diff changeset
74 -- Add argument Arg to argument list Arguments, increasing Arguments
kono
parents:
diff changeset
75 -- if necessary.
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 procedure Recurse (File_Name : String);
kono
parents:
diff changeset
78 -- Get the arguments from the file and call itself recursively if one of
kono
parents:
diff changeset
79 -- the arguments starts with character '@'.
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 ------------------
kono
parents:
diff changeset
82 -- Add_Argument --
kono
parents:
diff changeset
83 ------------------
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 procedure Add_Argument (Arg : String) is
kono
parents:
diff changeset
86 begin
kono
parents:
diff changeset
87 if Last_Arg = Arguments'Last then
kono
parents:
diff changeset
88 declare
kono
parents:
diff changeset
89 New_Arguments : constant Argument_List_Access :=
kono
parents:
diff changeset
90 new Argument_List (1 .. Arguments'Last * 2);
kono
parents:
diff changeset
91 begin
kono
parents:
diff changeset
92 New_Arguments (Arguments'Range) := Arguments.all;
kono
parents:
diff changeset
93 Arguments.all := (others => null);
kono
parents:
diff changeset
94 Free (Arguments);
kono
parents:
diff changeset
95 Arguments := New_Arguments;
kono
parents:
diff changeset
96 end;
kono
parents:
diff changeset
97 end if;
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 Last_Arg := Last_Arg + 1;
kono
parents:
diff changeset
100 Arguments (Last_Arg) := new String'(Arg);
kono
parents:
diff changeset
101 end Add_Argument;
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 -------------
kono
parents:
diff changeset
104 -- Recurse --
kono
parents:
diff changeset
105 -------------
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 procedure Recurse (File_Name : String) is
kono
parents:
diff changeset
108 -- Open the response file. If not found, fail or report a warning,
kono
parents:
diff changeset
109 -- depending on the value of Ignore_Non_Existing_Files.
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 FD : constant File_Descriptor := Open_Read (File_Name, Text);
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 Buffer_Size : constant := 1500;
kono
parents:
diff changeset
114 Buffer : String (1 .. Buffer_Size);
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 Buffer_Length : Natural;
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 Buffer_Cursor : Natural;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 End_Of_File_Reached : Boolean;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 Line : String (1 .. Max_Line_Length + 1);
kono
parents:
diff changeset
123 Last : Natural;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 First_Char : Positive;
kono
parents:
diff changeset
126 -- Index of the first character of an argument in Line
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 Last_Char : Natural;
kono
parents:
diff changeset
129 -- Index of the last character of an argument in Line
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 In_String : Boolean;
kono
parents:
diff changeset
132 -- True when inside a quoted string
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 Arg : Positive;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 function End_Of_File return Boolean;
kono
parents:
diff changeset
137 -- True when the end of the response file has been reached
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 procedure Get_Buffer;
kono
parents:
diff changeset
140 -- Read one buffer from the response file
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 procedure Get_Line;
kono
parents:
diff changeset
143 -- Get one line from the response file
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 -----------------
kono
parents:
diff changeset
146 -- End_Of_File --
kono
parents:
diff changeset
147 -----------------
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 function End_Of_File return Boolean is
kono
parents:
diff changeset
150 begin
kono
parents:
diff changeset
151 return End_Of_File_Reached and then Buffer_Cursor > Buffer_Length;
kono
parents:
diff changeset
152 end End_Of_File;
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 ----------------
kono
parents:
diff changeset
155 -- Get_Buffer --
kono
parents:
diff changeset
156 ----------------
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 procedure Get_Buffer is
kono
parents:
diff changeset
159 begin
kono
parents:
diff changeset
160 Buffer_Length := Read (FD, Buffer (1)'Address, Buffer'Length);
kono
parents:
diff changeset
161 End_Of_File_Reached := Buffer_Length < Buffer'Length;
kono
parents:
diff changeset
162 Buffer_Cursor := 1;
kono
parents:
diff changeset
163 end Get_Buffer;
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 --------------
kono
parents:
diff changeset
166 -- Get_Line --
kono
parents:
diff changeset
167 --------------
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 procedure Get_Line is
kono
parents:
diff changeset
170 Ch : Character;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 begin
kono
parents:
diff changeset
173 Last := 0;
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 if End_Of_File then
kono
parents:
diff changeset
176 return;
kono
parents:
diff changeset
177 end if;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 loop
kono
parents:
diff changeset
180 Ch := Buffer (Buffer_Cursor);
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 exit when Ch = ASCII.CR or else
kono
parents:
diff changeset
183 Ch = ASCII.LF or else
kono
parents:
diff changeset
184 Ch = ASCII.FF;
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 Last := Last + 1;
kono
parents:
diff changeset
187 Line (Last) := Ch;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 if Last = Line'Last then
kono
parents:
diff changeset
190 return;
kono
parents:
diff changeset
191 end if;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 Buffer_Cursor := Buffer_Cursor + 1;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 if Buffer_Cursor > Buffer_Length then
kono
parents:
diff changeset
196 Get_Buffer;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 if End_Of_File then
kono
parents:
diff changeset
199 return;
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201 end if;
kono
parents:
diff changeset
202 end loop;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 loop
kono
parents:
diff changeset
205 Ch := Buffer (Buffer_Cursor);
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 exit when Ch /= ASCII.HT and then
kono
parents:
diff changeset
208 Ch /= ASCII.LF and then
kono
parents:
diff changeset
209 Ch /= ASCII.FF;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 Buffer_Cursor := Buffer_Cursor + 1;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 if Buffer_Cursor > Buffer_Length then
kono
parents:
diff changeset
214 Get_Buffer;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 if End_Of_File then
kono
parents:
diff changeset
217 return;
kono
parents:
diff changeset
218 end if;
kono
parents:
diff changeset
219 end if;
kono
parents:
diff changeset
220 end loop;
kono
parents:
diff changeset
221 end Get_Line;
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 -- Start of processing for Recurse
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 begin
kono
parents:
diff changeset
226 Last_Arg := 0;
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 if FD = Invalid_FD then
kono
parents:
diff changeset
229 if Ignore_Non_Existing_Files then
kono
parents:
diff changeset
230 return;
kono
parents:
diff changeset
231 else
kono
parents:
diff changeset
232 raise File_Does_Not_Exist;
kono
parents:
diff changeset
233 end if;
kono
parents:
diff changeset
234 end if;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 -- Put the response file name on the stack
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 if First_File = null then
kono
parents:
diff changeset
239 First_File :=
kono
parents:
diff changeset
240 new File_Rec'
kono
parents:
diff changeset
241 (Name => new String'(File_Name),
kono
parents:
diff changeset
242 Next => null,
kono
parents:
diff changeset
243 Prev => null);
kono
parents:
diff changeset
244 Last_File := First_File;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 else
kono
parents:
diff changeset
247 declare
kono
parents:
diff changeset
248 Current : File_Ptr := First_File;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 begin
kono
parents:
diff changeset
251 loop
kono
parents:
diff changeset
252 if Current.Name.all = File_Name then
kono
parents:
diff changeset
253 raise Circularity_Detected;
kono
parents:
diff changeset
254 end if;
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 Current := Current.Next;
kono
parents:
diff changeset
257 exit when Current = null;
kono
parents:
diff changeset
258 end loop;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 Last_File.Next :=
kono
parents:
diff changeset
261 new File_Rec'
kono
parents:
diff changeset
262 (Name => new String'(File_Name),
kono
parents:
diff changeset
263 Next => null,
kono
parents:
diff changeset
264 Prev => Last_File);
kono
parents:
diff changeset
265 Last_File := Last_File.Next;
kono
parents:
diff changeset
266 end;
kono
parents:
diff changeset
267 end if;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 End_Of_File_Reached := False;
kono
parents:
diff changeset
270 Get_Buffer;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 -- Read the response file line by line
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 Line_Loop :
kono
parents:
diff changeset
275 while not End_Of_File loop
kono
parents:
diff changeset
276 Get_Line;
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 if Last = Line'Last then
kono
parents:
diff changeset
279 raise Line_Too_Long;
kono
parents:
diff changeset
280 end if;
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 First_Char := 1;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 -- Get each argument on the line
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 Arg_Loop :
kono
parents:
diff changeset
287 loop
kono
parents:
diff changeset
288 -- First, skip any white space
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 while First_Char <= Last loop
kono
parents:
diff changeset
291 exit when Line (First_Char) /= ' ' and then
kono
parents:
diff changeset
292 Line (First_Char) /= ASCII.HT;
kono
parents:
diff changeset
293 First_Char := First_Char + 1;
kono
parents:
diff changeset
294 end loop;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 exit Arg_Loop when First_Char > Last;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 Last_Char := First_Char;
kono
parents:
diff changeset
299 In_String := False;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 -- Get the character one by one
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 Character_Loop :
kono
parents:
diff changeset
304 while Last_Char <= Last loop
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 -- Inside a string, check only for '"'
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 if In_String then
kono
parents:
diff changeset
309 if Line (Last_Char) = '"' then
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 -- Remove the '"'
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 Line (Last_Char .. Last - 1) :=
kono
parents:
diff changeset
314 Line (Last_Char + 1 .. Last);
kono
parents:
diff changeset
315 Last := Last - 1;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 -- End of string is end of argument
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 if Last_Char > Last or else
kono
parents:
diff changeset
320 Line (Last_Char) = ' ' or else
kono
parents:
diff changeset
321 Line (Last_Char) = ASCII.HT
kono
parents:
diff changeset
322 then
kono
parents:
diff changeset
323 In_String := False;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 Last_Char := Last_Char - 1;
kono
parents:
diff changeset
326 exit Character_Loop;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 else
kono
parents:
diff changeset
329 -- If there are two consecutive '"', the quoted
kono
parents:
diff changeset
330 -- string is not closed
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 In_String := Line (Last_Char) = '"';
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 if In_String then
kono
parents:
diff changeset
335 Last_Char := Last_Char + 1;
kono
parents:
diff changeset
336 end if;
kono
parents:
diff changeset
337 end if;
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 else
kono
parents:
diff changeset
340 Last_Char := Last_Char + 1;
kono
parents:
diff changeset
341 end if;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 elsif Last_Char = Last then
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 -- An opening '"' at the end of the line is an error
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 if Line (Last) = '"' then
kono
parents:
diff changeset
348 raise No_Closing_Quote;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 else
kono
parents:
diff changeset
351 -- The argument ends with the line
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 exit Character_Loop;
kono
parents:
diff changeset
354 end if;
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 elsif Line (Last_Char) = '"' then
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 -- Entering a quoted string: remove the '"'
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 In_String := True;
kono
parents:
diff changeset
361 Line (Last_Char .. Last - 1) :=
kono
parents:
diff changeset
362 Line (Last_Char + 1 .. Last);
kono
parents:
diff changeset
363 Last := Last - 1;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 else
kono
parents:
diff changeset
366 -- Outside quoted strings, white space ends the argument
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 exit Character_Loop
kono
parents:
diff changeset
369 when Line (Last_Char + 1) = ' ' or else
kono
parents:
diff changeset
370 Line (Last_Char + 1) = ASCII.HT;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 Last_Char := Last_Char + 1;
kono
parents:
diff changeset
373 end if;
kono
parents:
diff changeset
374 end loop Character_Loop;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 -- It is an error to not close a quoted string before the end
kono
parents:
diff changeset
377 -- of the line.
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 if In_String then
kono
parents:
diff changeset
380 raise No_Closing_Quote;
kono
parents:
diff changeset
381 end if;
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 -- Add the argument to the list
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 declare
kono
parents:
diff changeset
386 Arg : String (1 .. Last_Char - First_Char + 1);
kono
parents:
diff changeset
387 begin
kono
parents:
diff changeset
388 Arg := Line (First_Char .. Last_Char);
kono
parents:
diff changeset
389 Add_Argument (Arg);
kono
parents:
diff changeset
390 end;
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 -- Next argument, if line is not finished
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 First_Char := Last_Char + 1;
kono
parents:
diff changeset
395 end loop Arg_Loop;
kono
parents:
diff changeset
396 end loop Line_Loop;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 Close (FD);
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 -- If Recursive is True, check for any argument starting with '@'
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 if Recursive then
kono
parents:
diff changeset
403 Arg := 1;
kono
parents:
diff changeset
404 while Arg <= Last_Arg loop
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 if Arguments (Arg)'Length > 0 and then
kono
parents:
diff changeset
407 Arguments (Arg) (1) = '@'
kono
parents:
diff changeset
408 then
kono
parents:
diff changeset
409 -- Ignore argument '@' with no file name
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 if Arguments (Arg)'Length = 1 then
kono
parents:
diff changeset
412 Arguments (Arg .. Last_Arg - 1) :=
kono
parents:
diff changeset
413 Arguments (Arg + 1 .. Last_Arg);
kono
parents:
diff changeset
414 Last_Arg := Last_Arg - 1;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 else
kono
parents:
diff changeset
417 -- Save the current arguments and get those in the new
kono
parents:
diff changeset
418 -- response file.
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 declare
kono
parents:
diff changeset
421 Inc_File_Name : constant String :=
kono
parents:
diff changeset
422 Arguments (Arg) (2 .. Arguments (Arg)'Last);
kono
parents:
diff changeset
423 Current_Arguments : constant Argument_List :=
kono
parents:
diff changeset
424 Arguments (1 .. Last_Arg);
kono
parents:
diff changeset
425 begin
kono
parents:
diff changeset
426 Recurse (Inc_File_Name);
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 -- Insert the new arguments where the new response
kono
parents:
diff changeset
429 -- file was imported.
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 declare
kono
parents:
diff changeset
432 New_Arguments : constant Argument_List :=
kono
parents:
diff changeset
433 Arguments (1 .. Last_Arg);
kono
parents:
diff changeset
434 New_Last_Arg : constant Positive :=
kono
parents:
diff changeset
435 Current_Arguments'Length +
kono
parents:
diff changeset
436 New_Arguments'Length - 1;
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 begin
kono
parents:
diff changeset
439 -- Grow Arguments if it is not large enough
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 if Arguments'Last < New_Last_Arg then
kono
parents:
diff changeset
442 Last_Arg := Arguments'Last;
kono
parents:
diff changeset
443 Free (Arguments);
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 while Last_Arg < New_Last_Arg loop
kono
parents:
diff changeset
446 Last_Arg := Last_Arg * 2;
kono
parents:
diff changeset
447 end loop;
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 Arguments := new Argument_List (1 .. Last_Arg);
kono
parents:
diff changeset
450 end if;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 Last_Arg := New_Last_Arg;
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 Arguments (1 .. Last_Arg) :=
kono
parents:
diff changeset
455 Current_Arguments (1 .. Arg - 1) &
kono
parents:
diff changeset
456 New_Arguments &
kono
parents:
diff changeset
457 Current_Arguments
kono
parents:
diff changeset
458 (Arg + 1 .. Current_Arguments'Last);
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 Arg := Arg + New_Arguments'Length;
kono
parents:
diff changeset
461 end;
kono
parents:
diff changeset
462 end;
kono
parents:
diff changeset
463 end if;
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 else
kono
parents:
diff changeset
466 Arg := Arg + 1;
kono
parents:
diff changeset
467 end if;
kono
parents:
diff changeset
468 end loop;
kono
parents:
diff changeset
469 end if;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 -- Remove the response file name from the stack
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 if First_File = Last_File then
kono
parents:
diff changeset
474 System.Strings.Free (First_File.Name);
kono
parents:
diff changeset
475 Free (First_File);
kono
parents:
diff changeset
476 First_File := null;
kono
parents:
diff changeset
477 Last_File := null;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 else
kono
parents:
diff changeset
480 System.Strings.Free (Last_File.Name);
kono
parents:
diff changeset
481 Last_File := Last_File.Prev;
kono
parents:
diff changeset
482 Free (Last_File.Next);
kono
parents:
diff changeset
483 end if;
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 exception
kono
parents:
diff changeset
486 when others =>
kono
parents:
diff changeset
487 Close (FD);
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 raise;
kono
parents:
diff changeset
490 end Recurse;
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 -- Start of processing for Arguments_From
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 begin
kono
parents:
diff changeset
495 -- The job is done by procedure Recurse
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 Recurse (Response_File_Name);
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 -- Free Arguments before returning the result
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 declare
kono
parents:
diff changeset
502 Result : constant Argument_List := Arguments (1 .. Last_Arg);
kono
parents:
diff changeset
503 begin
kono
parents:
diff changeset
504 Free (Arguments);
kono
parents:
diff changeset
505 return Result;
kono
parents:
diff changeset
506 end;
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 exception
kono
parents:
diff changeset
509 when others =>
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 -- When an exception occurs, deallocate everything
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 Free (Arguments);
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 while First_File /= null loop
kono
parents:
diff changeset
516 Last_File := First_File.Next;
kono
parents:
diff changeset
517 System.Strings.Free (First_File.Name);
kono
parents:
diff changeset
518 Free (First_File);
kono
parents:
diff changeset
519 First_File := Last_File;
kono
parents:
diff changeset
520 end loop;
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 raise;
kono
parents:
diff changeset
523 end Arguments_From;
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 end System.Response_File;