-- --
-- B o d y --
-- --
--- Copyright (C) 2002-2004, Free Software Foundation, Inc. --
+-- Copyright (C) 2002-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
--- ware Foundation; either version 2, or (at your option) any later ver- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
--- Public License distributed with GNAT; see file COPYING. If not, write --
--- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
--- MA 02111-1307, USA. --
+-- Public License distributed with GNAT; see file COPYING3. If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
with Csets;
with Err_Vars; use Err_Vars;
with Errutil;
-with Gnatvsn;
with Namet; use Namet;
with Opt;
with Osint; use Osint;
with Sinput.C;
with Snames;
with Stringt; use Stringt;
+with Switch; use Switch;
with Types; use Types;
-with Ada.Text_IO; use Ada.Text_IO;
+with Ada.Text_IO; use Ada.Text_IO;
+
with GNAT.Case_Util; use GNAT.Case_Util;
with GNAT.Command_Line;
with GNAT.Directory_Operations; use GNAT.Directory_Operations;
-with GNAT.OS_Lib; use GNAT.OS_Lib;
+with System.OS_Lib; use System.OS_Lib;
package body GPrep is
File_Name_Buffer_Initial_Size : constant := 50;
File_Name_Buffer : String_Access :=
new String (1 .. File_Name_Buffer_Initial_Size);
- -- A buffer to build output file names from input file names.
+ -- A buffer to build output file names from input file names
-----------------
-- Subprograms --
procedure Display_Copyright;
-- Display the copyright notice
+ procedure Obsolescent_Check (S : Source_Ptr);
+ -- Null procedure, needed by instantiation of Scng below
+
procedure Post_Scan;
-- Null procedure, needed by instantiation of Scng below
Errutil.Error_Msg_S,
Errutil.Error_Msg_SC,
Errutil.Error_Msg_SP,
+ Obsolescent_Check,
Errutil.Style);
-- The scanner for the preprocessor
-- True if C is in 'a' .. 'z' or in 'A' .. 'Z'
procedure Double_File_Name_Buffer;
- -- Double the size of the file name buffer.
+ -- Double the size of the file name buffer
procedure Preprocess_Infile_Name;
-- When the specified output is a directory, preprocess the infile name
-- Process a -D switch on the command line
procedure Put_Char_To_Outfile (C : Character);
- -- Output one character to the output file.
- -- Used to initialize the preprocessor.
+ -- Output one character to the output file. Used to initialize the
+ -- preprocessor.
procedure New_EOL_To_Outfile;
- -- Output a new line to the output file.
- -- Used to initialize the preprocessor.
+ -- Output a new line to the output file. Used to initialize the
+ -- preprocessor.
procedure Scan_Command_Line;
-- Scan the switches and the file names
procedure Display_Copyright is
begin
if not Copyright_Displayed then
- Write_Line ("GNAT Preprocessor " &
- Gnatvsn.Gnat_Version_String &
- " Copyright 1996-2004 Free Software Foundation, Inc.");
+ Display_Version ("GNAT Preprocessor", "1996");
Copyright_Displayed := True;
end if;
end Display_Copyright;
-- Test we had all the arguments needed
if Infile_Name = No_Name then
+
-- No input file specified, just output the usage and exit
Usage;
return;
elsif Outfile_Name = No_Name then
+
-- No output file specified, just output the usage and exit
Usage;
return;
end if;
- -- If a pragma Source_File_Name, we need to keep line numbers.
- -- So, if the deleted lines are not put as comment, we must output them
- -- as blank lines.
+ -- If a pragma Source_File_Name, we need to keep line numbers. So, if
+ -- the deleted lines are not put as comment, we must output them as
+ -- blank lines.
if Source_Ref_Pragma and (not Opt.Comment_Deleted_Lines) then
Opt.Blank_Deleted_Lines := True;
"""");
end if;
- Scanner.Initialize_Scanner (No_Unit, Deffile);
+ Scanner.Initialize_Scanner (Deffile);
Prep.Parse_Def_File;
end;
end if;
- -- If there are errors in the definition file, output these errors
- -- and exit.
+ -- If there are errors in the definition file, output them and exit
if Total_Errors_Detected > 0 then
Errutil.Finalize (Source_Type => "definition");
-- rooted at the input directory.
Process_Files;
-
end Gnatprep;
---------------------
New_Line (Outfile.all);
end New_EOL_To_Outfile;
+ -----------------------
+ -- Obsolescent_Check --
+ -----------------------
+
+ procedure Obsolescent_Check (S : Source_Ptr) is
+ pragma Warnings (Off, S);
+ begin
+ null;
+ end Obsolescent_Check;
+
---------------
-- Post_Scan --
---------------
procedure Preprocess_Infile_Name is
Len : Natural;
- First : Positive := 1;
+ First : Positive;
Last : Natural;
Symbol : Name_Id;
Data : Symbol_Data;
-- Look for possible symbols in the file name
+ First := 1;
while First < Len loop
-- A symbol starts with a dollar sign followed by a letter
declare
Sym_Len : constant Positive := Last - First + 1;
- Offset : constant Integer := Name_Len - Sym_Len;
+ Offset : constant Integer := Name_Len - Sym_Len;
New_Len : constant Natural := Len + Offset;
begin
-- Outfile_Name.
procedure Recursive_Process (In_Dir : String; Out_Dir : String);
- -- Process recursively files in In_Dir. Results go to Out_Dir.
+ -- Process recursively files in In_Dir. Results go to Out_Dir
----------------------
-- Process_One_File --
Infile : Source_File_Index;
begin
- -- Create the output file; fails if this does not work.
+ -- Create the output file (fails if this does not work)
begin
Create (Text_Outfile, Out_File, Get_Name_String (Outfile_Name));
Sinput.Main_Source_File := Infile;
- Scanner.Initialize_Scanner (No_Unit, Infile);
+ Scanner.Initialize_Scanner (Infile);
- -- Output the SFN pragma if asked to
+ -- Output the pragma Source_Reference if asked to
if Source_Ref_Pragma then
- Put_Line (Outfile.all, "pragma Source_Reference (1, """ &
- Get_Name_String (Sinput.File_Name (Infile)) &
- """);");
+ Put_Line
+ (Outfile.all,
+ "pragma Source_Reference (1, """ &
+ Get_Name_String (Sinput.Full_File_Name (Infile)) & """);");
end if;
-- Preprocess the input file
Errutil.Finalize (Source_Type => "input");
end if;
- -- If we had some errors, delete the output file, and report
- -- the errors.
+ -- If we had some errors, delete the output file, and report them
if Err_Vars.Total_Errors_Detected > 0 then
if Outfile /= Standard_Output then
OS_Exit (0);
- -- otherwise, close the output file, and we are done.
+ -- Otherwise, close the output file, and we are done
elsif Outfile /= Standard_Output then
Close (Text_Outfile);
Output_Directory := Out_Dir_Name;
end Set_Directory_Names;
+ -- Start of processing for Recursive_Process
+
begin
-- Open the current input directory
end loop;
end Recursive_Process;
+ -- Start of processing for Process_Files
+
begin
if Output_Directory = No_Name then
+
-- If the output is not a directory, fail if the input is
-- an existing directory, to avoid possible problems.
Process_One_File;
elsif Input_Directory = No_Name then
+
-- Get the output file name from the input file name, and process
-- the single input file.
Switch : Character;
begin
- -- Parse the switches
+ -- First check for --version or --help
+
+ Check_Version_And_Help ("GNATPREP", "1996", Usage'Access);
+
+ -- Now scan the other switches
+
+ GNAT.Command_Line.Initialize_Option_Scan;
loop
begin
- Switch := GNAT.Command_Line.Getopt ("D: b c r s u v");
+ Switch := GNAT.Command_Line.Getopt ("D: b c C r s u v");
+
case Switch is
when ASCII.NUL =>
when 'c' =>
Opt.Comment_Deleted_Lines := True;
+ when 'C' =>
+ Opt.Replace_In_Comments := True;
+
when 'r' =>
Source_Ref_Pragma := True;
Write_Line ("gnatprep switches:");
Write_Line (" -b Replace preprocessor lines by blank lines");
Write_Line (" -c Keep preprocessor lines as comments");
+ Write_Line (" -C Do symbol replacements within comments");
Write_Line (" -D Associate symbol with value");
Write_Line (" -r Generate Source_Reference pragma");
Write_Line (" -s Print a sorted list of symbol names and values");