------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                N A M E T                                 --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2017, 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.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with Alloc;
with Hostparm; use Hostparm;
with Table;
with Types;    use Types;

package Namet is

--  WARNING: There is a C version of this package. Any changes to this
--  source file must be properly reflected in the C header file namet.h
--  which is created manually from namet.ads and namet.adb.

--  This package contains routines for handling the names table. The table
--  is used to store character strings for identifiers and operator symbols,
--  as well as other string values such as unit names and file names.

--  The forms of the entries are as follows:

--    Identifiers        Stored with upper case letters folded to lower case.
--                       Upper half (16#80# bit set) and wide characters are
--                       stored in an encoded form (Uhh for upper half char,
--                       Whhhh for wide characters, WWhhhhhhhh as provided by
--                       the routine Append_Encoded, where hh are hex
--                       digits for the character code using lower case a-f).
--                       Normally the use of U or W in other internal names is
--                       avoided, but these letters may be used in internal
--                       names (without this special meaning), if they appear
--                       as the last character of the name, or they are
--                       followed by an upper case letter (other than the WW
--                       sequence), or an underscore.

--    Operator symbols   Stored with an initial letter O, and the remainder
--                       of the name is the lower case characters XXX where
--                       the name is Name_Op_XXX, see Snames spec for a full
--                       list of the operator names. Normally the use of O
--                       in other internal names is avoided, but it may be
--                       used in internal names (without this special meaning)
--                       if it is the last character of the name, or if it is
--                       followed by an upper case letter or an underscore.

--    Character literals Character literals have names that are used only for
--                       debugging and error message purposes. The form is an
--                       upper case Q followed by a single lower case letter,
--                       or by a Uxx/Wxxxx/WWxxxxxxx encoding as described for
--                       identifiers. The Set_Character_Literal_Name procedure
--                       should be used to construct these encodings. Normally
--                       the use of O in other internal names is avoided, but
--                       it may be used in internal names (without this special
--                       meaning) if it is the last character of the name, or
--                       if it is followed by an upper case letter or an
--                       underscore.

--    Unit names         Stored with upper case letters folded to lower case,
--                       using Uhh/Whhhh/WWhhhhhhhh encoding as described for
--                       identifiers, and a %s or %b suffix for specs/bodies.
--                       See package Uname for further details.

--    File names         Are stored in the form provided by Osint. Typically
--                       they may include wide character escape sequences and
--                       upper case characters (in non-encoded form). Casing
--                       is also derived from the external environment. Note
--                       that file names provided by Osint must generally be
--                       consistent with the names from Fname.Get_File_Name.

--    Other strings      The names table is also used as a convenient storage
--                       location for other variable length strings such as
--                       error messages etc. There are no restrictions on what
--                       characters may appear for such entries.

--  Note: the encodings Uhh (upper half characters), Whhhh (wide characters),
--  WWhhhhhhhh (wide wide characters) and Qx (character literal names) are
--  described in the spec, since they are visible throughout the system (e.g.
--  in debugging output). However, no code should depend on these particular
--  encodings, so it should be possible to change the encodings by making
--  changes only to the Namet specification (to change these comments) and the
--  body (which actually implements the encodings).

--  The names are hashed so that a given name appears only once in the table,
--  except that names entered with Name_Enter as opposed to Name_Find are
--  omitted from the hash table.

--  The first 26 entries in the names table (with Name_Id values in the range
--  First_Name_Id .. First_Name_Id + 25) represent names which are the one
--  character lower case letters in the range a-z, and these names are created
--  and initialized by the Initialize procedure.

--  Five values, one of type Int, one of type Byte, and three of type Boolean,
--  are stored with each names table entry and subprograms are provided for
--  setting and retrieving these associated values. The usage of these values
--  is up to the client:

--    In the compiler we have the following uses:

--      The Int field is used to point to a chain of potentially visible
--      entities (see Sem.Ch8 for details).

--      The Byte field is used to hold the Token_Type value for reserved words
--      (see Sem for details).

--      The Boolean1 field is used to mark address clauses to optimize the
--      performance of the Exp_Util.Following_Address_Clause function.

--      The Boolean2 field is used to mark simple names that appear in
--      Restriction[_Warning]s pragmas for No_Use_Of_Entity. This avoids most
--      unnecessary searches of the No_Use_Of_Entity table.

--      The Boolean3 field is set for names of pragmas that are to be ignored
--      because of the occurrence of a corresponding pragma Ignore_Pragma.

--    In the binder, we have the following uses:

--      The Int field is used in various ways depending on the name involved,
--      see binder documentation for details.

--      The Byte and Boolean fields are unused.

--  Note that the value of the Int and Byte fields are initialized to zero,
--  and the Boolean field is initialized to False, when a new Name table entry
--  is created.

   type Bounded_String (Max_Length : Natural := 2**12) is limited
   --  It's unlikely to have names longer than this. But we don't want to make
   --  it too big, because we declare these on the stack in recursive routines.
   record
      Length : Natural := 0;
      Chars  : String (1 .. Max_Length);
   end record;

   --  To create a Name_Id, you can declare a Bounded_String as a local
   --  variable, and Append things onto it, and finally call Name_Find.
   --  You can also use a String, as in:
   --     X := Name_Find (Some_String & "_some_suffix");

   --  For historical reasons, we also have the Global_Name_Buffer below,
   --  which is used by most of the code via the renamings. New code ought
   --  to avoid the global.

   Global_Name_Buffer : Bounded_String (Max_Length => 4 * Max_Line_Length);
   Name_Buffer        : String renames Global_Name_Buffer.Chars;
   Name_Len           : Natural renames Global_Name_Buffer.Length;

   --  Note that there is some circuitry (e.g. Osint.Write_Program_Name) that
   --  does a save/restore on Name_Len and Name_Buffer (1 .. Name_Len). This
   --  works in part because Name_Len is default-initialized to 0.

   -----------------------------
   -- Types for Namet Package --
   -----------------------------

   --  Name_Id values are used to identify entries in the names table. Except
   --  for the special values No_Name and Error_Name, they are subscript values
   --  for the Names table defined in this package.

   --  Note that with only a few exceptions, which are clearly documented, the
   --  type Name_Id should be regarded as a private type. In particular it is
   --  never appropriate to perform arithmetic operations using this type.

   type Name_Id is range Names_Low_Bound .. Names_High_Bound;
   for Name_Id'Size use 32;
   --  Type used to identify entries in the names table

   No_Name : constant Name_Id := Names_Low_Bound;
   --  The special Name_Id value No_Name is used in the parser to indicate
   --  a situation where no name is present (e.g. on a loop or block).

   Error_Name : constant Name_Id := Names_Low_Bound +  1;
   --  The special Name_Id value Error_Name is used in the parser to
   --  indicate that some kind of error was encountered in scanning out
   --  the relevant name, so it does not have a representable label.

   First_Name_Id : constant Name_Id := Names_Low_Bound + 2;
   --  Subscript of first entry in names table

   subtype Valid_Name_Id is Name_Id range First_Name_Id .. Name_Id'Last;
   --  All but No_Name and Error_Name

   ------------------------------
   -- Name_Id Membership Tests --
   ------------------------------

   --  The following functions allow a convenient notation for testing whether
   --  a Name_Id value matches any one of a list of possible values. In each
   --  case True is returned if the given T argument is equal to any of the V
   --  arguments. These essentially duplicate the Ada 2012 membership tests,
   --  but we cannot use the latter (yet) in the compiler front end, because
   --  of bootstrap considerations

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id;
      V5 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id;
      V5 : Name_Id;
      V6 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id;
      V5 : Name_Id;
      V6 : Name_Id;
      V7 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id;
      V5 : Name_Id;
      V6 : Name_Id;
      V7 : Name_Id;
      V8 : Name_Id) return Boolean;

   function Nam_In
     (T  : Name_Id;
      V1 : Name_Id;
      V2 : Name_Id;
      V3 : Name_Id;
      V4 : Name_Id;
      V5 : Name_Id;
      V6 : Name_Id;
      V7 : Name_Id;
      V8 : Name_Id;
      V9 : Name_Id) return Boolean;

   function Nam_In
     (T   : Name_Id;
      V1  : Name_Id;
      V2  : Name_Id;
      V3  : Name_Id;
      V4  : Name_Id;
      V5  : Name_Id;
      V6  : Name_Id;
      V7  : Name_Id;
      V8  : Name_Id;
      V9  : Name_Id;
      V10 : Name_Id) return Boolean;

   function Nam_In
     (T   : Name_Id;
      V1  : Name_Id;
      V2  : Name_Id;
      V3  : Name_Id;
      V4  : Name_Id;
      V5  : Name_Id;
      V6  : Name_Id;
      V7  : Name_Id;
      V8  : Name_Id;
      V9  : Name_Id;
      V10 : Name_Id;
      V11 : Name_Id) return Boolean;

   function Nam_In
     (T   : Name_Id;
      V1  : Name_Id;
      V2  : Name_Id;
      V3  : Name_Id;
      V4  : Name_Id;
      V5  : Name_Id;
      V6  : Name_Id;
      V7  : Name_Id;
      V8  : Name_Id;
      V9  : Name_Id;
      V10 : Name_Id;
      V11 : Name_Id;
      V12 : Name_Id) return Boolean;

   pragma Inline (Nam_In);
   --  Inline all above functions

   -----------------
   -- Subprograms --
   -----------------

   function To_String (Buf : Bounded_String) return String;
   pragma Inline (To_String);
   function "+" (Buf : Bounded_String) return String renames To_String;

   function Name_Find
     (Buf : Bounded_String := Global_Name_Buffer) return Valid_Name_Id;
   function Name_Find (S : String) return Valid_Name_Id;
   --  Name_Find searches the names table to see if the string has already been
   --  stored. If so, the Id of the existing entry is returned. Otherwise a new
   --  entry is created with its Name_Table_Int fields set to zero/false. Note
   --  that it is permissible for Buf.Length to be zero to lookup the empty
   --  name string.

   function Name_Enter
     (Buf : Bounded_String := Global_Name_Buffer) return Valid_Name_Id;
   function Name_Enter (S : String) return Valid_Name_Id;
   --  Name_Enter is similar to Name_Find. The difference is that it does not
   --  search the table for an existing match, and also subsequent Name_Find
   --  calls using the same name will not locate the entry created by this
   --  call. Thus multiple calls to Name_Enter with the same name will create
   --  multiple entries in the name table with different Name_Id values. This
   --  is useful in the case of created names, which are never expected to be
   --  looked up. Note: Name_Enter should never be used for one character
   --  names, since these are efficiently located without hashing by Name_Find
   --  in any case.

   function Name_Equals
     (N1 : Valid_Name_Id;
      N2 : Valid_Name_Id) return Boolean;
   --  Return whether N1 and N2 denote the same character sequence

   function Get_Name_String (Id : Valid_Name_Id) return String;
   --  Returns the characters of Id as a String. The lower bound is 1.

   --  The following Append procedures ignore any characters that don't fit in
   --  Buf.

   procedure Append (Buf : in out Bounded_String; C : Character);
   --  Append C onto Buf
   pragma Inline (Append);

   procedure Append (Buf : in out Bounded_String; V : Nat);
   --  Append decimal representation of V onto Buf

   procedure Append (Buf : in out Bounded_String; S : String);
   --  Append S onto Buf

   procedure Append (Buf : in out Bounded_String; Buf2 : Bounded_String);
   --  Append Buf2 onto Buf

   procedure Append (Buf : in out Bounded_String; Id : Valid_Name_Id);
   --  Append the characters of Id onto Buf. It is an error to call this with
   --  one of the special name Id values (No_Name or Error_Name).

   procedure Append_Decoded (Buf : in out Bounded_String; Id : Valid_Name_Id);
   --  Same as Append, except that the result is decoded, so that upper half
   --  characters and wide characters appear as originally found in the source
   --  program text, operators have their source forms (special characters and
   --  enclosed in quotes), and character literals appear surrounded by
   --  apostrophes.

   procedure Append_Decoded_With_Brackets
     (Buf : in out Bounded_String;
      Id  : Valid_Name_Id);
   --  Same as Append_Decoded, except that the brackets notation (Uhh
   --  replaced by ["hh"], Whhhh replaced by ["hhhh"], WWhhhhhhhh replaced by
   --  ["hhhhhhhh"]) is used for all non-lower half characters, regardless of
   --  how Opt.Wide_Character_Encoding_Method is set, and also in that
   --  characters in the range 16#80# .. 16#FF# are converted to brackets
   --  notation in all cases. This routine can be used when there is a
   --  requirement for a canonical representation not affected by the
   --  character set options (e.g. in the binder generation of symbols).

   procedure Append_Unqualified
     (Buf : in out Bounded_String; Id : Valid_Name_Id);
   --  Same as Append, except that qualification (as defined in unit
   --  Exp_Dbug) is removed (including both preceding __ delimited names, and
   --  also the suffixes used to indicate package body entities and to
   --  distinguish between overloaded entities). Note that names are not
   --  qualified until just before the call to gigi, so this routine is only
   --  needed by processing that occurs after gigi has been called. This
   --  includes all ASIS processing, since ASIS works on the tree written
   --  after gigi has been called.

   procedure Append_Unqualified_Decoded
     (Buf : in out Bounded_String;
      Id  : Valid_Name_Id);
   --  Same as Append_Unqualified, but decoded as for Append_Decoded

   procedure Append_Encoded (Buf : in out Bounded_String; C : Char_Code);
   --  Appends given character code at the end of Buf. Lower case letters and
   --  digits are stored unchanged. Other 8-bit characters are stored using the
   --  Uhh encoding (hh = hex code), other 16-bit wide character values are
   --  stored using the Whhhh (hhhh = hex code) encoding, and other 32-bit wide
   --  wide character values are stored using the WWhhhhhhhh (hhhhhhhh = hex
   --  code).  Note that this procedure does not fold upper case letters (they
   --  are stored using the Uhh encoding).

   procedure Set_Character_Literal_Name
     (Buf : in out Bounded_String;
      C   : Char_Code);
   --  This procedure sets the proper encoded name for the character literal
   --  for the given character code.

   procedure Insert_Str
     (Buf   : in out Bounded_String;
      S     : String;
      Index : Positive);
   --  Inserts S in Buf, starting at Index. Any existing characters at or past
   --  this location get moved beyond the inserted string.

   function Is_Internal_Name (Buf : Bounded_String) return Boolean;

   procedure Get_Last_Two_Chars
     (N  : Valid_Name_Id;
      C1 : out Character;
      C2 : out Character);
   --  Obtains last two characters of a name. C1 is last but one character and
   --  C2 is last character. If name is less than two characters long then both
   --  C1 and C2 are set to ASCII.NUL on return.

   function Get_Name_Table_Boolean1 (Id : Valid_Name_Id) return Boolean;
   function Get_Name_Table_Boolean2 (Id : Valid_Name_Id) return Boolean;
   function Get_Name_Table_Boolean3 (Id : Valid_Name_Id) return Boolean;
   --  Fetches the Boolean values associated with the given name

   function Get_Name_Table_Byte (Id : Valid_Name_Id) return Byte;
   pragma Inline (Get_Name_Table_Byte);
   --  Fetches the Byte value associated with the given name

   function Get_Name_Table_Int (Id : Valid_Name_Id) return Int;
   pragma Inline (Get_Name_Table_Int);
   --  Fetches the Int value associated with the given name

   procedure Set_Name_Table_Boolean1 (Id : Valid_Name_Id; Val : Boolean);
   procedure Set_Name_Table_Boolean2 (Id : Valid_Name_Id; Val : Boolean);
   procedure Set_Name_Table_Boolean3 (Id : Valid_Name_Id; Val : Boolean);
   --  Sets the Boolean value associated with the given name

   procedure Set_Name_Table_Byte (Id : Valid_Name_Id; Val : Byte);
   pragma Inline (Set_Name_Table_Byte);
   --  Sets the Byte value associated with the given name

   procedure Set_Name_Table_Int (Id : Valid_Name_Id; Val : Int);
   pragma Inline (Set_Name_Table_Int);
   --  Sets the Int value associated with the given name

   function Is_Internal_Name (Id : Valid_Name_Id) return Boolean;
   --  Returns True if the name is an internal name, i.e. contains a character
   --  for which Is_OK_Internal_Letter is true, or if the name starts or ends
   --  with an underscore.
   --
   --  Note: if the name is qualified (has a double underscore), then only the
   --  final entity name is considered, not the qualifying names. Consider for
   --  example that the name:
   --
   --    pkg__B_1__xyz
   --
   --  is not an internal name, because the B comes from the internal name of
   --  a qualifying block, but the xyz means that this was indeed a declared
   --  identifier called "xyz" within this block and there is nothing internal
   --  about that name.

   function Is_OK_Internal_Letter (C : Character) return Boolean;
   pragma Inline (Is_OK_Internal_Letter);
   --  Returns true if C is a suitable character for using as a prefix or a
   --  suffix of an internally generated name, i.e. it is an upper case letter
   --  other than one of the ones used for encoding source names (currently the
   --  set of reserved letters is O, Q, U, W) and also returns False for the
   --  letter X, which is reserved for debug output (see Exp_Dbug).

   function Is_Operator_Name (Id : Valid_Name_Id) return Boolean;
   --  Returns True if name given is of the form of an operator (that is, it
   --  starts with an upper case O).

   function Is_Valid_Name (Id : Name_Id) return Boolean;
   --  True if Id is a valid name - points to a valid entry in the Name_Entries
   --  table.

   function Length_Of_Name (Id : Valid_Name_Id) return Nat;
   pragma Inline (Length_Of_Name);
   --  Returns length of given name in characters. This is the length of the
   --  encoded name, as stored in the names table.

   procedure Initialize;
   --  This is a dummy procedure. It is retained for easy compatibility with
   --  clients who used to call Initialize when this call was required. Now
   --  initialization is performed automatically during package elaboration.
   --  Note that this change fixes problems which existed prior to the change
   --  of Initialize being called more than once. See also Reinitialize which
   --  allows reinitialization of the tables.

   procedure Reinitialize;
   --  Clears the name tables and removes all existing entries from the table.

   procedure Reset_Name_Table;
   --  This procedure is used when there are multiple source files to reset the
   --  name table info entries associated with current entries in the names
   --  table. There is no harm in keeping the names entries themselves from one
   --  compilation to another, but we can't keep the entity info, since this
   --  refers to tree nodes, which are destroyed between each main source file.

   procedure Finalize;
   --  Called at the end of a use of the Namet package (before a subsequent
   --  call to Initialize). Currently this routine is only used to generate
   --  debugging output.

   procedure Lock;
   --  Lock name tables before calling back end. We reserve some extra space
   --  before locking to avoid unnecessary inefficiencies when we unlock.

   procedure Unlock;
   --  Unlocks the name table to allow use of the extra space reserved by the
   --  call to Lock. See gnat1drv for details of the need for this.

   procedure Tree_Read;
   --  Initializes internal tables from current tree file using the relevant
   --  Table.Tree_Read routines. Note that Initialize should not be called if
   --  Tree_Read is used. Tree_Read includes all necessary initialization.

   procedure Tree_Write;
   --  Writes out internal tables to current tree file using the relevant
   --  Table.Tree_Write routines.

   procedure Write_Name (Id : Valid_Name_Id);
   --  Write_Name writes the characters of the specified name using the
   --  standard output procedures in package Output. The name is written
   --  in encoded form (i.e. including Uhh, Whhh, Qx, _op as they appear in
   --  the name table). If Id is Error_Name, or No_Name, no text is output.

   procedure Write_Name_Decoded (Id : Valid_Name_Id);
   --  Like Write_Name, except that the name written is the decoded name, as
   --  described for Append_Decoded.

   function Name_Entries_Count return Nat;
   --  Return current number of entries in the names table

   --------------------------
   -- Obsolete Subprograms --
   --------------------------

   --  The following routines operate on Global_Name_Buffer. New code should
   --  use the routines above, and declare Bounded_Strings as local
   --  variables. Existing code can be improved incrementally by removing calls
   --  to the following. ???If we eliminate all of these, we can remove
   --  Global_Name_Buffer. But be sure to look at namet.h first.

   --  To see what these do, look at the bodies. They are all trivially defined
   --  in terms of routines above.

   procedure Add_Char_To_Name_Buffer (C : Character);
   pragma Inline (Add_Char_To_Name_Buffer);

   procedure Add_Nat_To_Name_Buffer (V : Nat);

   procedure Add_Str_To_Name_Buffer (S : String);

   procedure Get_Decoded_Name_String (Id : Valid_Name_Id);

   procedure Get_Decoded_Name_String_With_Brackets (Id : Valid_Name_Id);

   procedure Get_Name_String (Id : Valid_Name_Id);

   procedure Get_Name_String_And_Append (Id : Valid_Name_Id);

   procedure Get_Unqualified_Decoded_Name_String (Id : Valid_Name_Id);

   procedure Get_Unqualified_Name_String (Id : Valid_Name_Id);

   procedure Insert_Str_In_Name_Buffer (S : String; Index : Positive);

   function Is_Internal_Name return Boolean;

   procedure Set_Character_Literal_Name (C : Char_Code);

   procedure Store_Encoded_Character (C : Char_Code);

   ------------------------------
   -- File and Unit Name Types --
   ------------------------------

   --  These are defined here in Namet rather than Fname and Uname to avoid
   --  problems with dependencies, and to avoid dragging in Fname and Uname
   --  into many more files, but it would be cleaner to move to Fname/Uname.

   type File_Name_Type is new Name_Id;
   --  File names are stored in the names table and this type is used to
   --  indicate that a Name_Id value is being used to hold a simple file name
   --  (which does not include any directory information).

   No_File : constant File_Name_Type := File_Name_Type (No_Name);
   --  Constant used to indicate no file is present (this is used for example
   --  when a search for a file indicates that no file of the name exists).

   Error_File_Name : constant File_Name_Type := File_Name_Type (Error_Name);
   --  The special File_Name_Type value Error_File_Name is used to indicate
   --  a unit name where some previous processing has found an error.

   subtype Error_File_Name_Or_No_File is
     File_Name_Type range No_File .. Error_File_Name;
   --  Used to test for either error file name or no file

   type Path_Name_Type is new Name_Id;
   --  Path names are stored in the names table and this type is used to
   --  indicate that a Name_Id value is being used to hold a path name (that
   --  may contain directory information).

   No_Path : constant Path_Name_Type := Path_Name_Type (No_Name);
   --  Constant used to indicate no path name is present

   type Unit_Name_Type is new Name_Id;
   --  Unit names are stored in the names table and this type is used to
   --  indicate that a Name_Id value is being used to hold a unit name, which
   --  terminates in %b for a body or %s for a spec.

   No_Unit_Name : constant Unit_Name_Type := Unit_Name_Type (No_Name);
   --  Constant used to indicate no file name present

   Error_Unit_Name : constant Unit_Name_Type := Unit_Name_Type (Error_Name);
   --  The special Unit_Name_Type value Error_Unit_Name is used to indicate
   --  a unit name where some previous processing has found an error.

   subtype Error_Unit_Name_Or_No_Unit_Name is
     Unit_Name_Type range No_Unit_Name .. Error_Unit_Name;

   ------------------------
   -- Debugging Routines --
   ------------------------

   procedure wn (Id : Name_Id);
   pragma Export (Ada, wn);
   --  This routine is intended for debugging use only (i.e. it is intended to
   --  be called from the debugger). It writes the characters of the specified
   --  name using the standard output procedures in package Output, followed by
   --  a new line. The name is written in encoded form (i.e. including Uhh,
   --  Whhh, Qx, _op as they appear in the name table). If Id is Error_Name,
   --  No_Name, or invalid an appropriate string is written (<Error_Name>,
   --  <No_Name>, <invalid name>). Unlike Write_Name, this call does not affect
   --  the contents of Name_Buffer or Name_Len.

