annotate gcc/ada/gprep.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
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 -- G P R E P --
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) 2002-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 Atree; use Atree;
kono
parents:
diff changeset
27 with Csets;
kono
parents:
diff changeset
28 with Errutil;
kono
parents:
diff changeset
29 with Namet; use Namet;
kono
parents:
diff changeset
30 with Opt;
kono
parents:
diff changeset
31 with Osint; use Osint;
kono
parents:
diff changeset
32 with Output; use Output;
kono
parents:
diff changeset
33 with Prep; use Prep;
kono
parents:
diff changeset
34 with Scng;
kono
parents:
diff changeset
35 with Sinput.C;
kono
parents:
diff changeset
36 with Snames;
kono
parents:
diff changeset
37 with Stringt; use Stringt;
kono
parents:
diff changeset
38 with Switch; use Switch;
kono
parents:
diff changeset
39 with Types; use Types;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
42 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 with GNAT.Case_Util; use GNAT.Case_Util;
kono
parents:
diff changeset
45 with GNAT.Command_Line;
kono
parents:
diff changeset
46 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 with System.OS_Lib; use System.OS_Lib;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 package body GPrep is
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Copyright_Displayed : Boolean := False;
kono
parents:
diff changeset
53 -- Used to prevent multiple displays of the copyright notice
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 ------------------------
kono
parents:
diff changeset
56 -- Argument Line Data --
kono
parents:
diff changeset
57 ------------------------
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 Unix_Line_Terminators : Boolean := False;
kono
parents:
diff changeset
60 -- Set to True with option -T
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 type String_Array is array (Boolean) of String_Access;
kono
parents:
diff changeset
63 Yes_No : constant String_Array :=
kono
parents:
diff changeset
64 (False => new String'("YES"),
kono
parents:
diff changeset
65 True => new String'("NO"));
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 Infile_Name : Name_Id := No_Name;
kono
parents:
diff changeset
68 Outfile_Name : Name_Id := No_Name;
kono
parents:
diff changeset
69 Deffile_Name : Name_Id := No_Name;
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 Output_Directory : Name_Id := No_Name;
kono
parents:
diff changeset
72 -- Used when the specified output is an existing directory
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 Input_Directory : Name_Id := No_Name;
kono
parents:
diff changeset
75 -- Used when the specified input and output are existing directories
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 Source_Ref_Pragma : Boolean := False;
kono
parents:
diff changeset
78 -- Record command line options (set if -r switch set)
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 Text_Outfile : aliased Ada.Text_IO.File_Type;
kono
parents:
diff changeset
81 Outfile : constant File_Access := Text_Outfile'Access;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 File_Name_Buffer_Initial_Size : constant := 50;
kono
parents:
diff changeset
84 File_Name_Buffer : String_Access :=
kono
parents:
diff changeset
85 new String (1 .. File_Name_Buffer_Initial_Size);
kono
parents:
diff changeset
86 -- A buffer to build output file names from input file names
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 -----------------
kono
parents:
diff changeset
89 -- Subprograms --
kono
parents:
diff changeset
90 -----------------
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 procedure Display_Copyright;
kono
parents:
diff changeset
93 -- Display the copyright notice
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 procedure Post_Scan;
kono
parents:
diff changeset
96 -- Null procedure, needed by instantiation of Scng below
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 package Scanner is new Scng
kono
parents:
diff changeset
99 (Post_Scan,
kono
parents:
diff changeset
100 Errutil.Error_Msg,
kono
parents:
diff changeset
101 Errutil.Error_Msg_S,
kono
parents:
diff changeset
102 Errutil.Error_Msg_SC,
kono
parents:
diff changeset
103 Errutil.Error_Msg_SP,
kono
parents:
diff changeset
104 Errutil.Style);
kono
parents:
diff changeset
105 -- The scanner for the preprocessor
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 function Is_ASCII_Letter (C : Character) return Boolean;
kono
parents:
diff changeset
108 -- True if C is in 'a' .. 'z' or in 'A' .. 'Z'
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 procedure Double_File_Name_Buffer;
kono
parents:
diff changeset
111 -- Double the size of the file name buffer
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 procedure Preprocess_Infile_Name;
kono
parents:
diff changeset
114 -- When the specified output is a directory, preprocess the infile name
kono
parents:
diff changeset
115 -- for symbol substitution, to get the output file name.
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 procedure Process_Files;
kono
parents:
diff changeset
118 -- Process the single input file or all the files in the directory tree
kono
parents:
diff changeset
119 -- rooted at the input directory.
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 procedure Process_Command_Line_Symbol_Definition (S : String);
kono
parents:
diff changeset
122 -- Process a -D switch on the command line
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 procedure Put_Char_To_Outfile (C : Character);
kono
parents:
diff changeset
125 -- Output one character to the output file. Used to initialize the
kono
parents:
diff changeset
126 -- preprocessor.
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 procedure New_EOL_To_Outfile;
kono
parents:
diff changeset
129 -- Output a new line to the output file. Used to initialize the
kono
parents:
diff changeset
130 -- preprocessor.
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 procedure Scan_Command_Line;
kono
parents:
diff changeset
133 -- Scan the switches and the file names
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 procedure Usage;
kono
parents:
diff changeset
136 -- Display the usage
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 -----------------------
kono
parents:
diff changeset
139 -- Display_Copyright --
kono
parents:
diff changeset
140 -----------------------
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 procedure Display_Copyright is
kono
parents:
diff changeset
143 begin
kono
parents:
diff changeset
144 if not Copyright_Displayed then
kono
parents:
diff changeset
145 Display_Version ("GNAT Preprocessor", "1996");
kono
parents:
diff changeset
146 Copyright_Displayed := True;
kono
parents:
diff changeset
147 end if;
kono
parents:
diff changeset
148 end Display_Copyright;
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 -----------------------------
kono
parents:
diff changeset
151 -- Double_File_Name_Buffer --
kono
parents:
diff changeset
152 -----------------------------
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 procedure Double_File_Name_Buffer is
kono
parents:
diff changeset
155 New_Buffer : constant String_Access :=
kono
parents:
diff changeset
156 new String (1 .. 2 * File_Name_Buffer'Length);
kono
parents:
diff changeset
157 begin
kono
parents:
diff changeset
158 New_Buffer (File_Name_Buffer'Range) := File_Name_Buffer.all;
kono
parents:
diff changeset
159 Free (File_Name_Buffer);
kono
parents:
diff changeset
160 File_Name_Buffer := New_Buffer;
kono
parents:
diff changeset
161 end Double_File_Name_Buffer;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 --------------
kono
parents:
diff changeset
164 -- Gnatprep --
kono
parents:
diff changeset
165 --------------
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 procedure Gnatprep is
kono
parents:
diff changeset
168 begin
kono
parents:
diff changeset
169 -- Do some initializations (order is important here)
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 Csets.Initialize;
kono
parents:
diff changeset
172 Snames.Initialize;
kono
parents:
diff changeset
173 Stringt.Initialize;
kono
parents:
diff changeset
174 Prep.Initialize;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 -- Initialize the preprocessor
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 Prep.Setup_Hooks
kono
parents:
diff changeset
179 (Error_Msg => Errutil.Error_Msg'Access,
kono
parents:
diff changeset
180 Scan => Scanner.Scan'Access,
kono
parents:
diff changeset
181 Set_Ignore_Errors => Errutil.Set_Ignore_Errors'Access,
kono
parents:
diff changeset
182 Put_Char => Put_Char_To_Outfile'Access,
kono
parents:
diff changeset
183 New_EOL => New_EOL_To_Outfile'Access);
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 -- Set the scanner characteristics for the preprocessor
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 Scanner.Set_Special_Character ('#');
kono
parents:
diff changeset
188 Scanner.Set_Special_Character ('$');
kono
parents:
diff changeset
189 Scanner.Set_End_Of_Line_As_Token (True);
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 -- Initialize the mapping table of symbols to values
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 Prep.Symbol_Table.Init (Prep.Mapping);
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 -- Parse the switches and arguments
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 Scan_Command_Line;
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 if Opt.Verbose_Mode then
kono
parents:
diff changeset
200 Display_Copyright;
kono
parents:
diff changeset
201 end if;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 -- Test we had all the arguments needed
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 if Infile_Name = No_Name then
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 -- No input file specified, just output the usage and exit
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 if Argument_Count = 0 then
kono
parents:
diff changeset
210 Usage;
kono
parents:
diff changeset
211 else
kono
parents:
diff changeset
212 GNAT.Command_Line.Try_Help;
kono
parents:
diff changeset
213 end if;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 return;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 elsif Outfile_Name = No_Name then
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 -- No output file specified, exit
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 GNAT.Command_Line.Try_Help;
kono
parents:
diff changeset
222 return;
kono
parents:
diff changeset
223 end if;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 -- If a pragma Source_File_Name, we need to keep line numbers. So, if
kono
parents:
diff changeset
226 -- the deleted lines are not put as comment, we must output them as
kono
parents:
diff changeset
227 -- blank lines.
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 if Source_Ref_Pragma and (not Opt.Comment_Deleted_Lines) then
kono
parents:
diff changeset
230 Opt.Blank_Deleted_Lines := True;
kono
parents:
diff changeset
231 end if;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 -- If we have a definition file, parse it
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 if Deffile_Name /= No_Name then
kono
parents:
diff changeset
236 declare
kono
parents:
diff changeset
237 Deffile : Source_File_Index;
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 begin
kono
parents:
diff changeset
240 Errutil.Initialize;
kono
parents:
diff changeset
241 Deffile := Sinput.C.Load_File (Get_Name_String (Deffile_Name));
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 -- Set Main_Source_File to the definition file for the benefit of
kono
parents:
diff changeset
244 -- Errutil.Finalize.
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 Sinput.Main_Source_File := Deffile;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 if Deffile = No_Source_File then
kono
parents:
diff changeset
249 Fail ("unable to find definition file """
kono
parents:
diff changeset
250 & Get_Name_String (Deffile_Name)
kono
parents:
diff changeset
251 & """");
kono
parents:
diff changeset
252 elsif Deffile = No_Access_To_Source_File then
kono
parents:
diff changeset
253 Fail ("unabled to read definition file """
kono
parents:
diff changeset
254 & Get_Name_String (Deffile_Name)
kono
parents:
diff changeset
255 & """");
kono
parents:
diff changeset
256 end if;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 Scanner.Initialize_Scanner (Deffile);
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 -- Parse the definition file without "replace in comments"
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 declare
kono
parents:
diff changeset
263 Replace : constant Boolean := Opt.Replace_In_Comments;
kono
parents:
diff changeset
264 begin
kono
parents:
diff changeset
265 Opt.Replace_In_Comments := False;
kono
parents:
diff changeset
266 Prep.Parse_Def_File;
kono
parents:
diff changeset
267 Opt.Replace_In_Comments := Replace;
kono
parents:
diff changeset
268 end;
kono
parents:
diff changeset
269 end;
kono
parents:
diff changeset
270 end if;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 -- If there are errors in the definition file, output them and exit
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 if Total_Errors_Detected > 0 then
kono
parents:
diff changeset
275 Errutil.Finalize (Source_Type => "definition");
kono
parents:
diff changeset
276 Fail ("errors in definition file """
kono
parents:
diff changeset
277 & Get_Name_String (Deffile_Name)
kono
parents:
diff changeset
278 & """");
kono
parents:
diff changeset
279 end if;
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 -- If -s switch was specified, print a sorted list of symbol names and
kono
parents:
diff changeset
282 -- values, if any.
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 if Opt.List_Preprocessing_Symbols then
kono
parents:
diff changeset
285 Prep.List_Symbols (Foreword => "");
kono
parents:
diff changeset
286 end if;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 Output_Directory := No_Name;
kono
parents:
diff changeset
289 Input_Directory := No_Name;
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 -- Check if the specified output is an existing directory
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 if Is_Directory (Get_Name_String (Outfile_Name)) then
kono
parents:
diff changeset
294 Output_Directory := Outfile_Name;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 -- As the output is an existing directory, check if the input too
kono
parents:
diff changeset
297 -- is a directory.
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 if Is_Directory (Get_Name_String (Infile_Name)) then
kono
parents:
diff changeset
300 Input_Directory := Infile_Name;
kono
parents:
diff changeset
301 end if;
kono
parents:
diff changeset
302 end if;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 -- And process the single input or the files in the directory tree
kono
parents:
diff changeset
305 -- rooted at the input directory.
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 Process_Files;
kono
parents:
diff changeset
308 end Gnatprep;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 ---------------------
kono
parents:
diff changeset
311 -- Is_ASCII_Letter --
kono
parents:
diff changeset
312 ---------------------
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 function Is_ASCII_Letter (C : Character) return Boolean is
kono
parents:
diff changeset
315 begin
kono
parents:
diff changeset
316 return C in 'A' .. 'Z' or else C in 'a' .. 'z';
kono
parents:
diff changeset
317 end Is_ASCII_Letter;
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 ------------------------
kono
parents:
diff changeset
320 -- New_EOL_To_Outfile --
kono
parents:
diff changeset
321 ------------------------
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 procedure New_EOL_To_Outfile is
kono
parents:
diff changeset
324 begin
kono
parents:
diff changeset
325 New_Line (Outfile.all);
kono
parents:
diff changeset
326 end New_EOL_To_Outfile;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 ---------------
kono
parents:
diff changeset
329 -- Post_Scan --
kono
parents:
diff changeset
330 ---------------
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 procedure Post_Scan is
kono
parents:
diff changeset
333 begin
kono
parents:
diff changeset
334 null;
kono
parents:
diff changeset
335 end Post_Scan;
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 ----------------------------
kono
parents:
diff changeset
338 -- Preprocess_Infile_Name --
kono
parents:
diff changeset
339 ----------------------------
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 procedure Preprocess_Infile_Name is
kono
parents:
diff changeset
342 Len : Natural;
kono
parents:
diff changeset
343 First : Positive;
kono
parents:
diff changeset
344 Last : Natural;
kono
parents:
diff changeset
345 Symbol : Name_Id;
kono
parents:
diff changeset
346 Data : Symbol_Data;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 begin
kono
parents:
diff changeset
349 -- Initialize the buffer with the name of the input file
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 Get_Name_String (Infile_Name);
kono
parents:
diff changeset
352 Len := Name_Len;
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 while File_Name_Buffer'Length < Len loop
kono
parents:
diff changeset
355 Double_File_Name_Buffer;
kono
parents:
diff changeset
356 end loop;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 File_Name_Buffer (1 .. Len) := Name_Buffer (1 .. Len);
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 -- Look for possible symbols in the file name
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 First := 1;
kono
parents:
diff changeset
363 while First < Len loop
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 -- A symbol starts with a dollar sign followed by a letter
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 if File_Name_Buffer (First) = '$' and then
kono
parents:
diff changeset
368 Is_ASCII_Letter (File_Name_Buffer (First + 1))
kono
parents:
diff changeset
369 then
kono
parents:
diff changeset
370 Last := First + 1;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 -- Find the last letter of the symbol
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 while Last < Len and then
kono
parents:
diff changeset
375 Is_ASCII_Letter (File_Name_Buffer (Last + 1))
kono
parents:
diff changeset
376 loop
kono
parents:
diff changeset
377 Last := Last + 1;
kono
parents:
diff changeset
378 end loop;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 -- Get the symbol name id
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 Name_Len := Last - First;
kono
parents:
diff changeset
383 Name_Buffer (1 .. Name_Len) :=
kono
parents:
diff changeset
384 File_Name_Buffer (First + 1 .. Last);
kono
parents:
diff changeset
385 To_Lower (Name_Buffer (1 .. Name_Len));
kono
parents:
diff changeset
386 Symbol := Name_Find;
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 -- And look for this symbol name in the symbol table
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 for Index in 1 .. Symbol_Table.Last (Mapping) loop
kono
parents:
diff changeset
391 Data := Mapping.Table (Index);
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 if Data.Symbol = Symbol then
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 -- We found the symbol. If its value is not a string,
kono
parents:
diff changeset
396 -- replace the symbol in the file name with the value of
kono
parents:
diff changeset
397 -- the symbol.
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 if not Data.Is_A_String then
kono
parents:
diff changeset
400 String_To_Name_Buffer (Data.Value);
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 declare
kono
parents:
diff changeset
403 Sym_Len : constant Positive := Last - First + 1;
kono
parents:
diff changeset
404 Offset : constant Integer := Name_Len - Sym_Len;
kono
parents:
diff changeset
405 New_Len : constant Natural := Len + Offset;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 begin
kono
parents:
diff changeset
408 while New_Len > File_Name_Buffer'Length loop
kono
parents:
diff changeset
409 Double_File_Name_Buffer;
kono
parents:
diff changeset
410 end loop;
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 File_Name_Buffer (Last + 1 + Offset .. New_Len) :=
kono
parents:
diff changeset
413 File_Name_Buffer (Last + 1 .. Len);
kono
parents:
diff changeset
414 Len := New_Len;
kono
parents:
diff changeset
415 Last := Last + Offset;
kono
parents:
diff changeset
416 File_Name_Buffer (First .. Last) :=
kono
parents:
diff changeset
417 Name_Buffer (1 .. Name_Len);
kono
parents:
diff changeset
418 end;
kono
parents:
diff changeset
419 end if;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 exit;
kono
parents:
diff changeset
422 end if;
kono
parents:
diff changeset
423 end loop;
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 -- Skip over the symbol name or its value: we are not checking
kono
parents:
diff changeset
426 -- for another symbol name in the value.
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 First := Last + 1;
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 else
kono
parents:
diff changeset
431 First := First + 1;
kono
parents:
diff changeset
432 end if;
kono
parents:
diff changeset
433 end loop;
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 -- We now have the output file name in the buffer. Get the output
kono
parents:
diff changeset
436 -- path and put it in Outfile_Name.
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 Get_Name_String (Output_Directory);
kono
parents:
diff changeset
439 Add_Char_To_Name_Buffer (Directory_Separator);
kono
parents:
diff changeset
440 Add_Str_To_Name_Buffer (File_Name_Buffer (1 .. Len));
kono
parents:
diff changeset
441 Outfile_Name := Name_Find;
kono
parents:
diff changeset
442 end Preprocess_Infile_Name;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 --------------------------------------------
kono
parents:
diff changeset
445 -- Process_Command_Line_Symbol_Definition --
kono
parents:
diff changeset
446 --------------------------------------------
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 procedure Process_Command_Line_Symbol_Definition (S : String) is
kono
parents:
diff changeset
449 Data : Symbol_Data;
kono
parents:
diff changeset
450 Symbol : Symbol_Id;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 begin
kono
parents:
diff changeset
453 -- Check the symbol definition and get the symbol and its value.
kono
parents:
diff changeset
454 -- Fail if symbol definition is illegal.
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 Check_Command_Line_Symbol_Definition (S, Data);
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 Symbol := Index_Of (Data.Symbol);
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 -- If symbol does not already exist, create a new entry in the mapping
kono
parents:
diff changeset
461 -- table.
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 if Symbol = No_Symbol then
kono
parents:
diff changeset
464 Symbol_Table.Increment_Last (Mapping);
kono
parents:
diff changeset
465 Symbol := Symbol_Table.Last (Mapping);
kono
parents:
diff changeset
466 end if;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 Mapping.Table (Symbol) := Data;
kono
parents:
diff changeset
469 end Process_Command_Line_Symbol_Definition;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 -------------------
kono
parents:
diff changeset
472 -- Process_Files --
kono
parents:
diff changeset
473 -------------------
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 procedure Process_Files is
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 procedure Process_One_File;
kono
parents:
diff changeset
478 -- Process input file Infile_Name and put the result in file
kono
parents:
diff changeset
479 -- Outfile_Name.
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 procedure Recursive_Process (In_Dir : String; Out_Dir : String);
kono
parents:
diff changeset
482 -- Process recursively files in In_Dir. Results go to Out_Dir
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 ----------------------
kono
parents:
diff changeset
485 -- Process_One_File --
kono
parents:
diff changeset
486 ----------------------
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 procedure Process_One_File is
kono
parents:
diff changeset
489 Infile : Source_File_Index;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 Modified : Boolean;
kono
parents:
diff changeset
492 pragma Warnings (Off, Modified);
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 begin
kono
parents:
diff changeset
495 -- Create the output file (fails if this does not work)
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 begin
kono
parents:
diff changeset
498 Create
kono
parents:
diff changeset
499 (File => Text_Outfile,
kono
parents:
diff changeset
500 Mode => Out_File,
kono
parents:
diff changeset
501 Name => Get_Name_String (Outfile_Name),
kono
parents:
diff changeset
502 Form => "Text_Translation=" &
kono
parents:
diff changeset
503 Yes_No (Unix_Line_Terminators).all);
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 exception
kono
parents:
diff changeset
506 when others =>
kono
parents:
diff changeset
507 Fail
kono
parents:
diff changeset
508 ("unable to create output file """
kono
parents:
diff changeset
509 & Get_Name_String (Outfile_Name)
kono
parents:
diff changeset
510 & """");
kono
parents:
diff changeset
511 end;
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 -- Load the input file
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 Infile := Sinput.C.Load_File (Get_Name_String (Infile_Name));
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 if Infile = No_Source_File then
kono
parents:
diff changeset
518 Fail ("unable to find input file """
kono
parents:
diff changeset
519 & Get_Name_String (Infile_Name)
kono
parents:
diff changeset
520 & """");
kono
parents:
diff changeset
521 elsif Infile = No_Access_To_Source_File then
kono
parents:
diff changeset
522 Fail ("unable to read input file """
kono
parents:
diff changeset
523 & Get_Name_String (Infile_Name)
kono
parents:
diff changeset
524 & """");
kono
parents:
diff changeset
525 end if;
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 -- Set Main_Source_File to the input file for the benefit of
kono
parents:
diff changeset
528 -- Errutil.Finalize.
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 Sinput.Main_Source_File := Infile;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 Scanner.Initialize_Scanner (Infile);
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 -- Output the pragma Source_Reference if asked to
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 if Source_Ref_Pragma then
kono
parents:
diff changeset
537 Put_Line
kono
parents:
diff changeset
538 (Outfile.all,
kono
parents:
diff changeset
539 "pragma Source_Reference (1, """ &
kono
parents:
diff changeset
540 Get_Name_String (Sinput.Full_File_Name (Infile)) & """);");
kono
parents:
diff changeset
541 end if;
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 -- Preprocess the input file
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 Prep.Preprocess (Modified);
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 -- In verbose mode, if there is no error, report it
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 if Opt.Verbose_Mode and then Total_Errors_Detected = 0 then
kono
parents:
diff changeset
550 Errutil.Finalize (Source_Type => "input");
kono
parents:
diff changeset
551 end if;
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 -- If we had some errors, delete the output file, and report them
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 if Total_Errors_Detected > 0 then
kono
parents:
diff changeset
556 if Outfile /= Standard_Output then
kono
parents:
diff changeset
557 Delete (Text_Outfile);
kono
parents:
diff changeset
558 end if;
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 Errutil.Finalize (Source_Type => "input");
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 OS_Exit (0);
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 -- Otherwise, close the output file, and we are done
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 elsif Outfile /= Standard_Output then
kono
parents:
diff changeset
567 Close (Text_Outfile);
kono
parents:
diff changeset
568 end if;
kono
parents:
diff changeset
569 end Process_One_File;
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 -----------------------
kono
parents:
diff changeset
572 -- Recursive_Process --
kono
parents:
diff changeset
573 -----------------------
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 procedure Recursive_Process (In_Dir : String; Out_Dir : String) is
kono
parents:
diff changeset
576 Dir_In : Dir_Type;
kono
parents:
diff changeset
577 Name : String (1 .. 255);
kono
parents:
diff changeset
578 Last : Natural;
kono
parents:
diff changeset
579 In_Dir_Name : Name_Id;
kono
parents:
diff changeset
580 Out_Dir_Name : Name_Id;
kono
parents:
diff changeset
581
kono
parents:
diff changeset
582 procedure Set_Directory_Names;
kono
parents:
diff changeset
583 -- Establish or reestablish the current input and output directories
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 -------------------------
kono
parents:
diff changeset
586 -- Set_Directory_Names --
kono
parents:
diff changeset
587 -------------------------
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 procedure Set_Directory_Names is
kono
parents:
diff changeset
590 begin
kono
parents:
diff changeset
591 Input_Directory := In_Dir_Name;
kono
parents:
diff changeset
592 Output_Directory := Out_Dir_Name;
kono
parents:
diff changeset
593 end Set_Directory_Names;
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 -- Start of processing for Recursive_Process
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 begin
kono
parents:
diff changeset
598 -- Open the current input directory
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 begin
kono
parents:
diff changeset
601 Open (Dir_In, In_Dir);
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 exception
kono
parents:
diff changeset
604 when Directory_Error =>
kono
parents:
diff changeset
605 Fail ("could not read directory " & In_Dir);
kono
parents:
diff changeset
606 end;
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 -- Set the new input and output directory names
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 Name_Len := In_Dir'Length;
kono
parents:
diff changeset
611 Name_Buffer (1 .. Name_Len) := In_Dir;
kono
parents:
diff changeset
612 In_Dir_Name := Name_Find;
kono
parents:
diff changeset
613 Name_Len := Out_Dir'Length;
kono
parents:
diff changeset
614 Name_Buffer (1 .. Name_Len) := Out_Dir;
kono
parents:
diff changeset
615 Out_Dir_Name := Name_Find;
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 Set_Directory_Names;
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 -- Traverse the input directory
kono
parents:
diff changeset
620 loop
kono
parents:
diff changeset
621 Read (Dir_In, Name, Last);
kono
parents:
diff changeset
622 exit when Last = 0;
kono
parents:
diff changeset
623
kono
parents:
diff changeset
624 if Name (1 .. Last) /= "." and then Name (1 .. Last) /= ".." then
kono
parents:
diff changeset
625 declare
kono
parents:
diff changeset
626 Input : constant String :=
kono
parents:
diff changeset
627 In_Dir & Directory_Separator & Name (1 .. Last);
kono
parents:
diff changeset
628 Output : constant String :=
kono
parents:
diff changeset
629 Out_Dir & Directory_Separator & Name (1 .. Last);
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 begin
kono
parents:
diff changeset
632 -- If input is an ordinary file, process it
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 if Is_Regular_File (Input) then
kono
parents:
diff changeset
635 -- First get the output file name
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 Name_Len := Last;
kono
parents:
diff changeset
638 Name_Buffer (1 .. Name_Len) := Name (1 .. Last);
kono
parents:
diff changeset
639 Infile_Name := Name_Find;
kono
parents:
diff changeset
640 Preprocess_Infile_Name;
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 -- Set the input file name and process the file
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 Name_Len := Input'Length;
kono
parents:
diff changeset
645 Name_Buffer (1 .. Name_Len) := Input;
kono
parents:
diff changeset
646 Infile_Name := Name_Find;
kono
parents:
diff changeset
647 Process_One_File;
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 elsif Is_Directory (Input) then
kono
parents:
diff changeset
650 -- Input is a directory. If the corresponding output
kono
parents:
diff changeset
651 -- directory does not already exist, create it.
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 if not Is_Directory (Output) then
kono
parents:
diff changeset
654 begin
kono
parents:
diff changeset
655 Make_Dir (Dir_Name => Output);
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 exception
kono
parents:
diff changeset
658 when Directory_Error =>
kono
parents:
diff changeset
659 Fail ("could not create directory """
kono
parents:
diff changeset
660 & Output
kono
parents:
diff changeset
661 & """");
kono
parents:
diff changeset
662 end;
kono
parents:
diff changeset
663 end if;
kono
parents:
diff changeset
664
kono
parents:
diff changeset
665 -- And process this new input directory
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 Recursive_Process (Input, Output);
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 -- Reestablish the input and output directory names
kono
parents:
diff changeset
670 -- that have been modified by the recursive call.
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 Set_Directory_Names;
kono
parents:
diff changeset
673 end if;
kono
parents:
diff changeset
674 end;
kono
parents:
diff changeset
675 end if;
kono
parents:
diff changeset
676 end loop;
kono
parents:
diff changeset
677 end Recursive_Process;
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 -- Start of processing for Process_Files
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 begin
kono
parents:
diff changeset
682 if Output_Directory = No_Name then
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 -- If the output is not a directory, fail if the input is
kono
parents:
diff changeset
685 -- an existing directory, to avoid possible problems.
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 if Is_Directory (Get_Name_String (Infile_Name)) then
kono
parents:
diff changeset
688 Fail ("input file """ & Get_Name_String (Infile_Name) &
kono
parents:
diff changeset
689 """ is a directory");
kono
parents:
diff changeset
690 end if;
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 -- Just process the single input file
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 Process_One_File;
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 elsif Input_Directory = No_Name then
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 -- Get the output file name from the input file name, and process
kono
parents:
diff changeset
699 -- the single input file.
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 Preprocess_Infile_Name;
kono
parents:
diff changeset
702 Process_One_File;
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 else
kono
parents:
diff changeset
705 -- Recursively process files in the directory tree rooted at the
kono
parents:
diff changeset
706 -- input directory.
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 Recursive_Process
kono
parents:
diff changeset
709 (In_Dir => Get_Name_String (Input_Directory),
kono
parents:
diff changeset
710 Out_Dir => Get_Name_String (Output_Directory));
kono
parents:
diff changeset
711 end if;
kono
parents:
diff changeset
712 end Process_Files;
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 -------------------------
kono
parents:
diff changeset
715 -- Put_Char_To_Outfile --
kono
parents:
diff changeset
716 -------------------------
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 procedure Put_Char_To_Outfile (C : Character) is
kono
parents:
diff changeset
719 begin
kono
parents:
diff changeset
720 Put (Outfile.all, C);
kono
parents:
diff changeset
721 end Put_Char_To_Outfile;
kono
parents:
diff changeset
722
kono
parents:
diff changeset
723 -----------------------
kono
parents:
diff changeset
724 -- Scan_Command_Line --
kono
parents:
diff changeset
725 -----------------------
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 procedure Scan_Command_Line is
kono
parents:
diff changeset
728 Switch : Character;
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 -- Start of processing for Scan_Command_Line
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 begin
kono
parents:
diff changeset
735 -- First check for --version or --help
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 Check_Version_And_Help ("GNATPREP", "1996");
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 -- Now scan the other switches
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 GNAT.Command_Line.Initialize_Option_Scan;
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 loop
kono
parents:
diff changeset
744 begin
kono
parents:
diff changeset
745 Switch := GNAT.Command_Line.Getopt ("D: a b c C r s T u v");
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 case Switch is
kono
parents:
diff changeset
748 when ASCII.NUL =>
kono
parents:
diff changeset
749 exit;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 when 'D' =>
kono
parents:
diff changeset
752 Process_Command_Line_Symbol_Definition
kono
parents:
diff changeset
753 (S => GNAT.Command_Line.Parameter);
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 when 'a' =>
kono
parents:
diff changeset
756 Opt.No_Deletion := True;
kono
parents:
diff changeset
757 Opt.Undefined_Symbols_Are_False := True;
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 when 'b' =>
kono
parents:
diff changeset
760 Opt.Blank_Deleted_Lines := True;
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 when 'c' =>
kono
parents:
diff changeset
763 Opt.Comment_Deleted_Lines := True;
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 when 'C' =>
kono
parents:
diff changeset
766 Opt.Replace_In_Comments := True;
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 when 'r' =>
kono
parents:
diff changeset
769 Source_Ref_Pragma := True;
kono
parents:
diff changeset
770
kono
parents:
diff changeset
771 when 's' =>
kono
parents:
diff changeset
772 Opt.List_Preprocessing_Symbols := True;
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 when 'T' =>
kono
parents:
diff changeset
775 Unix_Line_Terminators := True;
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 when 'u' =>
kono
parents:
diff changeset
778 Opt.Undefined_Symbols_Are_False := True;
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 when 'v' =>
kono
parents:
diff changeset
781 Opt.Verbose_Mode := True;
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 when others =>
kono
parents:
diff changeset
784 Fail ("Invalid Switch: -" & Switch);
kono
parents:
diff changeset
785 end case;
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 exception
kono
parents:
diff changeset
788 when GNAT.Command_Line.Invalid_Switch =>
kono
parents:
diff changeset
789 Write_Str ("Invalid Switch: -");
kono
parents:
diff changeset
790 Write_Line (GNAT.Command_Line.Full_Switch);
kono
parents:
diff changeset
791 GNAT.Command_Line.Try_Help;
kono
parents:
diff changeset
792 OS_Exit (1);
kono
parents:
diff changeset
793 end;
kono
parents:
diff changeset
794 end loop;
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 -- Get the file names
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 loop
kono
parents:
diff changeset
799 declare
kono
parents:
diff changeset
800 S : constant String := GNAT.Command_Line.Get_Argument;
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 begin
kono
parents:
diff changeset
803 exit when S'Length = 0;
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 Name_Len := S'Length;
kono
parents:
diff changeset
806 Name_Buffer (1 .. Name_Len) := S;
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 if Infile_Name = No_Name then
kono
parents:
diff changeset
809 Infile_Name := Name_Find;
kono
parents:
diff changeset
810 elsif Outfile_Name = No_Name then
kono
parents:
diff changeset
811 Outfile_Name := Name_Find;
kono
parents:
diff changeset
812 elsif Deffile_Name = No_Name then
kono
parents:
diff changeset
813 Deffile_Name := Name_Find;
kono
parents:
diff changeset
814 else
kono
parents:
diff changeset
815 Fail ("too many arguments specified");
kono
parents:
diff changeset
816 end if;
kono
parents:
diff changeset
817 end;
kono
parents:
diff changeset
818 end loop;
kono
parents:
diff changeset
819 end Scan_Command_Line;
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 -----------
kono
parents:
diff changeset
822 -- Usage --
kono
parents:
diff changeset
823 -----------
kono
parents:
diff changeset
824
kono
parents:
diff changeset
825 procedure Usage is
kono
parents:
diff changeset
826 begin
kono
parents:
diff changeset
827 Display_Copyright;
kono
parents:
diff changeset
828 Write_Line ("Usage: gnatprep [-bcrsuv] [-Dsymbol=value] " &
kono
parents:
diff changeset
829 "infile outfile [deffile]");
kono
parents:
diff changeset
830 Write_Eol;
kono
parents:
diff changeset
831 Write_Line (" infile Name of the input file");
kono
parents:
diff changeset
832 Write_Line (" outfile Name of the output file");
kono
parents:
diff changeset
833 Write_Line (" deffile Name of the definition file");
kono
parents:
diff changeset
834 Write_Eol;
kono
parents:
diff changeset
835 Write_Line ("gnatprep switches:");
kono
parents:
diff changeset
836 Display_Usage_Version_And_Help;
kono
parents:
diff changeset
837 Write_Line (" -b Replace preprocessor lines by blank lines");
kono
parents:
diff changeset
838 Write_Line (" -c Keep preprocessor lines as comments");
kono
parents:
diff changeset
839 Write_Line (" -C Do symbol replacements within comments");
kono
parents:
diff changeset
840 Write_Line (" -D Associate symbol with value");
kono
parents:
diff changeset
841 Write_Line (" -r Generate Source_Reference pragma");
kono
parents:
diff changeset
842 Write_Line (" -s Print a sorted list of symbol names and values");
kono
parents:
diff changeset
843 Write_Line (" -T Use LF as line terminators");
kono
parents:
diff changeset
844 Write_Line (" -u Treat undefined symbols as FALSE");
kono
parents:
diff changeset
845 Write_Line (" -v Verbose mode");
kono
parents:
diff changeset
846 Write_Eol;
kono
parents:
diff changeset
847 end Usage;
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 end GPrep;