PR target/60039
[official-gcc.git] / gcc / ada / sinput-p.adb
blobcb5650c80fcd4c7966f9ad56dc86c19560767266
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 ------------------------------------------------------------------------------
26 with Ada.Unchecked_Conversion;
27 with Ada.Unchecked_Deallocation;
29 with Prj.Err;
30 with Sinput.C;
32 with System;
34 package body Sinput.P is
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.
42 procedure Free is new Ada.Unchecked_Deallocation
43 (Lines_Table_Type, Lines_Table_Ptr);
45 procedure Free is new Ada.Unchecked_Deallocation
46 (Logical_Lines_Table_Type, Logical_Lines_Table_Ptr);
48 -----------------------------
49 -- Clear_Source_File_Table --
50 -----------------------------
52 procedure Clear_Source_File_Table is
53 use System;
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
64 type Actual_Source_Ptr is access Actual_Source_Buffer;
65 -- This is the pointer type for the physical buffer allocated
67 procedure Free is new Ada.Unchecked_Deallocation
68 (Actual_Source_Buffer, Actual_Source_Ptr);
70 pragma Suppress (All_Checks);
72 pragma Warnings (Off);
73 -- The following unchecked conversion is aliased safe, since it
74 -- is not used to create improperly aliased pointer values.
76 function To_Actual_Source_Ptr is new
77 Ada.Unchecked_Conversion (Address, Actual_Source_Ptr);
79 pragma Warnings (On);
81 Actual_Ptr : Actual_Source_Ptr :=
82 To_Actual_Source_Ptr (S.Source_Text (Lo)'Address);
84 begin
85 Free (Actual_Ptr);
86 Free (S.Lines_Table);
87 Free (S.Logical_Lines_Table);
88 end;
89 end loop;
91 Source_File.Free;
92 Sinput.Initialize;
93 end Clear_Source_File_Table;
95 -----------------------
96 -- Load_Project_File --
97 -----------------------
99 function Load_Project_File (Path : String) return Source_File_Index is
100 X : Source_File_Index;
102 begin
103 X := Sinput.C.Load_File (Path);
105 if First then
106 Main_Source_File := X;
107 First := False;
108 end if;
110 return X;
111 end Load_Project_File;
113 -----------------
114 -- Reset_First --
115 -----------------
117 procedure Reset_First is
118 begin
119 First := True;
120 end Reset_First;
122 --------------------------------
123 -- Restore_Project_Scan_State --
124 --------------------------------
126 procedure Restore_Project_Scan_State
127 (Saved_State : Saved_Project_Scan_State)
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;
135 -----------------------------
136 -- Save_Project_Scan_State --
137 -----------------------------
139 procedure Save_Project_Scan_State
140 (Saved_State : out Saved_Project_Scan_State)
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;
148 ----------------------------
149 -- Source_File_Is_Subunit --
150 ----------------------------
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
156 if X = No_Source_File then
157 return False;
158 end if;
160 Prj.Err.Scanner.Initialize_Scanner (X);
162 -- No error for special characters that are used for preprocessing
164 Prj.Err.Scanner.Set_Special_Character ('#');
165 Prj.Err.Scanner.Set_Special_Character ('$');
167 Check_For_BOM;
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.
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;
181 Prj.Err.Scanner.Reset_Special_Characters;
183 return Token = Tok_Separate;
184 end Source_File_Is_Subunit;
186 end Sinput.P;