private

   ---------------------------
   -- Table Data Structures --
   ---------------------------

   --  The following declarations define the data structures used to store
   --  names. The definitions are in the private part of the package spec,
   --  rather than the body, since they are referenced directly by gigi.

   --  This table stores the actual string names. Although logically there is
   --  no need for a terminating character (since the length is stored in the
   --  name entry table), we still store a NUL character at the end of every
   --  name (for convenience in interfacing to the C world).

   package Name_Chars is new Table.Table (
     Table_Component_Type => Character,
     Table_Index_Type     => Int,
     Table_Low_Bound      => 0,
     Table_Initial        => Alloc.Name_Chars_Initial,
     Table_Increment      => Alloc.Name_Chars_Increment,
     Table_Name           => "Name_Chars");

   type Name_Entry is record
      Name_Chars_Index : Int;
      --  Starting location of characters in the Name_Chars table minus one
      --  (i.e. pointer to character just before first character). The reason
      --  for the bias of one is that indexes in Name_Buffer are one's origin,
      --  so this avoids unnecessary adds and subtracts of 1.

      Name_Len : Short;
      --  Length of this name in characters

      Byte_Info : Byte;
      --  Byte value associated with this name

      Boolean1_Info : Boolean;
      Boolean2_Info : Boolean;
      Boolean3_Info : Boolean;
      --  Boolean values associated with the name

      Name_Has_No_Encodings : Boolean;
      --  This flag is set True if the name entry is known not to contain any
      --  special character encodings. This is used to speed up repeated calls
      --  to Append_Decoded. A value of False means that it is not known
      --  whether the name contains any such encodings.

      Hash_Link : Name_Id;
      --  Link to next entry in names table for same hash code

      Int_Info : Int;
      --  Int Value associated with this name

   end record;

   for Name_Entry use record
      Name_Chars_Index      at  0 range 0 .. 31;
      Name_Len              at  4 range 0 .. 15;
      Byte_Info             at  6 range 0 .. 7;
      Boolean1_Info         at  7 range 0 .. 0;
      Boolean2_Info         at  7 range 1 .. 1;
      Boolean3_Info         at  7 range 2 .. 2;
      Name_Has_No_Encodings at  7 range 3 .. 7;
      Hash_Link             at  8 range 0 .. 31;
      Int_Info              at 12 range 0 .. 31;
   end record;

   for Name_Entry'Size use 16 * 8;
   --  This ensures that we did not leave out any fields

   --  This is the table that is referenced by Valid_Name_Id entries.
   --  It contains one entry for each unique name in the table.

   package Name_Entries is new Table.Table (
     Table_Component_Type => Name_Entry,
     Table_Index_Type     => Valid_Name_Id'Base,
     Table_Low_Bound      => First_Name_Id,
     Table_Initial        => Alloc.Names_Initial,
     Table_Increment      => Alloc.Names_Increment,
     Table_Name           => "Name_Entries");

end Namet;
