------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                 P R E P                                  --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2002-2021, 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 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 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 GNAT.Dynamic_Tables;

with Namet; use Namet;
with Types; use Types;

package Prep is

   -----------------
   -- Symbol Data --
   -----------------

   type Symbol_Data is record
      Symbol : Name_Id := No_Name;
      --  The symbol in lower case

      Original : Name_Id := No_Name;
      --  The symbol as originally given in the definition file or on
      --  the command line.

      On_The_Command_Line : Boolean := False;
      --  Set to True if symbol is defined on the command line.
      --  Used to prevent replacement of command line symbols by definition
      --  file symbols.

      Is_A_String : Boolean := False;
      --  Indicate if the value of the symbol has been specified as a string
      --  or simply as a sequence of characters.

      Value : String_Id := No_String;
      --  The value of the symbol (string or sequence of characters)

   end record;

   True_Value : Symbol_Data :=
     (Symbol              => No_Name,
      Original            => No_Name,
      On_The_Command_Line => False,
      Is_A_String         => False,
      Value               => No_String);

   type Symbol_Id is new Nat;
   No_Symbol : constant Symbol_Id := 0;

   package Symbol_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Symbol_Data,
      Table_Index_Type     => Symbol_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 10,
      Table_Increment      => 100);
   --  The table of all symbols

   Mapping : Symbol_Table.Instance;
   --  The mapping table of symbols to values used by procedure Parse_Def_File
   --  and Preprocess.

   function Index_Of (Symbol : Name_Id) return Symbol_Id;
   --  Return the index in the Mapping table of Symbol.
   --  Return No_Symbol if Symbol in not in the Mapping table.

   --  Access to procedure types used by procedure Initialize below:

   type Error_Msg_Proc is access procedure
     (Msg : String; Flag_Location : Source_Ptr);

   type Scan_Proc is access procedure;

   type Set_Ignore_Errors_Proc is access procedure (To : Boolean);

   type Put_Char_Proc is access procedure (C : Character);

   type New_EOL_Proc is access procedure;

   procedure Initialize;
   --  Initialize the preprocessor's global structures

   procedure Setup_Hooks
     (Error_Msg         : Error_Msg_Proc;
      Scan              : Scan_Proc;
      Set_Ignore_Errors : Set_Ignore_Errors_Proc;
      Put_Char          : Put_Char_Proc;
      New_EOL           : New_EOL_Proc);
   --  Set the i/o hooks used by the preprocessor

   procedure Parse_Def_File;
   --  Parse the definition file. The definition file must have already been
   --  loaded and the scanner initialized.

   procedure Preprocess (Source_Modified : out Boolean);
   --  Preprocess the input file. The input file must have already been loaded
   --  and the scanner initialized. Source_Modified is set to True iff the
   --  preprocessor modified the source text.

   procedure Check_Command_Line_Symbol_Definition
     (Definition  : String;
      Data        : out Symbol_Data);
   --  Check the validity of a command line definition <symbol>=<value>.
   --  Return the symbol and its value in Data if the definition is valid,
   --  fail if it is not valid.

   procedure Change_Reserved_Keyword_To_Symbol
     (All_Keywords : Boolean := False);
   --  If Token is an Ada reserved word (other than IF, ELSIF, ELSE,
   --  END, AND, OR, THEN when All_Keywords is False), change it to
   --  Tok_Identifier with the corresponding Token_Name.

   procedure List_Symbols (Foreword : String);
   --  List the symbols used for preprocessing a file, with their values.
   --  If Foreword is not empty, Output Foreword before the list.

end Prep;
