File : sinput-p.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                             S I N P U T . P                              --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2012, 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.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 with Ada.Unchecked_Conversion;
  27 with Ada.Unchecked_Deallocation;
  28 
  29 with Prj.Err;
  30 with Sinput.C;
  31 
  32 with System;
  33 
  34 package body Sinput.P is
  35 
  36    First : Boolean := True;
  37    --  Flag used when Load_Project_File is called the first time,
  38    --  to set Main_Source_File.
  39    --  The flag is reset to False at the first call to Load_Project_File.
  40    --  Calling Reset_First sets it back to True.
  41 
  42    procedure Free is new Ada.Unchecked_Deallocation
  43      (Lines_Table_Type, Lines_Table_Ptr);
  44 
  45    procedure Free is new Ada.Unchecked_Deallocation
  46      (Logical_Lines_Table_Type, Logical_Lines_Table_Ptr);
  47 
  48    -----------------------------
  49    -- Clear_Source_File_Table --
  50    -----------------------------
  51 
  52    procedure Clear_Source_File_Table is
  53       use System;
  54 
  55    begin
  56       for X in 1 .. Source_File.Last loop
  57          declare
  58             S  : Source_File_Record renames Source_File.Table (X);
  59             Lo : constant Source_Ptr := S.Source_First;
  60             Hi : constant Source_Ptr := S.Source_Last;
  61             subtype Actual_Source_Buffer is Source_Buffer (Lo .. Hi);
  62             --  Physical buffer allocated
  63 
  64             type Actual_Source_Ptr is access Actual_Source_Buffer;
  65             --  This is the pointer type for the physical buffer allocated
  66 
  67             procedure Free is new Ada.Unchecked_Deallocation
  68               (Actual_Source_Buffer, Actual_Source_Ptr);
  69 
  70             pragma Suppress (All_Checks);
  71 
  72             pragma Warnings (Off);
  73             --  The following unchecked conversion is aliased safe, since it
  74             --  is not used to create improperly aliased pointer values.
  75 
  76             function To_Actual_Source_Ptr is new
  77               Ada.Unchecked_Conversion (Address, Actual_Source_Ptr);
  78 
  79             pragma Warnings (On);
  80 
  81             Actual_Ptr : Actual_Source_Ptr :=
  82                            To_Actual_Source_Ptr (S.Source_Text (Lo)'Address);
  83 
  84          begin
  85             Free (Actual_Ptr);
  86             Free (S.Lines_Table);
  87             Free (S.Logical_Lines_Table);
  88          end;
  89       end loop;
  90 
  91       Source_File.Free;
  92       Sinput.Initialize;
  93    end Clear_Source_File_Table;
  94 
  95    -----------------------
  96    -- Load_Project_File --
  97    -----------------------
  98 
  99    function Load_Project_File (Path : String) return Source_File_Index is
 100       X : Source_File_Index;
 101 
 102    begin
 103       X := Sinput.C.Load_File (Path);
 104 
 105       if First then
 106          Main_Source_File := X;
 107          First := False;
 108       end if;
 109 
 110       return X;
 111    end Load_Project_File;
 112 
 113    -----------------
 114    -- Reset_First --
 115    -----------------
 116 
 117    procedure Reset_First is
 118    begin
 119       First := True;
 120    end Reset_First;
 121 
 122    --------------------------------
 123    -- Restore_Project_Scan_State --
 124    --------------------------------
 125 
 126    procedure Restore_Project_Scan_State
 127      (Saved_State : Saved_Project_Scan_State)
 128    is
 129    begin
 130       Restore_Scan_State (Saved_State.Scan_State);
 131       Source              := Saved_State.Source;
 132       Current_Source_File := Saved_State.Current_Source_File;
 133    end Restore_Project_Scan_State;
 134 
 135    -----------------------------
 136    -- Save_Project_Scan_State --
 137    -----------------------------
 138 
 139    procedure Save_Project_Scan_State
 140      (Saved_State : out Saved_Project_Scan_State)
 141    is
 142    begin
 143       Save_Scan_State (Saved_State.Scan_State);
 144       Saved_State.Source              := Source;
 145       Saved_State.Current_Source_File := Current_Source_File;
 146    end Save_Project_Scan_State;
 147 
 148    ----------------------------
 149    -- Source_File_Is_Subunit --
 150    ----------------------------
 151 
 152    function Source_File_Is_Subunit (X : Source_File_Index) return Boolean is
 153    begin
 154       --  Nothing to do if X is no source file, so simply return False
 155 
 156       if X = No_Source_File then
 157          return False;
 158       end if;
 159 
 160       Prj.Err.Scanner.Initialize_Scanner (X);
 161 
 162       --  No error for special characters that are used for preprocessing
 163 
 164       Prj.Err.Scanner.Set_Special_Character ('#');
 165       Prj.Err.Scanner.Set_Special_Character ('$');
 166 
 167       Check_For_BOM;
 168 
 169       --  We scan past junk to the first interesting compilation unit token, to
 170       --  see if it is SEPARATE. We ignore WITH keywords during this and also
 171       --  PRIVATE. The reason for ignoring PRIVATE is that it handles some
 172       --  error situations, and also to handle PRIVATE WITH in Ada 2005 mode.
 173 
 174       while Token = Tok_With
 175         or else Token = Tok_Private
 176         or else (Token not in Token_Class_Cunit and then Token /= Tok_EOF)
 177       loop
 178          Prj.Err.Scanner.Scan;
 179       end loop;
 180 
 181       Prj.Err.Scanner.Reset_Special_Characters;
 182 
 183       return Token = Tok_Separate;
 184    end Source_File_Is_Subunit;
 185 
 186 end Sinput.P;