-- Loading of source files. -- Copyright (C) 2002, 2003, 2004, 2005 Tristan Gingold -- -- GHDL is free software; you can redistribute it and/or modify it under -- the terms of the GNU General Public License as published by the Free -- Software Foundation; either version 2, or (at your option) any later -- version. -- -- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or -- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- for more details. -- -- You should have received a copy of the GNU General Public License -- along with GHDL; see the file COPYING. If not, write to the Free -- Software Foundation, 59 Temple Place - Suite 330, Boston, MA -- 02111-1307, USA. with Types; use Types; with Nodes; -- Source file handling package Files_Map is -- Range for Tab_Stop. subtype Tab_Stop_Range is Natural range 1 .. 120; -- Tab width: a tab character jumps to the next column that is one plus a -- multiple of this witdh (if columns are numbered from 1). Tab_Stop : Tab_Stop_Range := 8; -- Create the path from DIRECTORY and NAME: -- If NAME is an absolute pathname, then return NAME. -- Otherwise, return the concatenation of DIRECTORY and NAME. -- If ADD_NUL is TRUE, then a trailing '\0' is appended. function Get_Pathname (Directory : Name_Id; Name : Name_Id; Add_Nul : Boolean) return String; -- If NAME contains a directory separator, move it to the DIRECTORY name. -- At the return point, NAME has no directory components. procedure Normalize_Pathname (Directory : in out Name_Id; Name : in out Name_Id); -- Return an entry for a filename. Null_Identifier for DIRECTORY means -- current directory. -- Load the filename if necessary. -- Return No_Source_File_Entry if the file does not exist. function Read_Source_File (Directory : Name_Id; Name : Name_Id) return Source_File_Entry; -- Each file in memory has two terminal EOT. EOT : constant Character := Character'Val (4); -- Create an empty Source_File for a virtual file name. Used for implicit, -- command-line and std.standard library. function Create_Virtual_Source_File (Name : Name_Id) return Source_File_Entry; -- Create a Source_File for a possible virtual file NAME using CONTENT -- as content of the file. The file must not already exist. function Create_Source_File_From_String (Name : Name_Id; Content : String) return Source_File_Entry; -- Create a pseudo source file from REF for instance INST (created at -- location LOC). The content of this file is the same as REF, but with -- new locations so that it is possible to retrieve the instance from -- the new locations. function Create_Instance_Source_File (Ref : Source_File_Entry; Loc : Location_Type; Inst : Nodes.Node_Type) return Source_File_Entry; -- Unload last source file. Works only with the last one. Must be -- carefully used as the corresponding locations will be reused. procedure Unload_Last_Source_File (File : Source_File_Entry); -- Relocate location LOC (which must be in the reference of INST_FILE) -- for instrnace INST_FILE. function Instance_Relocate (Inst_File : Source_File_Entry; Loc : Location_Type) return Location_Type; -- If LOC is a location of an instance (in a file created by -- create_instance_source_file), return the location where the instance -- has been created. Otherwise, return No_Location. function Location_Instance_To_Location (Loc : Location_Type) return Location_Type; -- Return a buffer (access to the contents of the file) for a file entry. function Get_File_Source (File : Source_File_Entry) return File_Buffer_Acc; -- Likewise but return a pointer. To be used only from non-Ada code. function Get_File_Buffer (File : Source_File_Entry) return File_Buffer_Ptr; -- Return the length of the file (which is the size of the file buffer). function Get_File_Length (File : Source_File_Entry) return Source_Ptr; -- Return the name of the file. function Get_File_Name (File : Source_File_Entry) return Name_Id; -- Return the directory of the file. function Get_Source_File_Directory (File : Source_File_Entry) return Name_Id; -- Return the entry of the last known file. -- This allow the user to create a table of Source_File_Entry. function Get_Last_Source_File_Entry return Source_File_Entry; -- Time stamp handling. function Is_Eq (L : Time_Stamp_Id; R : Time_Stamp_Id) return Boolean; function Is_Gt (L : Time_Stamp_Id; R : Time_Stamp_Id) return Boolean; function Get_Time_Stamp_String (Ts : Time_Stamp_Id) return String; -- Return the checksum of the content of FILE. function Get_File_Checksum (File : Source_File_Entry) return File_Checksum_Id; -- True if two file checksums are identical. function Is_Eq (L, R : File_Checksum_Id) return Boolean; -- String image of CHECKSUM. function Get_File_Checksum_String (Checksum : File_Checksum_Id) return String; -- Return the current date of the system. function Get_Os_Time_Stamp return Time_Stamp_Id; -- Return the home directory (current directory). function Get_Home_Directory return Name_Id; -- Add a new entry in the lines_table. -- The new entry must be the next one after the last entry. procedure File_Add_Line_Number (File : Source_File_Entry; Line : Natural; Pos : Source_Ptr); -- Convert LOCATION to a source file. Return No_Source_File_Entry if -- LOCATION is incorrect. function Location_To_File (Location : Location_Type) return Source_File_Entry; -- Convert LOCATION and FILE to a position (offset) into the source file. function Location_File_To_Pos (Location : Location_Type; File : Source_File_Entry) return Source_Ptr; -- Convert LOCATION and FILE to a line number. function Location_File_To_Line (Location : Location_Type; File : Source_File_Entry) return Natural; -- Get logical column (with HT expanded) from LOC, FILE and LINE. function Location_File_Line_To_Col (Loc : Location_Type; File : Source_File_Entry; Line : Natural) return Natural; -- Convert LOCATION into a source file FILE and an offset POS in the -- file. procedure Location_To_File_Pos (Location : Location_Type; File : out Source_File_Entry; Pos : out Source_Ptr); -- Convert a FILE and an offset POS in the file into a location. function File_Pos_To_Location (File : Source_File_Entry; Pos : Source_Ptr) return Location_Type; -- Convert a FILE into a location. function Source_File_To_Location (File : Source_File_Entry) return Location_Type; -- Convert a FILE+LINE into a position. -- Return Source_Ptr_Bad in case of error (LINE out of bounds). function Line_To_Position (File : Source_File_Entry; Line : Natural) return Source_Ptr; -- Translate LOCATION into coordinate (physical position). -- FILE identifies the filename. -- LINE_POS is the offset in the file of the first character of the line, -- LINE is the line number (first line is 1), -- OFFSET is the offset of the location in the line (first character is 0, -- a tabulation is one character), procedure Location_To_Coord (Location : Location_Type; File : out Source_File_Entry; Line_Pos : out Source_Ptr; Line : out Natural; Offset : out Natural); -- Translate coordinate into logical position. -- NAME is the name of the file, -- COL is the column (first character is 1, tabulation are at every 8 -- positions). procedure Coord_To_Position (File : Source_File_Entry; Line_Pos : Source_Ptr; Offset : Natural; Name : out Name_Id; Col : out Natural); -- Translate LOCATION to NAME, LINE and COL. -- It is like to two procedures above. procedure Location_To_Position (Location : Location_Type; Name : out Name_Id; Line : out Natural; Col : out Natural); -- Return the line LINE from FILE (without end of line). The line is -- expanded: tabs are replaced by spaces according to Tab_Stop. This -- function is slow. function Extract_Expanded_Line (File : Source_File_Entry; Line : Natural) return String; -- Return the image of LOC using the "FILENAME:LINE:COL" format or -- "LINE:COL" format if FILENAME is false; function Image (Loc : Location_Type; Filename : Boolean := True) return String; -- Free all memory and reinitialize. procedure Initialize; private -- Debug procedures. -- Disp info about all source files procedure Debug_Source_Files; end Files_Map;