File : namet.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                                N A M E T                                 --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 with Alloc;
  33 with Table;
  34 with Hostparm; use Hostparm;
  35 with System;   use System;
  36 with Types;    use Types;
  37 
  38 package Namet is
  39 
  40 --  WARNING: There is a C version of this package. Any changes to this
  41 --  source file must be properly reflected in the C header file namet.h
  42 --  which is created manually from namet.ads and namet.adb.
  43 
  44 --  This package contains routines for handling the names table. The table
  45 --  is used to store character strings for identifiers and operator symbols,
  46 --  as well as other string values such as unit names and file names.
  47 
  48 --  The forms of the entries are as follows:
  49 
  50 --    Identifiers        Stored with upper case letters folded to lower case.
  51 --                       Upper half (16#80# bit set) and wide characters are
  52 --                       stored in an encoded form (Uhh for upper half char,
  53 --                       Whhhh for wide characters, WWhhhhhhhh as provided by
  54 --                       the routine Append_Encoded, where hh are hex
  55 --                       digits for the character code using lower case a-f).
  56 --                       Normally the use of U or W in other internal names is
  57 --                       avoided, but these letters may be used in internal
  58 --                       names (without this special meaning), if they appear
  59 --                       as the last character of the name, or they are
  60 --                       followed by an upper case letter (other than the WW
  61 --                       sequence), or an underscore.
  62 
  63 --    Operator symbols   Stored with an initial letter O, and the remainder
  64 --                       of the name is the lower case characters XXX where
  65 --                       the name is Name_Op_XXX, see Snames spec for a full
  66 --                       list of the operator names. Normally the use of O
  67 --                       in other internal names is avoided, but it may be
  68 --                       used in internal names (without this special meaning)
  69 --                       if it is the last character of the name, or if it is
  70 --                       followed by an upper case letter or an underscore.
  71 
  72 --    Character literals Character literals have names that are used only for
  73 --                       debugging and error message purposes. The form is an
  74 --                       upper case Q followed by a single lower case letter,
  75 --                       or by a Uxx/Wxxxx/WWxxxxxxx encoding as described for
  76 --                       identifiers. The Set_Character_Literal_Name procedure
  77 --                       should be used to construct these encodings. Normally
  78 --                       the use of O in other internal names is avoided, but
  79 --                       it may be used in internal names (without this special
  80 --                       meaning) if it is the last character of the name, or
  81 --                       if it is followed by an upper case letter or an
  82 --                       underscore.
  83 
  84 --    Unit names         Stored with upper case letters folded to lower case,
  85 --                       using Uhh/Whhhh/WWhhhhhhhh encoding as described for
  86 --                       identifiers, and a %s or %b suffix for specs/bodies.
  87 --                       See package Uname for further details.
  88 
  89 --    File names         Are stored in the form provided by Osint. Typically
  90 --                       they may include wide character escape sequences and
  91 --                       upper case characters (in non-encoded form). Casing
  92 --                       is also derived from the external environment. Note
  93 --                       that file names provided by Osint must generally be
  94 --                       consistent with the names from Fname.Get_File_Name.
  95 
  96 --    Other strings      The names table is also used as a convenient storage
  97 --                       location for other variable length strings such as
  98 --                       error messages etc. There are no restrictions on what
  99 --                       characters may appear for such entries.
 100 
 101 --  Note: the encodings Uhh (upper half characters), Whhhh (wide characters),
 102 --  WWhhhhhhhh (wide wide characters) and Qx (character literal names) are
 103 --  described in the spec, since they are visible throughout the system (e.g.
 104 --  in debugging output). However, no code should depend on these particular
 105 --  encodings, so it should be possible to change the encodings by making
 106 --  changes only to the Namet specification (to change these comments) and the
 107 --  body (which actually implements the encodings).
 108 
 109 --  The names are hashed so that a given name appears only once in the table,
 110 --  except that names entered with Name_Enter as opposed to Name_Find are
 111 --  omitted from the hash table.
 112 
 113 --  The first 26 entries in the names table (with Name_Id values in the range
 114 --  First_Name_Id .. First_Name_Id + 25) represent names which are the one
 115 --  character lower case letters in the range a-z, and these names are created
 116 --  and initialized by the Initialize procedure.
 117 
 118 --  Five values, one of type Int, one of type Byte, and three of type Boolean,
 119 --  are stored with each names table entry and subprograms are provided for
 120 --  setting and retrieving these associated values. The usage of these values
 121 --  is up to the client:
 122 
 123 --    In the compiler we have the following uses:
 124 
 125 --      The Int field is used to point to a chain of potentially visible
 126 --      entities (see Sem.Ch8 for details).
 127 
 128 --      The Byte field is used to hold the Token_Type value for reserved words
 129 --      (see Sem for details).
 130 
 131 --      The Boolean1 field is used to mark address clauses to optimize the
 132 --      performance of the Exp_Util.Following_Address_Clause function.
 133 
 134 --      The Boolean2 field is used to mark simple names that appear in
 135 --      Restriction[_Warning]s pragmas for No_Use_Of_Entity. This avoids most
 136 --      unnecessary searches of the No_Use_Of_Entity table.
 137 
 138 --      The Boolean3 field is set for names of pragmas that are to be ignored
 139 --      because of the occurrence of a corresponding pragma Ignore_Pragma.
 140 
 141 --    In the binder, we have the following uses:
 142 
 143 --      The Int field is used in various ways depending on the name involved,
 144 --      see binder documentation for details.
 145 
 146 --      The Byte and Boolean fields are unused.
 147 
 148 --  Note that the value of the Int and Byte fields are initialized to zero,
 149 --  and the Boolean field is initialized to False, when a new Name table entry
 150 --  is created.
 151 
 152    type Bounded_String (Max_Length : Natural := 4 * Max_Line_Length) is limited
 153    --  The default here is intended to be an infinite value that ensures that
 154    --  we never overflow the buffer (names this long are too absurd to worry).
 155    record
 156       Length : Natural := 0;
 157       Chars  : String (1 .. Max_Length);
 158    end record;
 159 
 160    --  To create a Name_Id, you can declare a Bounded_String as a local
 161    --  variable, and Append things onto it, and finally call Name_Find.
 162    --  You can also use a String, as in:
 163    --     X := Name_Find (Some_String & "_some_suffix");
 164 
 165    --  For historical reasons, we also have the Global_Name_Buffer below,
 166    --  which is used by most of the code via the renamings. New code ought
 167    --  to avoid the global.
 168 
 169    Global_Name_Buffer : Bounded_String;
 170    Name_Buffer        : String renames Global_Name_Buffer.Chars;
 171    Name_Len           : Natural renames Global_Name_Buffer.Length;
 172 
 173    --  Note that there is some circuitry (e.g. Osint.Write_Program_Name) that
 174    --  does a save/restore on Name_Len and Name_Buffer (1 .. Name_Len). This
 175    --  works in part because Name_Len is default-initialized to 0.
 176 
 177    -----------------------------
 178    -- Types for Namet Package --
 179    -----------------------------
 180 
 181    --  Name_Id values are used to identify entries in the names table. Except
 182    --  for the special values No_Name and Error_Name, they are subscript values
 183    --  for the Names table defined in this package.
 184 
 185    --  Note that with only a few exceptions, which are clearly documented, the
 186    --  type Name_Id should be regarded as a private type. In particular it is
 187    --  never appropriate to perform arithmetic operations using this type.
 188 
 189    type Name_Id is range Names_Low_Bound .. Names_High_Bound;
 190    for Name_Id'Size use 32;
 191    --  Type used to identify entries in the names table
 192 
 193    No_Name : constant Name_Id := Names_Low_Bound;
 194    --  The special Name_Id value No_Name is used in the parser to indicate
 195    --  a situation where no name is present (e.g. on a loop or block).
 196 
 197    Error_Name : constant Name_Id := Names_Low_Bound +  1;
 198    --  The special Name_Id value Error_Name is used in the parser to
 199    --  indicate that some kind of error was encountered in scanning out
 200    --  the relevant name, so it does not have a representable label.
 201 
 202    subtype Error_Name_Or_No_Name is Name_Id range No_Name .. Error_Name;
 203    --  Used to test for either error name or no name
 204 
 205    First_Name_Id : constant Name_Id := Names_Low_Bound + 2;
 206    --  Subscript of first entry in names table
 207 
 208    ------------------------------
 209    -- Name_Id Membership Tests --
 210    ------------------------------
 211 
 212    --  The following functions allow a convenient notation for testing whether
 213    --  a Name_Id value matches any one of a list of possible values. In each
 214    --  case True is returned if the given T argument is equal to any of the V
 215    --  arguments. These essentially duplicate the Ada 2012 membership tests,
 216    --  but we cannot use the latter (yet) in the compiler front end, because
 217    --  of bootstrap considerations
 218 
 219    function Nam_In
 220      (T  : Name_Id;
 221       V1 : Name_Id;
 222       V2 : Name_Id) return Boolean;
 223 
 224    function Nam_In
 225      (T  : Name_Id;
 226       V1 : Name_Id;
 227       V2 : Name_Id;
 228       V3 : Name_Id) return Boolean;
 229 
 230    function Nam_In
 231      (T  : Name_Id;
 232       V1 : Name_Id;
 233       V2 : Name_Id;
 234       V3 : Name_Id;
 235       V4 : Name_Id) return Boolean;
 236 
 237    function Nam_In
 238      (T  : Name_Id;
 239       V1 : Name_Id;
 240       V2 : Name_Id;
 241       V3 : Name_Id;
 242       V4 : Name_Id;
 243       V5 : Name_Id) return Boolean;
 244 
 245    function Nam_In
 246      (T  : Name_Id;
 247       V1 : Name_Id;
 248       V2 : Name_Id;
 249       V3 : Name_Id;
 250       V4 : Name_Id;
 251       V5 : Name_Id;
 252       V6 : Name_Id) return Boolean;
 253 
 254    function Nam_In
 255      (T  : Name_Id;
 256       V1 : Name_Id;
 257       V2 : Name_Id;
 258       V3 : Name_Id;
 259       V4 : Name_Id;
 260       V5 : Name_Id;
 261       V6 : Name_Id;
 262       V7 : Name_Id) return Boolean;
 263 
 264    function Nam_In
 265      (T  : Name_Id;
 266       V1 : Name_Id;
 267       V2 : Name_Id;
 268       V3 : Name_Id;
 269       V4 : Name_Id;
 270       V5 : Name_Id;
 271       V6 : Name_Id;
 272       V7 : Name_Id;
 273       V8 : Name_Id) return Boolean;
 274 
 275    function Nam_In
 276      (T  : Name_Id;
 277       V1 : Name_Id;
 278       V2 : Name_Id;
 279       V3 : Name_Id;
 280       V4 : Name_Id;
 281       V5 : Name_Id;
 282       V6 : Name_Id;
 283       V7 : Name_Id;
 284       V8 : Name_Id;
 285       V9 : Name_Id) return Boolean;
 286 
 287    function Nam_In
 288      (T   : Name_Id;
 289       V1  : Name_Id;
 290       V2  : Name_Id;
 291       V3  : Name_Id;
 292       V4  : Name_Id;
 293       V5  : Name_Id;
 294       V6  : Name_Id;
 295       V7  : Name_Id;
 296       V8  : Name_Id;
 297       V9  : Name_Id;
 298       V10 : Name_Id) return Boolean;
 299 
 300    function Nam_In
 301      (T   : Name_Id;
 302       V1  : Name_Id;
 303       V2  : Name_Id;
 304       V3  : Name_Id;
 305       V4  : Name_Id;
 306       V5  : Name_Id;
 307       V6  : Name_Id;
 308       V7  : Name_Id;
 309       V8  : Name_Id;
 310       V9  : Name_Id;
 311       V10 : Name_Id;
 312       V11 : Name_Id) return Boolean;
 313 
 314    pragma Inline (Nam_In);
 315    --  Inline all above functions
 316 
 317    -----------------
 318    -- Subprograms --
 319    -----------------
 320 
 321    function To_String (Buf : Bounded_String) return String;
 322    pragma Inline (To_String);
 323    function "+" (Buf : Bounded_String) return String renames To_String;
 324 
 325    function Name_Find
 326      (Buf : Bounded_String := Global_Name_Buffer) return Name_Id;
 327    function Name_Find (S : String) return Name_Id;
 328    --  Name_Find searches the names table to see if the string has already been
 329    --  stored. If so, the Id of the existing entry is returned. Otherwise a new
 330    --  entry is created with its Name_Table_Int fields set to zero/false. Note
 331    --  that it is permissible for Buf.Length to be zero to lookup the empty
 332    --  name string.
 333 
 334    function Name_Enter
 335      (Buf : Bounded_String := Global_Name_Buffer) return Name_Id;
 336    --  Name_Enter is similar to Name_Find. The difference is that it does not
 337    --  search the table for an existing match, and also subsequent Name_Find
 338    --  calls using the same name will not locate the entry created by this
 339    --  call. Thus multiple calls to Name_Enter with the same name will create
 340    --  multiple entries in the name table with different Name_Id values. This
 341    --  is useful in the case of created names, which are never expected to be
 342    --  looked up. Note: Name_Enter should never be used for one character
 343    --  names, since these are efficiently located without hashing by Name_Find
 344    --  in any case.
 345 
 346    function Name_Equals (N1 : Name_Id; N2 : Name_Id) return Boolean;
 347    --  Return whether N1 and N2 denote the same character sequence
 348 
 349    function Get_Name_String (Id : Name_Id) return String;
 350    --  Returns the characters of Id as a String. The lower bound is 1.
 351 
 352    --  The following Append procedures ignore any characters that don't fit in
 353    --  Buf.
 354 
 355    procedure Append (Buf : in out Bounded_String; C : Character);
 356    --  Append C onto Buf
 357    pragma Inline (Append);
 358 
 359    procedure Append (Buf : in out Bounded_String; V : Nat);
 360    --  Append decimal representation of V onto Buf
 361 
 362    procedure Append (Buf : in out Bounded_String; S : String);
 363    --  Append S onto Buf
 364 
 365    procedure Append (Buf : in out Bounded_String; Buf2 : Bounded_String);
 366    --  Append Buf2 onto Buf
 367 
 368    procedure Append (Buf : in out Bounded_String; Id : Name_Id);
 369    --  Append the characters of Id onto Buf. It is an error to call this with
 370    --  one of the special name Id values (No_Name or Error_Name).
 371 
 372    procedure Append_Decoded (Buf : in out Bounded_String; Id : Name_Id);
 373    --  Same as Append, except that the result is decoded, so that upper half
 374    --  characters and wide characters appear as originally found in the source
 375    --  program text, operators have their source forms (special characters and
 376    --  enclosed in quotes), and character literals appear surrounded by
 377    --  apostrophes.
 378 
 379    procedure Append_Decoded_With_Brackets
 380      (Buf : in out Bounded_String;
 381       Id  : Name_Id);
 382    --  Same as Append_Decoded, except that the brackets notation (Uhh
 383    --  replaced by ["hh"], Whhhh replaced by ["hhhh"], WWhhhhhhhh replaced by
 384    --  ["hhhhhhhh"]) is used for all non-lower half characters, regardless of
 385    --  how Opt.Wide_Character_Encoding_Method is set, and also in that
 386    --  characters in the range 16#80# .. 16#FF# are converted to brackets
 387    --  notation in all cases. This routine can be used when there is a
 388    --  requirement for a canonical representation not affected by the
 389    --  character set options (e.g. in the binder generation of symbols).
 390 
 391    procedure Append_Unqualified (Buf : in out Bounded_String; Id : Name_Id);
 392    --  Same as Append, except that qualification (as defined in unit
 393    --  Exp_Dbug) is removed (including both preceding __ delimited names, and
 394    --  also the suffixes used to indicate package body entities and to
 395    --  distinguish between overloaded entities). Note that names are not
 396    --  qualified until just before the call to gigi, so this routine is only
 397    --  needed by processing that occurs after gigi has been called. This
 398    --  includes all ASIS processing, since ASIS works on the tree written
 399    --  after gigi has been called.
 400 
 401    procedure Append_Unqualified_Decoded
 402      (Buf : in out Bounded_String;
 403       Id  : Name_Id);
 404    --  Same as Append_Unqualified, but decoded as for Append_Decoded
 405 
 406    procedure Append_Encoded (Buf : in out Bounded_String; C : Char_Code);
 407    --  Appends given character code at the end of Buf. Lower case letters and
 408    --  digits are stored unchanged. Other 8-bit characters are stored using the
 409    --  Uhh encoding (hh = hex code), other 16-bit wide character values are
 410    --  stored using the Whhhh (hhhh = hex code) encoding, and other 32-bit wide
 411    --  wide character values are stored using the WWhhhhhhhh (hhhhhhhh = hex
 412    --  code).  Note that this procedure does not fold upper case letters (they
 413    --  are stored using the Uhh encoding).
 414 
 415    procedure Set_Character_Literal_Name
 416      (Buf : in out Bounded_String;
 417       C   : Char_Code);
 418    --  This procedure sets the proper encoded name for the character literal
 419    --  for the given character code.
 420 
 421    procedure Insert_Str
 422      (Buf   : in out Bounded_String;
 423       S     : String;
 424       Index : Positive);
 425    --  Inserts S in Buf, starting at Index. Any existing characters at or past
 426    --  this location get moved beyond the inserted string.
 427 
 428    function Is_Internal_Name (Buf : Bounded_String) return Boolean;
 429 
 430    procedure Get_Last_Two_Chars
 431      (N  : Name_Id;
 432       C1 : out Character;
 433       C2 : out Character);
 434    --  Obtains last two characters of a name. C1 is last but one character and
 435    --  C2 is last character. If name is less than two characters long then both
 436    --  C1 and C2 are set to ASCII.NUL on return.
 437 
 438    function Get_Name_Table_Boolean1 (Id : Name_Id) return Boolean;
 439    function Get_Name_Table_Boolean2 (Id : Name_Id) return Boolean;
 440    function Get_Name_Table_Boolean3 (Id : Name_Id) return Boolean;
 441    --  Fetches the Boolean values associated with the given name
 442 
 443    function Get_Name_Table_Byte (Id : Name_Id) return Byte;
 444    pragma Inline (Get_Name_Table_Byte);
 445    --  Fetches the Byte value associated with the given name
 446 
 447    function Get_Name_Table_Int (Id : Name_Id) return Int;
 448    pragma Inline (Get_Name_Table_Int);
 449    --  Fetches the Int value associated with the given name
 450 
 451    procedure Set_Name_Table_Boolean1 (Id : Name_Id; Val : Boolean);
 452    procedure Set_Name_Table_Boolean2 (Id : Name_Id; Val : Boolean);
 453    procedure Set_Name_Table_Boolean3 (Id : Name_Id; Val : Boolean);
 454    --  Sets the Boolean value associated with the given name
 455 
 456    procedure Set_Name_Table_Byte (Id : Name_Id; Val : Byte);
 457    pragma Inline (Set_Name_Table_Byte);
 458    --  Sets the Byte value associated with the given name
 459 
 460    procedure Set_Name_Table_Int (Id : Name_Id; Val : Int);
 461    pragma Inline (Set_Name_Table_Int);
 462    --  Sets the Int value associated with the given name
 463 
 464    function Is_Internal_Name (Id : Name_Id) return Boolean;
 465    --  Returns True if the name is an internal name (i.e. contains a character
 466    --  for which Is_OK_Internal_Letter is true, or if the name starts or ends
 467    --  with an underscore.
 468    --
 469    --  Note: if the name is qualified (has a double underscore), then only the
 470    --  final entity name is considered, not the qualifying names. Consider for
 471    --  example that the name:
 472    --
 473    --    pkg__B_1__xyz
 474    --
 475    --  is not an internal name, because the B comes from the internal name of
 476    --  a qualifying block, but the xyz means that this was indeed a declared
 477    --  identifier called "xyz" within this block and there is nothing internal
 478    --  about that name.
 479 
 480    function Is_OK_Internal_Letter (C : Character) return Boolean;
 481    pragma Inline (Is_OK_Internal_Letter);
 482    --  Returns true if C is a suitable character for using as a prefix or a
 483    --  suffix of an internally generated name, i.e. it is an upper case letter
 484    --  other than one of the ones used for encoding source names (currently the
 485    --  set of reserved letters is O, Q, U, W) and also returns False for the
 486    --  letter X, which is reserved for debug output (see Exp_Dbug).
 487 
 488    function Is_Operator_Name (Id : Name_Id) return Boolean;
 489    --  Returns True if name given is of the form of an operator (that is, it
 490    --  starts with an upper case O).
 491 
 492    function Is_Valid_Name (Id : Name_Id) return Boolean;
 493    --  True if Id is a valid name - points to a valid entry in the Name_Entries
 494    --  table.
 495 
 496    function Length_Of_Name (Id : Name_Id) return Nat;
 497    pragma Inline (Length_Of_Name);
 498    --  Returns length of given name in characters. This is the length of the
 499    --  encoded name, as stored in the names table.
 500 
 501    procedure Initialize;
 502    --  This is a dummy procedure. It is retained for easy compatibility with
 503    --  clients who used to call Initialize when this call was required. Now
 504    --  initialization is performed automatically during package elaboration.
 505    --  Note that this change fixes problems which existed prior to the change
 506    --  of Initialize being called more than once. See also Reinitialize which
 507    --  allows reinitialization of the tables.
 508 
 509    procedure Reinitialize;
 510    --  Clears the name tables and removes all existing entries from the table.
 511 
 512    procedure Reset_Name_Table;
 513    --  This procedure is used when there are multiple source files to reset the
 514    --  name table info entries associated with current entries in the names
 515    --  table. There is no harm in keeping the names entries themselves from one
 516    --  compilation to another, but we can't keep the entity info, since this
 517    --  refers to tree nodes, which are destroyed between each main source file.
 518 
 519    procedure Finalize;
 520    --  Called at the end of a use of the Namet package (before a subsequent
 521    --  call to Initialize). Currently this routine is only used to generate
 522    --  debugging output.
 523 
 524    procedure Lock;
 525    --  Lock name tables before calling back end. We reserve some extra space
 526    --  before locking to avoid unnecessary inefficiencies when we unlock.
 527 
 528    procedure Unlock;
 529    --  Unlocks the name table to allow use of the extra space reserved by the
 530    --  call to Lock. See gnat1drv for details of the need for this.
 531 
 532    procedure Tree_Read;
 533    --  Initializes internal tables from current tree file using the relevant
 534    --  Table.Tree_Read routines. Note that Initialize should not be called if
 535    --  Tree_Read is used. Tree_Read includes all necessary initialization.
 536 
 537    procedure Tree_Write;
 538    --  Writes out internal tables to current tree file using the relevant
 539    --  Table.Tree_Write routines.
 540 
 541    procedure Write_Name (Id : Name_Id);
 542    --  Write_Name writes the characters of the specified name using the
 543    --  standard output procedures in package Output. The name is written
 544    --  in encoded form (i.e. including Uhh, Whhh, Qx, _op as they appear in
 545    --  the name table). If Id is Error_Name, or No_Name, no text is output.
 546 
 547    procedure Write_Name_Decoded (Id : Name_Id);
 548    --  Like Write_Name, except that the name written is the decoded name, as
 549    --  described for Append_Decoded.
 550 
 551    function Name_Chars_Address return System.Address;
 552    --  Return starting address of name characters table (used in Back_End call
 553    --  to Gigi).
 554 
 555    function Name_Entries_Address return System.Address;
 556    --  Return starting address of Names table (used in Back_End call to Gigi)
 557 
 558    function Name_Entries_Count return Nat;
 559    --  Return current number of entries in the names table
 560 
 561    --------------------------
 562    -- Obsolete Subprograms --
 563    --------------------------
 564 
 565    --  The following routines operate on Global_Name_Buffer. New code should
 566    --  use the routines above, and declare Bounded_Strings as local
 567    --  variables. Existing code can be improved incrementally by removing calls
 568    --  to the following. ???If we eliminate all of these, we can remove
 569    --  Global_Name_Buffer. But be sure to look at namet.h first.
 570 
 571    --  To see what these do, look at the bodies. They are all trivially defined
 572    --  in terms of routines above.
 573 
 574    procedure Add_Char_To_Name_Buffer (C : Character);
 575    pragma Inline (Add_Char_To_Name_Buffer);
 576 
 577    procedure Add_Nat_To_Name_Buffer (V : Nat);
 578 
 579    procedure Add_Str_To_Name_Buffer (S : String);
 580 
 581    procedure Get_Decoded_Name_String (Id : Name_Id);
 582 
 583    procedure Get_Decoded_Name_String_With_Brackets (Id : Name_Id);
 584 
 585    procedure Get_Name_String (Id : Name_Id);
 586 
 587    procedure Get_Name_String_And_Append (Id : Name_Id);
 588 
 589    procedure Get_Unqualified_Decoded_Name_String (Id : Name_Id);
 590 
 591    procedure Get_Unqualified_Name_String (Id : Name_Id);
 592 
 593    procedure Insert_Str_In_Name_Buffer (S : String; Index : Positive);
 594 
 595    function Is_Internal_Name return Boolean;
 596 
 597    procedure Set_Character_Literal_Name (C : Char_Code);
 598 
 599    procedure Store_Encoded_Character (C : Char_Code);
 600 
 601    ------------------------------
 602    -- File and Unit Name Types --
 603    ------------------------------
 604 
 605    --  These are defined here in Namet rather than Fname and Uname to avoid
 606    --  problems with dependencies, and to avoid dragging in Fname and Uname
 607    --  into many more files, but it would be cleaner to move to Fname/Uname.
 608 
 609    type File_Name_Type is new Name_Id;
 610    --  File names are stored in the names table and this type is used to
 611    --  indicate that a Name_Id value is being used to hold a simple file name
 612    --  (which does not include any directory information).
 613 
 614    No_File : constant File_Name_Type := File_Name_Type (No_Name);
 615    --  Constant used to indicate no file is present (this is used for example
 616    --  when a search for a file indicates that no file of the name exists).
 617 
 618    Error_File_Name : constant File_Name_Type := File_Name_Type (Error_Name);
 619    --  The special File_Name_Type value Error_File_Name is used to indicate
 620    --  a unit name where some previous processing has found an error.
 621 
 622    subtype Error_File_Name_Or_No_File is
 623      File_Name_Type range No_File .. Error_File_Name;
 624    --  Used to test for either error file name or no file
 625 
 626    type Path_Name_Type is new Name_Id;
 627    --  Path names are stored in the names table and this type is used to
 628    --  indicate that a Name_Id value is being used to hold a path name (that
 629    --  may contain directory information).
 630 
 631    No_Path : constant Path_Name_Type := Path_Name_Type (No_Name);
 632    --  Constant used to indicate no path name is present
 633 
 634    type Unit_Name_Type is new Name_Id;
 635    --  Unit names are stored in the names table and this type is used to
 636    --  indicate that a Name_Id value is being used to hold a unit name, which
 637    --  terminates in %b for a body or %s for a spec.
 638 
 639    No_Unit_Name : constant Unit_Name_Type := Unit_Name_Type (No_Name);
 640    --  Constant used to indicate no file name present
 641 
 642    Error_Unit_Name : constant Unit_Name_Type := Unit_Name_Type (Error_Name);
 643    --  The special Unit_Name_Type value Error_Unit_Name is used to indicate
 644    --  a unit name where some previous processing has found an error.
 645 
 646    subtype Error_Unit_Name_Or_No_Unit_Name is
 647      Unit_Name_Type range No_Unit_Name .. Error_Unit_Name;
 648 
 649    ------------------------
 650    -- Debugging Routines --
 651    ------------------------
 652 
 653    procedure wn (Id : Name_Id);
 654    pragma Export (Ada, wn);
 655    --  This routine is intended for debugging use only (i.e. it is intended to
 656    --  be called from the debugger). It writes the characters of the specified
 657    --  name using the standard output procedures in package Output, followed by
 658    --  a new line. The name is written in encoded form (i.e. including Uhh,
 659    --  Whhh, Qx, _op as they appear in the name table). If Id is Error_Name,
 660    --  No_Name, or invalid an appropriate string is written (<Error_Name>,
 661    --  <No_Name>, <invalid name>). Unlike Write_Name, this call does not affect
 662    --  the contents of Name_Buffer or Name_Len.
 663 
 664 private
 665 
 666    ---------------------------
 667    -- Table Data Structures --
 668    ---------------------------
 669 
 670    --  The following declarations define the data structures used to store
 671    --  names. The definitions are in the private part of the package spec,
 672    --  rather than the body, since they are referenced directly by gigi.
 673 
 674    --  This table stores the actual string names. Although logically there is
 675    --  no need for a terminating character (since the length is stored in the
 676    --  name entry table), we still store a NUL character at the end of every
 677    --  name (for convenience in interfacing to the C world).
 678 
 679    package Name_Chars is new Table.Table (
 680      Table_Component_Type => Character,
 681      Table_Index_Type     => Int,
 682      Table_Low_Bound      => 0,
 683      Table_Initial        => Alloc.Name_Chars_Initial,
 684      Table_Increment      => Alloc.Name_Chars_Increment,
 685      Table_Name           => "Name_Chars");
 686 
 687    type Name_Entry is record
 688       Name_Chars_Index : Int;
 689       --  Starting location of characters in the Name_Chars table minus one
 690       --  (i.e. pointer to character just before first character). The reason
 691       --  for the bias of one is that indexes in Name_Buffer are one's origin,
 692       --  so this avoids unnecessary adds and subtracts of 1.
 693 
 694       Name_Len : Short;
 695       --  Length of this name in characters
 696 
 697       Byte_Info : Byte;
 698       --  Byte value associated with this name
 699 
 700       Boolean1_Info : Boolean;
 701       Boolean2_Info : Boolean;
 702       Boolean3_Info : Boolean;
 703       --  Boolean values associated with the name
 704 
 705       Name_Has_No_Encodings : Boolean;
 706       --  This flag is set True if the name entry is known not to contain any
 707       --  special character encodings. This is used to speed up repeated calls
 708       --  to Append_Decoded. A value of False means that it is not known
 709       --  whether the name contains any such encodings.
 710 
 711       Hash_Link : Name_Id;
 712       --  Link to next entry in names table for same hash code
 713 
 714       Int_Info : Int;
 715       --  Int Value associated with this name
 716 
 717    end record;
 718 
 719    for Name_Entry use record
 720       Name_Chars_Index      at  0 range 0 .. 31;
 721       Name_Len              at  4 range 0 .. 15;
 722       Byte_Info             at  6 range 0 .. 7;
 723       Boolean1_Info         at  7 range 0 .. 0;
 724       Boolean2_Info         at  7 range 1 .. 1;
 725       Boolean3_Info         at  7 range 2 .. 2;
 726       Name_Has_No_Encodings at  7 range 3 .. 7;
 727       Hash_Link             at  8 range 0 .. 31;
 728       Int_Info              at 12 range 0 .. 31;
 729    end record;
 730 
 731    for Name_Entry'Size use 16 * 8;
 732    --  This ensures that we did not leave out any fields
 733 
 734    --  This is the table that is referenced by Name_Id entries.
 735    --  It contains one entry for each unique name in the table.
 736 
 737    package Name_Entries is new Table.Table (
 738      Table_Component_Type => Name_Entry,
 739      Table_Index_Type     => Name_Id'Base,
 740      Table_Low_Bound      => First_Name_Id,
 741      Table_Initial        => Alloc.Names_Initial,
 742      Table_Increment      => Alloc.Names_Increment,
 743      Table_Name           => "Name_Entries");
 744 
 745 end Namet;