/****************************************************************************
 *                                                                          *
 *                         GNAT COMPILER COMPONENTS                         *
 *                                                                          *
 *                              S T R I N G T                               *
 *                                                                          *
 *                              C Header File                               *
 *                                                                          *
 *            Copyright (C) 1992-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.      *
 *                                                                          *
 ****************************************************************************/

/* This is the C header that corresponds to the Ada package specification for
   Stringt.  It also contains the implementations of inlined functions from the
   package body for Stringt.  It was created manually from stringt.ads and
   stringt.adb and must be kept synchronized with changes in these files.

   Note: only the access functions are provided, since the tree transformer
   is not allowed to modify the tree or its auxiliary structures.

   This package contains routines for handling the strings table which is
   used to store string constants encountered in the source, and also those
   additional string constants generated by compile time concatenation and
   other similar processing.

   A string constant in this table consists of a series of Char_Code values,
   so that 16-bit character codes can be properly handled if this feature is
   implemented in the scanner.

   There is no guarantee that hashing is used in the implementation. This
   means that the caller cannot count on having the same Id value for two
   identical strings stored separately.

   The String_Id values reference entries in the Strings table, which
   contains String_Entry records that record the length of each stored string
   and its starting location in the String_Chars table.  */

struct String_Entry
{
  Int String_Index;
  Int Length;
};

/* Pointer to string entry vector. This pointer is passed to the tree
   transformer and stored in a global location.  */
extern struct String_Entry *Strings_Ptr;

/* Pointer to name characters table. This pointer is passed to the tree
   transformer and stored in a global location for access from here. The
   String_Index values are subscripts into this array.  */
extern Char_Code *String_Chars_Ptr;


/* String_Length returns the length of the specified string.  */
INLINE Int String_Length (String_Id);

INLINE Int
String_Length (String_Id Id)
{
  return Strings_Ptr[Id - First_String_Id].Length;
}


/* Get_String_Char obtains the specified character from a stored string.  The
   lower bound of stored strings is always 1, so the range of values is 1 to
   String_Length (Id).  */
INLINE Char_Code Get_String_Char (String_Id, Int);

INLINE Char_Code
Get_String_Char (String_Id Id, Int Index)
{
  return
    String_Chars_Ptr
      [Strings_Ptr[Id - First_String_Id].String_Index + Index - 1];
}
