home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / sinput.ads < prev    next >
Text File  |  1996-09-28  |  18KB  |  375 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                               S I N P U T                                --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.33 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. --  This package contains the input routines used for reading the
  27. --  input source file. The actual I/O routines are in OS_Interface,
  28. --  with this module containing only the system independent processing.
  29.  
  30. --  General Note: throughout the compiler, we use the term line or source
  31. --  line to refer to a physical line in the source, terminated by the end of
  32. --  physical line sequence. See Skip_Line_Terminators procedure for a full
  33. --  description of the difference between logical and physical lines.
  34.  
  35. with Casing; use Casing;
  36. with Table;
  37. with Types;  use Types;
  38.  
  39. package Sinput is
  40.  
  41.    -----------------------
  42.    -- Source File Table --
  43.    -----------------------
  44.  
  45.    --  The source file table has an entry for each source file read in for
  46.    --  this run of the compiler. This table is (default) initialized when
  47.    --  the compiler is loaded, and simply accumulates entries as compilation
  48.    --  proceeds and the Sinput.L.Load_Source_File procedure is called to load
  49.    --  required source files.
  50.  
  51.    --  In the case where there are multiple main units (e.g. in the case of
  52.    --  the cross-reference tool), this table is not reset between these units,
  53.    --  so that a given source file is only read once if it is used by two
  54.    --  separate main units.
  55.  
  56.    --  The entries in the table are accessed using a Source_File_Index that
  57.    --  ranges from 1 to Last_Source_File. Each entry has the following fields
  58.  
  59.    --  File_Name : File_Name_Type
  60.    --    Name of the source file (simple name with no directory information).
  61.    --    Set by Sinput.L.Load_Source_File and cannot be subequently changed.
  62.  
  63.    --  Full_File_Name : File_Name_Type
  64.    --    Full file name (full name with directory info), used for generation
  65.    --    of error messages, etc. Set by Sinput.L.Load_Source_File and cannot
  66.    --    be subsequently changed.
  67.  
  68.    --  Reference_Name : File_Name_Type
  69.    --    Name to be used for source file references in error messages and
  70.    --    debugging information. Identical to Full_File_Name unless pragma
  71.    --    Source_Reference is used to change it. Only the processing for
  72.    --    the Source_Reference pragma may set this field.
  73.  
  74.    --  Line_Offset : Int;
  75.    --    Line number value to be added to physical line numbers in file to
  76.    --    get logical line number for error messages. Normally zero unless
  77.    --    reset by pragma Source_Reference. This value is never referenced by
  78.    --    clients who should use Logical_To_Physical and Physical_To_Logical
  79.    --    instead, but it is set by pragma Source_Reference processing.
  80.  
  81.    --  Source_Text : Source_Buffer_Ptr
  82.    --    Text of source file. Note that every source file has a distinct set
  83.    --    of non-overlapping logical bounds, so it is possible to determine
  84.    --    which file is referenced from a given subscript (Source_Ptr) value.
  85.    --    Set by Sinput.L.Load_Source_File and cannot be subsequently changed.
  86.  
  87.    --  Source_First : Source_Ptr;
  88.    --    Subscript of first character in Source_Text. Note that this cannot
  89.    --    be obtained as Source_Text'First, because we use virtual origin
  90.    --    addressing. Set by Sinput.L procedures when the entry is first
  91.    --    created and never subsequently changed.
  92.  
  93.    --  Source_Last : Source_Ptr;
  94.    --    Subscript of last character in Source_Text. Note that this cannot
  95.    --    be obtained as Source_Text'Last, because we use virtual origin
  96.    --    addressing, so this value is always Source_Ptr'Last. Set by
  97.    --    Sinput.L procedures when the entry is first created and never
  98.    --    subsequently changed.
  99.  
  100.    --  Time_Stamp : Time_Stamp_Type;
  101.    --    Time stamp of the source file. Set by Sinput.L.Load_Source_File,
  102.    --    and cannot be subsequently changed.
  103.  
  104.    --  Num_Source_Lines : Nat
  105.    --    Number of source lines in the file. While a file is being read,
  106.    --    it is the number of lines so far scanned. Read only for clients.
  107.  
  108.    --  Keyword_Casing : Casing_Type;
  109.    --    Casing style used in file for keyword casing. This is initialized
  110.    --    to Unknown, and then set from the first occurrence of a keyword.
  111.    --    This value is used only for formatting of error messages.
  112.  
  113.    --  Identifier_Casing : Casing_Type;
  114.    --    Casing style used in file for identifier casing. This is initialized
  115.    --    to Unknown, and then set from an identifier in the program as soon as
  116.    --    one is found whose casing is sufficiently clear to make a decision.
  117.    --    This value is used for formatting of error messages, and also is used
  118.    --    in the detection of keywords misused as identifiers.
  119.  
  120.    --  Instantiation : Source_Ptr;
  121.    --    Source file location of the instantiation if this source file entry
  122.    --    represents a generic instantiation. Set to No_Location for the case
  123.    --    of a normal non-instantiation entry. See Sinput_L for details. This
  124.    --    field is read-only for clients.
  125.  
  126.    --  Template : Source_File_Index;
  127.    --    Source file index of the source file containing the template if this
  128.    --    is a generic instantiation. Set to No_Source_File for the normal case
  129.    --    of a non-instantiation entry. See Sinput_L for details. This field is
  130.    --    read-only for clients.
  131.  
  132.    --  The source file table is accessed by clients using the following
  133.    --  subprogram interface:
  134.  
  135.    function File_Name         (S : Source_File_Index) return File_Name_Type;
  136.    function Full_File_Name    (S : Source_File_Index) return File_Name_Type;
  137.    function Identifier_Casing (S : Source_File_Index) return Casing_Type;
  138.    function Instantiation     (S : Source_File_Index) return Source_Ptr;
  139.    function Keyword_Casing    (S : Source_File_Index) return Casing_Type;
  140.    function Num_Source_Lines  (S : Source_File_Index) return Nat;
  141.    function Reference_Name    (S : Source_File_Index) return File_Name_Type;
  142.    function Source_Text       (S : Source_File_Index) return Source_Buffer_Ptr;
  143.    function Source_First      (S : Source_File_Index) return Source_Ptr;
  144.    function Source_Last       (S : Source_File_Index) return Source_Ptr;
  145.    function Template          (S : Source_File_Index) return Source_File_Index;
  146.    function Time_Stamp        (S : Source_File_Index) return Time_Stamp_Type;
  147.  
  148.    procedure Set_Keyword_Casing    (S : Source_File_Index; C : Casing_Type);
  149.    procedure Set_Identifier_Casing (S : Source_File_Index; C : Casing_Type);
  150.  
  151.    --  The following two routines may be used only by the processing for
  152.    --  the Source_Reference pragma, and by no other client.
  153.  
  154.    procedure Set_Line_Offset       (S : Source_File_Index; V : Int);
  155.    procedure Set_Reference_Name    (S : Source_File_Index; N : File_Name_Type);
  156.  
  157.    function Last_Source_File return Source_File_Index;
  158.    --  Index of last source file table entry
  159.  
  160.    function Num_Source_Files return Nat;
  161.    --  Number of source file table entries
  162.  
  163.    -----------------
  164.    -- Global Data --
  165.    -----------------
  166.  
  167.    Current_Source_File : Source_File_Index;
  168.    --  Source_File table index of source file currently being scanned
  169.  
  170.    Current_Source_Unit : Unit_Number_Type;
  171.    --  Unit number of source file currently being scanned
  172.  
  173.    Source : Source_Buffer_Ptr;
  174.    --  Current source (copy of Source_File.Table (Current_Source_Unit).Source)
  175.  
  176.    Internal_Source : aliased Source_Buffer (1 .. 81);
  177.    --  This buffer is used internally in the compiler when the lexical analyzer
  178.    --  is used to scan a string from within the compiler. The procedure is to
  179.    --  establish Internal_Source_Ptr as the value of Source, set the string to
  180.    --  be scanned, appropriately terminated, in this buffer, and set Scan_Ptr
  181.    --  to point to the start of the buffer. It is a fatal error if the scanner
  182.    --  signals an error while scanning a token in this internal buffer.
  183.  
  184.    Internal_Source_Ptr : constant Source_Buffer_Ptr := Internal_Source'Access;
  185.    --  Pointer to internal source buffer
  186.  
  187.    -----------------
  188.    -- Subprograms --
  189.    -----------------
  190.  
  191.    procedure Backup_Line (P : in out Source_Ptr);
  192.    --  Back up the argument pointer to the start of the previous line. On
  193.    --  entry, P points to the start of a physical line in the source buffer.
  194.    --  On return, P is updated to point to the start of the previous line.
  195.    --  The caller has checked that a Line_Terminator character precedes P so
  196.    --  that there definitely is a previous line in the source buffer.
  197.  
  198.    function Get_Column_Number (P : Source_Ptr) return Column_Number;
  199.    --  The ones-origin column number of the specified Source_Ptr value is
  200.    --  determined and returned. Tab characters if present are assumed to
  201.    --  represent the standard 1,9,17.. spacing pattern.
  202.  
  203.    function Get_Line_Number (P : Source_Ptr) return Logical_Line_Number;
  204.    --  The line number of the specified source position is obtained by
  205.    --  doing a binary search on the source positions in the lines table
  206.    --  for the unit containing the given source position. The returned
  207.    --  value has already been adjusted by adding the Line_Offset value.
  208.  
  209.    function Get_Source_File_Index (S : Source_Ptr) return Source_File_Index;
  210.    --  Return file table index of file identified by given source pointer
  211.    --  value. This call must always succeed, since any valid source pointer
  212.    --  value belongs to some previously loaded source file.
  213.  
  214.    function Line_Start (P : Source_Ptr) return Source_Ptr;
  215.    --  Finds the source position of the start of the line containing the
  216.    --  given source location.
  217.  
  218.    function Line_Start
  219.      (L    : Logical_Line_Number;
  220.       S    : Source_File_Index)
  221.       return Source_Ptr;
  222.    --  Finds the source position of the start of the given line in
  223.    --  the given source file.
  224.  
  225.    function Logical_To_Physical
  226.      (Line : Logical_Line_Number;
  227.       S    : Source_File_Index)
  228.       return Nat;
  229.    --  Given a logical line number in source file whose source index is S,
  230.    --  return the corresponding physical line number.
  231.  
  232.    function Physical_To_Logical
  233.      (Line : Nat;
  234.       S    : Source_File_Index)
  235.       return Logical_Line_Number;
  236.    --  Given a physical line number in source file whose source index is S,
  237.    --  return the corresponding logical line number.
  238.  
  239.    procedure Skip_Line_Terminators
  240.      (P        : in out Source_Ptr;
  241.       Physical : out Boolean);
  242.    --  On entry, Source (P) points to the line terminator character that
  243.    --  terminates a line. The result set in P is the location of the first
  244.    --  character of the following line (after skipping the sequence of line
  245.    --  terminator characters terminating the current line). In addition, if
  246.    --  the terminator sequence ends a physical line (the definition of what
  247.    --  constitutes a physical line is embodied in the implementation of this
  248.    --  function), and it is the first time this sequence is encountered, then
  249.    --  an entry is made in the lines table to record the location for further
  250.    --  use by functions such as Get_Line_Number. Physical is set to True if
  251.    --  the line terminator was the end of a physical line.
  252.  
  253.    procedure Write_Location (P : Source_Ptr);
  254.    --  Writes out a string of the form fff:nn:cc, where fff, nn, cc are the
  255.    --  file name, line number and column corresponding to the given source
  256.    --  location. No_Location and Standard_Location appear as the strings
  257.    --  <no location> and <standard location>.
  258.  
  259.    procedure Write_Time_Stamp (S : Source_File_Index);
  260.    --  Writes time stamp of specified file in YY-MM-DD HH:MM.SS format
  261.  
  262.    procedure Tree_Write;
  263.    --  Writes out internal tables to current tree file using Tree_Write
  264.  
  265.    procedure Tree_Read;
  266.    --  Initializes internal tables from current tree file using Tree_Read
  267.  
  268. private
  269.    pragma Inline (File_Name);
  270.    pragma Inline (Full_File_Name);
  271.    pragma Inline (Identifier_Casing);
  272.    pragma Inline (Instantiation);
  273.    pragma Inline (Keyword_Casing);
  274.    pragma Inline (Last_Source_File);
  275.    pragma Inline (Num_Source_Files);
  276.    pragma Inline (Num_Source_Lines);
  277.    pragma Inline (Reference_Name);
  278.    pragma Inline (Set_Keyword_Casing);
  279.    pragma Inline (Set_Identifier_Casing);
  280.    pragma Inline (Set_Line_Offset);
  281.    pragma Inline (Set_Reference_Name);
  282.    pragma Inline (Source_First);
  283.    pragma Inline (Source_Last);
  284.    pragma Inline (Source_Text);
  285.    pragma Inline (Template);
  286.    pragma Inline (Time_Stamp);
  287.  
  288.    type Source_File_Record is record
  289.  
  290.       File_Name : File_Name_Type;
  291.       --  Source file name (simple name with no directory info)
  292.  
  293.       Full_File_Name : File_Name_Type;
  294.       --  Full file name (full name with directory info)
  295.  
  296.       Reference_Name : File_Name_Type;
  297.       --  File name used for error messages (same as Full_File_Name unless
  298.       --  reset by use of pragma Source_Reference).
  299.  
  300.       Line_Offset : Int;
  301.       --  Offset value for line number references, to be added to physical
  302.       --  line numbers to obtain logical line numbers. Normally set to zero
  303.       --  but can be reset by use of pragma Source_Reference.
  304.  
  305.       Source_Text : Source_Buffer_Ptr;
  306.       --  Text of source file. Note that every source file has a distinct set
  307.       --  of non-overlapping bounds, so it is possible to determine which file
  308.       --  is referenced from a given subscript (Source_Ptr) value.
  309.  
  310.       Source_First : Source_Ptr;
  311.       --  Subscript of first character in Source_Text. Note that this cannot
  312.       --  be obtained as Source_Text'First, because we use virtual origin
  313.       --  addressing, so this value is always zero.
  314.  
  315.       Source_Last : Source_Ptr;
  316.       --  Subscript of last character in Source_Text. Note that this cannot
  317.       --  be obtained as Source_Text'Last, because we use virtual origin
  318.       --  addressing, so this value is always Source_Ptr'Last.
  319.  
  320.       Time_Stamp : Time_Stamp_Type;
  321.       --  Time stamp of the source file
  322.  
  323.       Num_Source_Lines : Nat;
  324.       --  Number of entries in Lines_Table, i.e. the subscript of the last
  325.       --  entry stored in this table. On completion of compilation of a unit
  326.       --  (status = loaded), this is the number of source lines in the file.
  327.  
  328.       Keyword_Casing : Casing_Type;
  329.       --  Casing style used in file for keyword casing. Initialized to
  330.       --  Unknown, and then set from the first occurrence of a keyword.
  331.       --  This value is used only for formatting of error messages.
  332.  
  333.       Identifier_Casing : Casing_Type;
  334.       --  Casing style used in file for identifier casing. Initialized to
  335.       --  Unknown, and then set from an identifier in the program as soon as
  336.       --  one is found whose casing is sufficiently clear to make a decision.
  337.       --  This value is used for formatting of error messages, and also is
  338.       --  used in the detection of keywords misused as identifiers.
  339.  
  340.       Instantiation : Source_Ptr;
  341.       --  Source file locatoin of the instantiation if this source file entry
  342.       --  represents a generic instantiation. Set to No_Location for the case
  343.       --  of a normal non-instantiation entry. See Sinput_L for details.
  344.  
  345.       Template : Source_File_Index;
  346.       --  Source file index of the source file containing the template if
  347.       --  this is a generic instantiation. Set to No_Source_File for the
  348.       --  normal case of a non-instantiation entry. See Sinput_L for details.
  349.  
  350.       --  The following fields are for internal use only
  351.  
  352.       Sloc_Adjust : Source_Ptr;
  353.       --  A value to be added to Sloc values for this file to reference the
  354.       --  corresponding lines table. This is zero for the non-instantiation
  355.       --  case, and set so that the adition references the ultimate template
  356.       --  for the instantiation case. See Sinput_L for further details.
  357.  
  358.       Lines_Table : Lines_Table_Ptr;
  359.       --  Pointer to lines table for this source. Updated as additional
  360.       --  lines are accessed using the Skip_Line_Terminators procedure.
  361.       --  Note: the lines table for an instantiation entry refers to the
  362.       --  original line numbers of the template see Sinput_L for details.
  363.  
  364.    end record;
  365.  
  366.    package Source_File is new Table (
  367.      Table_Component_Type => Source_File_Record,
  368.      Table_Index_Type     => Source_File_Index,
  369.      Table_Low_Bound      => 1,
  370.      Table_Initial        => 50,
  371.      Table_Increment      => 100,
  372.      Table_Name           => "Source_File");
  373.  
  374. end Sinput;
  375.