annotate gcc/ada/fname.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- F N A M E --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1992-2017, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Alloc;
kono
parents:
diff changeset
33 with Table;
kono
parents:
diff changeset
34 with Types; use Types;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Fname is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -----------------------------
kono
parents:
diff changeset
39 -- Dummy Table Definitions --
kono
parents:
diff changeset
40 -----------------------------
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 -- The following table was used in old versions of the compiler. We retain
kono
parents:
diff changeset
43 -- the declarations here for compatibility with old tree files. The new
kono
parents:
diff changeset
44 -- version of the compiler does not use this table, and will write out a
kono
parents:
diff changeset
45 -- dummy empty table for Tree_Write.
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 type SFN_Entry is record
kono
parents:
diff changeset
48 U : Unit_Name_Type;
kono
parents:
diff changeset
49 F : File_Name_Type;
kono
parents:
diff changeset
50 end record;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 package SFN_Table is new Table.Table (
kono
parents:
diff changeset
53 Table_Component_Type => SFN_Entry,
kono
parents:
diff changeset
54 Table_Index_Type => Int,
kono
parents:
diff changeset
55 Table_Low_Bound => 0,
kono
parents:
diff changeset
56 Table_Initial => Alloc.SFN_Table_Initial,
kono
parents:
diff changeset
57 Table_Increment => Alloc.SFN_Table_Increment,
kono
parents:
diff changeset
58 Table_Name => "Fname_Dummy_Table");
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 function Has_Internal_Extension (Fname : String) return Boolean;
kono
parents:
diff changeset
61 pragma Inline (Has_Internal_Extension);
kono
parents:
diff changeset
62 -- True if the extension is appropriate for an internal/predefined unit.
kono
parents:
diff changeset
63 -- That means ".ads" or ".adb" for source files, and ".ali" for ALI files.
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 function Has_Prefix (X, Prefix : String) return Boolean;
kono
parents:
diff changeset
66 pragma Inline (Has_Prefix);
kono
parents:
diff changeset
67 -- True if Prefix is at the beginning of X. For example,
kono
parents:
diff changeset
68 -- Has_Prefix ("a-filename.ads", Prefix => "a-") is True.
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 ----------------------------
kono
parents:
diff changeset
71 -- Has_Internal_Extension --
kono
parents:
diff changeset
72 ----------------------------
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 function Has_Internal_Extension (Fname : String) return Boolean is
kono
parents:
diff changeset
75 begin
kono
parents:
diff changeset
76 if Fname'Length >= 4 then
kono
parents:
diff changeset
77 declare
kono
parents:
diff changeset
78 S : String renames Fname (Fname'Last - 3 .. Fname'Last);
kono
parents:
diff changeset
79 begin
kono
parents:
diff changeset
80 return S = ".ads" or else S = ".adb" or else S = ".ali";
kono
parents:
diff changeset
81 end;
kono
parents:
diff changeset
82 end if;
kono
parents:
diff changeset
83 return False;
kono
parents:
diff changeset
84 end Has_Internal_Extension;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 ----------------
kono
parents:
diff changeset
87 -- Has_Prefix --
kono
parents:
diff changeset
88 ----------------
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 function Has_Prefix (X, Prefix : String) return Boolean is
kono
parents:
diff changeset
91 begin
kono
parents:
diff changeset
92 if X'Length >= Prefix'Length then
kono
parents:
diff changeset
93 declare
kono
parents:
diff changeset
94 S : String renames X (X'First .. X'First + Prefix'Length - 1);
kono
parents:
diff changeset
95 begin
kono
parents:
diff changeset
96 return S = Prefix;
kono
parents:
diff changeset
97 end;
kono
parents:
diff changeset
98 end if;
kono
parents:
diff changeset
99 return False;
kono
parents:
diff changeset
100 end Has_Prefix;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 -----------------------
kono
parents:
diff changeset
103 -- Is_GNAT_File_Name --
kono
parents:
diff changeset
104 -----------------------
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 function Is_GNAT_File_Name (Fname : String) return Boolean is
kono
parents:
diff changeset
107 begin
kono
parents:
diff changeset
108 -- Check for internal extensions before checking prefixes, so we don't
kono
parents:
diff changeset
109 -- think (e.g.) "gnat.adc" is internal.
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 if not Has_Internal_Extension (Fname) then
kono
parents:
diff changeset
112 return False;
kono
parents:
diff changeset
113 end if;
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 -- Definitely internal if prefix is g-
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 if Has_Prefix (Fname, "g-") then
kono
parents:
diff changeset
118 return True;
kono
parents:
diff changeset
119 end if;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 -- See the note in Is_Predefined_File_Name for the rationale
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 return Fname'Length = 8 and then Has_Prefix (Fname, "gnat");
kono
parents:
diff changeset
124 end Is_GNAT_File_Name;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 function Is_GNAT_File_Name (Fname : File_Name_Type) return Boolean is
kono
parents:
diff changeset
127 Result : constant Boolean :=
kono
parents:
diff changeset
128 Is_GNAT_File_Name (Get_Name_String (Fname));
kono
parents:
diff changeset
129 begin
kono
parents:
diff changeset
130 return Result;
kono
parents:
diff changeset
131 end Is_GNAT_File_Name;
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 ---------------------------
kono
parents:
diff changeset
134 -- Is_Internal_File_Name --
kono
parents:
diff changeset
135 ---------------------------
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 function Is_Internal_File_Name
kono
parents:
diff changeset
138 (Fname : String;
kono
parents:
diff changeset
139 Renamings_Included : Boolean := True) return Boolean
kono
parents:
diff changeset
140 is
kono
parents:
diff changeset
141 begin
kono
parents:
diff changeset
142 if Is_Predefined_File_Name (Fname, Renamings_Included) then
kono
parents:
diff changeset
143 return True;
kono
parents:
diff changeset
144 end if;
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 return Is_GNAT_File_Name (Fname);
kono
parents:
diff changeset
147 end Is_Internal_File_Name;
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 function Is_Internal_File_Name
kono
parents:
diff changeset
150 (Fname : File_Name_Type;
kono
parents:
diff changeset
151 Renamings_Included : Boolean := True) return Boolean
kono
parents:
diff changeset
152 is
kono
parents:
diff changeset
153 Result : constant Boolean :=
kono
parents:
diff changeset
154 Is_Internal_File_Name
kono
parents:
diff changeset
155 (Get_Name_String (Fname), Renamings_Included);
kono
parents:
diff changeset
156 begin
kono
parents:
diff changeset
157 return Result;
kono
parents:
diff changeset
158 end Is_Internal_File_Name;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 -----------------------------
kono
parents:
diff changeset
161 -- Is_Predefined_File_Name --
kono
parents:
diff changeset
162 -----------------------------
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 function Is_Predefined_File_Name
kono
parents:
diff changeset
165 (Fname : String;
kono
parents:
diff changeset
166 Renamings_Included : Boolean := True) return Boolean
kono
parents:
diff changeset
167 is
kono
parents:
diff changeset
168 begin
kono
parents:
diff changeset
169 -- Definitely false if longer than 12 characters (8.3)
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 if Fname'Length > 12 then
kono
parents:
diff changeset
172 return False;
kono
parents:
diff changeset
173 end if;
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 if not Has_Internal_Extension (Fname) then
kono
parents:
diff changeset
176 return False;
kono
parents:
diff changeset
177 end if;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 -- Definitely predefined if prefix is a- i- or s-
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 if Fname'Length >= 2 then
kono
parents:
diff changeset
182 declare
kono
parents:
diff changeset
183 S : String renames Fname (Fname'First .. Fname'First + 1);
kono
parents:
diff changeset
184 begin
kono
parents:
diff changeset
185 if S = "a-" or else S = "i-" or else S = "s-" then
kono
parents:
diff changeset
186 return True;
kono
parents:
diff changeset
187 end if;
kono
parents:
diff changeset
188 end;
kono
parents:
diff changeset
189 end if;
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 -- We include the "." in the prefixes below, so we don't match (e.g.)
kono
parents:
diff changeset
192 -- adamant.ads. So the first line matches "ada.ads", "ada.adb", and
kono
parents:
diff changeset
193 -- "ada.ali". But that's not necessary if they have 8 characters.
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 if Has_Prefix (Fname, "ada.") -- Ada
kono
parents:
diff changeset
196 or else Has_Prefix (Fname, "interfac") -- Interfaces
kono
parents:
diff changeset
197 or else Has_Prefix (Fname, "system.a") -- System
kono
parents:
diff changeset
198 then
kono
parents:
diff changeset
199 return True;
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 -- If instructed and the name has 8+ characters, check for renamings
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 if Renamings_Included
kono
parents:
diff changeset
205 and then Is_Predefined_Renaming_File_Name (Fname)
kono
parents:
diff changeset
206 then
kono
parents:
diff changeset
207 return True;
kono
parents:
diff changeset
208 end if;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 return False;
kono
parents:
diff changeset
211 end Is_Predefined_File_Name;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 function Is_Predefined_File_Name
kono
parents:
diff changeset
214 (Fname : File_Name_Type;
kono
parents:
diff changeset
215 Renamings_Included : Boolean := True) return Boolean
kono
parents:
diff changeset
216 is
kono
parents:
diff changeset
217 Result : constant Boolean :=
kono
parents:
diff changeset
218 Is_Predefined_File_Name
kono
parents:
diff changeset
219 (Get_Name_String (Fname), Renamings_Included);
kono
parents:
diff changeset
220 begin
kono
parents:
diff changeset
221 return Result;
kono
parents:
diff changeset
222 end Is_Predefined_File_Name;
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 --------------------------------------
kono
parents:
diff changeset
225 -- Is_Predefined_Renaming_File_Name --
kono
parents:
diff changeset
226 --------------------------------------
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 function Is_Predefined_Renaming_File_Name
kono
parents:
diff changeset
229 (Fname : String) return Boolean
kono
parents:
diff changeset
230 is
kono
parents:
diff changeset
231 subtype Str8 is String (1 .. 8);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 Renaming_Names : constant array (1 .. 8) of Str8 :=
kono
parents:
diff changeset
234 ("calendar", -- Calendar
kono
parents:
diff changeset
235 "machcode", -- Machine_Code
kono
parents:
diff changeset
236 "unchconv", -- Unchecked_Conversion
kono
parents:
diff changeset
237 "unchdeal", -- Unchecked_Deallocation
kono
parents:
diff changeset
238 "directio", -- Direct_IO
kono
parents:
diff changeset
239 "ioexcept", -- IO_Exceptions
kono
parents:
diff changeset
240 "sequenio", -- Sequential_IO
kono
parents:
diff changeset
241 "text_io."); -- Text_IO
kono
parents:
diff changeset
242 begin
kono
parents:
diff changeset
243 -- Definitely false if longer than 12 characters (8.3)
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 if Fname'Length in 8 .. 12 then
kono
parents:
diff changeset
246 declare
kono
parents:
diff changeset
247 S : String renames Fname (Fname'First .. Fname'First + 7);
kono
parents:
diff changeset
248 begin
kono
parents:
diff changeset
249 for J in Renaming_Names'Range loop
kono
parents:
diff changeset
250 if S = Renaming_Names (J) then
kono
parents:
diff changeset
251 return True;
kono
parents:
diff changeset
252 end if;
kono
parents:
diff changeset
253 end loop;
kono
parents:
diff changeset
254 end;
kono
parents:
diff changeset
255 end if;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 return False;
kono
parents:
diff changeset
258 end Is_Predefined_Renaming_File_Name;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 function Is_Predefined_Renaming_File_Name
kono
parents:
diff changeset
261 (Fname : File_Name_Type) return Boolean is
kono
parents:
diff changeset
262 Result : constant Boolean :=
kono
parents:
diff changeset
263 Is_Predefined_Renaming_File_Name (Get_Name_String (Fname));
kono
parents:
diff changeset
264 begin
kono
parents:
diff changeset
265 return Result;
kono
parents:
diff changeset
266 end Is_Predefined_Renaming_File_Name;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 ---------------
kono
parents:
diff changeset
269 -- Tree_Read --
kono
parents:
diff changeset
270 ---------------
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 procedure Tree_Read is
kono
parents:
diff changeset
273 begin
kono
parents:
diff changeset
274 SFN_Table.Tree_Read;
kono
parents:
diff changeset
275 end Tree_Read;
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 ----------------
kono
parents:
diff changeset
278 -- Tree_Write --
kono
parents:
diff changeset
279 ----------------
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 procedure Tree_Write is
kono
parents:
diff changeset
282 begin
kono
parents:
diff changeset
283 SFN_Table.Tree_Write;
kono
parents:
diff changeset
284 end Tree_Write;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 end Fname;