Mercurial > hg > CbC > CbC_gcc
diff gcc/ada/fname.adb @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/ada/fname.adb Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,286 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- F N A M E -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 1992-2017, 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"); + + function Has_Internal_Extension (Fname : String) return Boolean; + pragma Inline (Has_Internal_Extension); + -- True if the extension is appropriate for an internal/predefined unit. + -- That means ".ads" or ".adb" for source files, and ".ali" for ALI files. + + function Has_Prefix (X, Prefix : String) return Boolean; + pragma Inline (Has_Prefix); + -- True if Prefix is at the beginning of X. For example, + -- Has_Prefix ("a-filename.ads", Prefix => "a-") is True. + + ---------------------------- + -- Has_Internal_Extension -- + ---------------------------- + + function Has_Internal_Extension (Fname : String) return Boolean is + begin + if Fname'Length >= 4 then + declare + S : String renames Fname (Fname'Last - 3 .. Fname'Last); + begin + return S = ".ads" or else S = ".adb" or else S = ".ali"; + end; + end if; + return False; + end Has_Internal_Extension; + + ---------------- + -- Has_Prefix -- + ---------------- + + function Has_Prefix (X, Prefix : String) return Boolean is + begin + if X'Length >= Prefix'Length then + declare + S : String renames X (X'First .. X'First + Prefix'Length - 1); + begin + return S = Prefix; + end; + end if; + return False; + end Has_Prefix; + + ----------------------- + -- Is_GNAT_File_Name -- + ----------------------- + + function Is_GNAT_File_Name (Fname : String) return Boolean is + begin + -- Check for internal extensions before checking prefixes, so we don't + -- think (e.g.) "gnat.adc" is internal. + + if not Has_Internal_Extension (Fname) then + return False; + end if; + + -- Definitely internal if prefix is g- + + if Has_Prefix (Fname, "g-") then + return True; + end if; + + -- See the note in Is_Predefined_File_Name for the rationale + + return Fname'Length = 8 and then Has_Prefix (Fname, "gnat"); + end Is_GNAT_File_Name; + + function Is_GNAT_File_Name (Fname : File_Name_Type) return Boolean is + Result : constant Boolean := + Is_GNAT_File_Name (Get_Name_String (Fname)); + begin + return Result; + end Is_GNAT_File_Name; + + --------------------------- + -- Is_Internal_File_Name -- + --------------------------- + + function Is_Internal_File_Name + (Fname : String; + Renamings_Included : Boolean := True) return Boolean + is + begin + if Is_Predefined_File_Name (Fname, Renamings_Included) then + return True; + end if; + + return Is_GNAT_File_Name (Fname); + end Is_Internal_File_Name; + + function Is_Internal_File_Name + (Fname : File_Name_Type; + Renamings_Included : Boolean := True) return Boolean + is + Result : constant Boolean := + Is_Internal_File_Name + (Get_Name_String (Fname), Renamings_Included); + begin + return Result; + end Is_Internal_File_Name; + + ----------------------------- + -- Is_Predefined_File_Name -- + ----------------------------- + + function Is_Predefined_File_Name + (Fname : String; + Renamings_Included : Boolean := True) return Boolean + is + begin + -- Definitely false if longer than 12 characters (8.3) + + if Fname'Length > 12 then + return False; + end if; + + if not Has_Internal_Extension (Fname) then + return False; + end if; + + -- Definitely predefined if prefix is a- i- or s- + + if Fname'Length >= 2 then + declare + S : String renames Fname (Fname'First .. Fname'First + 1); + begin + if S = "a-" or else S = "i-" or else S = "s-" then + return True; + end if; + end; + end if; + + -- We include the "." in the prefixes below, so we don't match (e.g.) + -- adamant.ads. So the first line matches "ada.ads", "ada.adb", and + -- "ada.ali". But that's not necessary if they have 8 characters. + + if Has_Prefix (Fname, "ada.") -- Ada + or else Has_Prefix (Fname, "interfac") -- Interfaces + or else Has_Prefix (Fname, "system.a") -- System + then + return True; + end if; + + -- If instructed and the name has 8+ characters, check for renamings + + if Renamings_Included + and then Is_Predefined_Renaming_File_Name (Fname) + then + return True; + end if; + + return False; + end Is_Predefined_File_Name; + + function Is_Predefined_File_Name + (Fname : File_Name_Type; + Renamings_Included : Boolean := True) return Boolean + is + Result : constant Boolean := + Is_Predefined_File_Name + (Get_Name_String (Fname), Renamings_Included); + begin + return Result; + end Is_Predefined_File_Name; + + -------------------------------------- + -- Is_Predefined_Renaming_File_Name -- + -------------------------------------- + + function Is_Predefined_Renaming_File_Name + (Fname : String) return Boolean + is + subtype Str8 is String (1 .. 8); + + Renaming_Names : constant array (1 .. 8) of Str8 := + ("calendar", -- Calendar + "machcode", -- Machine_Code + "unchconv", -- Unchecked_Conversion + "unchdeal", -- Unchecked_Deallocation + "directio", -- Direct_IO + "ioexcept", -- IO_Exceptions + "sequenio", -- Sequential_IO + "text_io."); -- Text_IO + begin + -- Definitely false if longer than 12 characters (8.3) + + if Fname'Length in 8 .. 12 then + declare + S : String renames Fname (Fname'First .. Fname'First + 7); + begin + for J in Renaming_Names'Range loop + if S = Renaming_Names (J) then + return True; + end if; + end loop; + end; + end if; + + return False; + end Is_Predefined_Renaming_File_Name; + + function Is_Predefined_Renaming_File_Name + (Fname : File_Name_Type) return Boolean is + Result : constant Boolean := + Is_Predefined_Renaming_File_Name (Get_Name_String (Fname)); + begin + return Result; + end Is_Predefined_Renaming_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;