blob: 0bea5a0ba1817fdc6ae027863685d832235aaced [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- F N A M E --
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2014, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
with Alloc;
with Table;
with Types; use Types;
package body Fname is
-----------------------------
-- Dummy Table Definitions --
-----------------------------
-- The following table was used in old versions of the compiler. We retain
-- the declarations here for compatibility with old tree files. The new
-- version of the compiler does not use this table, and will write out a
-- dummy empty table for Tree_Write.
type SFN_Entry is record
U : Unit_Name_Type;
F : File_Name_Type;
end record;
package SFN_Table is new Table.Table (
Table_Component_Type => SFN_Entry,
Table_Index_Type => Int,
Table_Low_Bound => 0,
Table_Initial => Alloc.SFN_Table_Initial,
Table_Increment => Alloc.SFN_Table_Increment,
Table_Name => "Fname_Dummy_Table");
---------------------------
-- Is_Internal_File_Name --
---------------------------
function Is_Internal_File_Name
(Fname : File_Name_Type;
Renamings_Included : Boolean := True) return Boolean
is
begin
if Is_Predefined_File_Name (Fname, Renamings_Included) then
return True;
-- Once Is_Predefined_File_Name has been called and returns False,
-- Name_Buffer contains Fname and Name_Len is set to 8.
elsif Name_Buffer (1 .. 2) = "g-"
or else Name_Buffer (1 .. 8) = "gnat "
then
return True;
else
return False;
end if;
end Is_Internal_File_Name;
-----------------------------
-- Is_Predefined_File_Name --
-----------------------------
-- This should really be a test of unit name, given the possibility of
-- pragma Source_File_Name setting arbitrary file names for any files???
-- Once Is_Predefined_File_Name has been called and returns False,
-- Name_Buffer contains Fname and Name_Len is set to 8. This is used
-- only by Is_Internal_File_Name, and is not part of the official
-- external interface of this function.
function Is_Predefined_File_Name
(Fname : File_Name_Type;
Renamings_Included : Boolean := True) return Boolean
is
begin
Get_Name_String (Fname);
return Is_Predefined_File_Name (Renamings_Included);
end Is_Predefined_File_Name;
function Is_Predefined_File_Name
(Renamings_Included : Boolean := True) return Boolean
is
subtype Str8 is String (1 .. 8);
Predef_Names : constant array (1 .. 11) of Str8 :=
("ada ", -- Ada
"interfac", -- Interfaces
"system ", -- System
-- Remaining entries are only considered if Renamings_Included true
"calendar", -- Calendar
"machcode", -- Machine_Code
"unchconv", -- Unchecked_Conversion
"unchdeal", -- Unchecked_Deallocation
"directio", -- Direct_IO
"ioexcept", -- IO_Exceptions
"sequenio", -- Sequential_IO
"text_io "); -- Text_IO
Num_Entries : constant Natural :=
3 + 8 * Boolean'Pos (Renamings_Included);
begin
-- Remove extension (if present)
if Name_Len > 4 and then Name_Buffer (Name_Len - 3) = '.' then
Name_Len := Name_Len - 4;
end if;
-- Definitely false if longer than 12 characters (8.3)
if Name_Len > 8 then
return False;
-- Definitely predefined if prefix is a- i- or s- followed by letter
elsif Name_Len >= 3
and then Name_Buffer (2) = '-'
and then (Name_Buffer (1) = 'a'
or else
Name_Buffer (1) = 'i'
or else
Name_Buffer (1) = 's')
and then (Name_Buffer (3) in 'a' .. 'z'
or else
Name_Buffer (3) in 'A' .. 'Z')
then
return True;
end if;
-- Otherwise check against special list, first padding to 8 characters
while Name_Len < 8 loop
Name_Len := Name_Len + 1;
Name_Buffer (Name_Len) := ' ';
end loop;
for J in 1 .. Num_Entries loop
if Name_Buffer (1 .. 8) = Predef_Names (J) then
return True;
end if;
end loop;
-- Note: when we return False here, the Name_Buffer contains the
-- padded file name. This is not defined for clients of the package,
-- but is used by Is_Internal_File_Name.
return False;
end Is_Predefined_File_Name;
---------------
-- Tree_Read --
---------------
procedure Tree_Read is
begin
SFN_Table.Tree_Read;
end Tree_Read;
----------------
-- Tree_Write --
----------------
procedure Tree_Write is
begin
SFN_Table.Tree_Write;
end Tree_Write;
end Fname;