-- --
-- B o d y --
-- --
--- Copyright (C) 2002-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 2002-2011, 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, 51 Franklin Street, Fifth Floor, --
--- Boston, MA 02110-1301, 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
-- Argument Line Data --
------------------------
+ Unix_Line_Terminators : Boolean := False;
+ -- Set to True with option -T
+
+ type String_Array is array (Boolean) of String_Access;
+ Yes_No : constant String_Array :=
+ (False => new String'("YES"),
+ True => new String'("NO"));
+
Infile_Name : Name_Id := No_Name;
Outfile_Name : Name_Id := No_Name;
Deffile_Name : Name_Id := No_Name;
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
procedure Display_Copyright is
begin
if not Copyright_Displayed then
- Write_Line ("GNAT Preprocessor " & Gnatvsn.Gnat_Version_String);
- Write_Line ("Copyright 1996-2005, Free Software Foundation, Inc.");
+ Display_Version ("GNAT Preprocessor", "1996");
Copyright_Displayed := True;
end if;
end Display_Copyright;
-- Do some initializations (order is important here!)
Csets.Initialize;
- Namet.Initialize;
Snames.Initialize;
Stringt.Initialize;
+ Prep.Initialize;
-- Initialize the preprocessor
- Prep.Initialize
+ Prep.Setup_Hooks
(Error_Msg => Errutil.Error_Msg'Access,
Scan => Scanner.Scan'Access,
Set_Ignore_Errors => Errutil.Set_Ignore_Errors'Access,
Sinput.Main_Source_File := Deffile;
if Deffile = No_Source_File then
- Fail ("unable to find definition file """,
- Get_Name_String (Deffile_Name),
- """");
+ Fail ("unable to find definition file """
+ & Get_Name_String (Deffile_Name)
+ & """");
end if;
- Scanner.Initialize_Scanner (No_Unit, Deffile);
+ Scanner.Initialize_Scanner (Deffile);
Prep.Parse_Def_File;
end;
if Total_Errors_Detected > 0 then
Errutil.Finalize (Source_Type => "definition");
- Fail ("errors in definition file """,
- Get_Name_String (Deffile_Name), """");
+ Fail ("errors in definition file """
+ & Get_Name_String (Deffile_Name)
+ & """");
end if;
-- If -s switch was specified, print a sorted list of symbol names and
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 --
---------------
Symbol := Index_Of (Data.Symbol);
- -- If symbol does not alrady exist, create a new entry in the mapping
+ -- If symbol does not already exist, create a new entry in the mapping
-- table.
if Symbol = No_Symbol then
procedure Process_One_File is
Infile : Source_File_Index;
+ Modified : Boolean;
+ pragma Warnings (Off, Modified);
+
begin
-- Create the output file (fails if this does not work)
begin
- Create (Text_Outfile, Out_File, Get_Name_String (Outfile_Name));
+ Create
+ (File => Text_Outfile,
+ Mode => Out_File,
+ Name => Get_Name_String (Outfile_Name),
+ Form => "Text_Translation=" &
+ Yes_No (Unix_Line_Terminators).all);
exception
when others =>
Fail
- ("unable to create output file """,
- Get_Name_String (Outfile_Name), """");
+ ("unable to create output file """
+ & Get_Name_String (Outfile_Name)
+ & """");
end;
-- Load the input file
Infile := Sinput.C.Load_File (Get_Name_String (Infile_Name));
if Infile = No_Source_File then
- Fail ("unable to find input file """,
- Get_Name_String (Infile_Name), """");
+ Fail ("unable to find input file """
+ & Get_Name_String (Infile_Name)
+ & """");
end if;
-- Set Main_Source_File to the input file for the benefit of
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
- Prep.Preprocess;
+ Prep.Preprocess (Modified);
-- In verbose mode, if there is no error, report it
exception
when Directory_Error =>
- Fail ("could not create directory """,
- Output, """");
+ Fail ("could not create directory """
+ & Output
+ & """");
end;
end if;
procedure Scan_Command_Line is
Switch : Character;
+ procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
+
+ -- Start of processing for Scan_Command_Line
+
begin
- -- Parse the switches
+ -- First check for --version or --help
+
+ Check_Version_And_Help ("GNATPREP", "1996");
+
+ -- Now scan the other switches
+
+ GNAT.Command_Line.Initialize_Option_Scan;
loop
begin
- Switch := GNAT.Command_Line.Getopt ("D: b c C r s u v");
+ Switch := GNAT.Command_Line.Getopt ("D: b c C r s T u v");
case Switch is
when 's' =>
Opt.List_Preprocessing_Symbols := True;
+ when 'T' =>
+ Unix_Line_Terminators := True;
+
when 'u' =>
Opt.Undefined_Symbols_Are_False := True;
elsif Deffile_Name = No_Name then
Deffile_Name := Name_Find;
else
- Fail ("too many arguments specifed");
+ Fail ("too many arguments specified");
end if;
end;
end loop;
Write_Line (" deffile Name of the definition file");
Write_Eol;
Write_Line ("gnatprep switches:");
+ Display_Usage_Version_And_Help;
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");
+ Write_Line (" -T Use LF as line terminators");
Write_Line (" -u Treat undefined symbols as FALSE");
Write_Line (" -v Verbose mode");
Write_Eol;