312 lines
11 KiB
Ada
312 lines
11 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT COMPILER COMPONENTS --
|
|
-- --
|
|
-- V M S _ C O N V --
|
|
-- --
|
|
-- S p e c --
|
|
-- --
|
|
-- Copyright (C) 2003-2005, 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 2, 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. See the GNU General Public License --
|
|
-- for more details. You should have received a copy of the GNU General --
|
|
-- Public License distributed with GNAT; see file COPYING. If not, write --
|
|
-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
|
|
-- Boston, MA 02110-1301, USA. --
|
|
-- --
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- This package is part of the GNAT driver. It contains the procedure
|
|
-- VMS_Conversion to convert a VMS command line to the equivalent command
|
|
-- line with switches for the GNAT tools that the GNAT driver will invoke.
|
|
-- The qualifier declarations are contained in package VMS_Data.
|
|
|
|
with Table;
|
|
with VMS_Data; use VMS_Data;
|
|
|
|
with GNAT.OS_Lib; use GNAT.OS_Lib;
|
|
|
|
package VMS_Conv is
|
|
|
|
-- A table to keep the switches on the command line
|
|
|
|
package Last_Switches is new Table.Table
|
|
(Table_Component_Type => String_Access,
|
|
Table_Index_Type => Integer,
|
|
Table_Low_Bound => 1,
|
|
Table_Initial => 20,
|
|
Table_Increment => 100,
|
|
Table_Name => "Gnatcmd.Last_Switches");
|
|
|
|
Normal_Exit : exception;
|
|
-- Raise this exception for normal program termination
|
|
|
|
Error_Exit : exception;
|
|
-- Raise this exception if error detected
|
|
|
|
Errors : Natural := 0;
|
|
-- Count errors detected
|
|
|
|
Display_Command : Boolean := False;
|
|
-- Set true if /? switch causes display of generated command (on VMS)
|
|
|
|
-------------------
|
|
-- Command Table --
|
|
-------------------
|
|
|
|
-- The command table contains an entry for each command recognized by
|
|
-- GNATCmd. The entries are represented by an array of records.
|
|
|
|
type Parameter_Type is
|
|
-- A parameter is defined as a whitespace bounded string, not begining
|
|
-- with a slash. (But see note under FILES_OR_WILDCARD).
|
|
(File,
|
|
-- A required file or directory parameter
|
|
|
|
Optional_File,
|
|
-- An optional file or directory parameter
|
|
|
|
Other_As_Is,
|
|
-- A parameter that's passed through as is (not canonicalized)
|
|
|
|
Unlimited_Files,
|
|
-- An unlimited number of whitespace separate file or directory
|
|
-- parameters including wildcard specifications.
|
|
|
|
Unlimited_As_Is,
|
|
-- Un unlimited number of whitespace separated paameters that are
|
|
-- passed through as is (not canonicalized).
|
|
|
|
Files_Or_Wildcard);
|
|
-- A comma separated list of files and/or wildcard file specifications.
|
|
-- A comma preceded by or followed by whitespace is considered as a
|
|
-- single comma character w/o whitespace.
|
|
|
|
type Parameter_Array is array (Natural range <>) of Parameter_Type;
|
|
type Parameter_Ref is access all Parameter_Array;
|
|
|
|
type Command_Type is
|
|
(Bind,
|
|
Chop,
|
|
Clean,
|
|
Compile,
|
|
Check,
|
|
Elim,
|
|
Find,
|
|
Krunch,
|
|
Link,
|
|
List,
|
|
Make,
|
|
Metric,
|
|
Name,
|
|
Preprocess,
|
|
Pretty,
|
|
Setup,
|
|
Shared,
|
|
Stub,
|
|
Xref,
|
|
Undefined);
|
|
|
|
type Alternate_Command is (Comp, Ls, Kr, Pp, Prep);
|
|
-- Alternate command label for non VMS system use
|
|
|
|
Corresponding_To : constant array (Alternate_Command) of Command_Type :=
|
|
(Comp => Compile,
|
|
Ls => List,
|
|
Kr => Krunch,
|
|
Prep => Preprocess,
|
|
Pp => Pretty);
|
|
-- Mapping of alternate commands to commands
|
|
|
|
subtype Real_Command_Type is Command_Type range Bind .. Xref;
|
|
|
|
type Command_Entry is record
|
|
Cname : String_Ptr;
|
|
-- Command name for GNAT xxx command
|
|
|
|
Usage : String_Ptr;
|
|
-- A usage string, used for error messages
|
|
|
|
Unixcmd : String_Ptr;
|
|
-- Corresponding Unix command
|
|
|
|
Unixsws : Argument_List_Access;
|
|
-- Switches for the Unix command
|
|
|
|
VMS_Only : Boolean;
|
|
-- When True, the command can only be used on VMS
|
|
|
|
Switches : Switches_Ptr;
|
|
-- Pointer to array of switch strings
|
|
|
|
Params : Parameter_Ref;
|
|
-- Describes the allowable types of parameters.
|
|
-- Params (1) is the type of the first parameter, etc.
|
|
-- An empty parameter array means this command takes no parameters.
|
|
|
|
Defext : String (1 .. 3);
|
|
-- Default extension. If non-blank, then this extension is supplied by
|
|
-- default as the extension for any file parameter which does not have
|
|
-- an extension already.
|
|
end record;
|
|
|
|
-------------------------
|
|
-- Internal Structures --
|
|
-------------------------
|
|
|
|
-- The switches and commands are defined by strings in the previous
|
|
-- section so that they are easy to modify, but internally, they are
|
|
-- kept in a more conveniently accessible form described in this
|
|
-- section.
|
|
|
|
-- Commands, command qualifers and options have a similar common format
|
|
-- so that searching for matching names can be done in a common manner.
|
|
|
|
type Item_Id is (Id_Command, Id_Switch, Id_Option);
|
|
|
|
type Translation_Type is
|
|
(
|
|
T_Direct,
|
|
-- A qualifier with no options.
|
|
-- Example: GNAT MAKE /VERBOSE
|
|
|
|
T_Directories,
|
|
-- A qualifier followed by a list of directories
|
|
-- Example: GNAT COMPILE /SEARCH=([], [.FOO], [.BAR])
|
|
|
|
T_Directory,
|
|
-- A qualifier followed by one directory
|
|
-- Example: GNAT LIBRARY /SET=[.VAXFLOATLIB]
|
|
|
|
T_File,
|
|
-- A qualifier followed by a filename
|
|
-- Example: GNAT LINK /EXECUTABLE=FOO.EXE
|
|
|
|
T_No_Space_File,
|
|
-- A qualifier followed by a filename
|
|
-- Example: GNAT MAKE /PROJECT_FILE=PRJ.GPR
|
|
|
|
T_Numeric,
|
|
-- A qualifier followed by a numeric value.
|
|
-- Example: GNAT CHOP /FILE_NAME_MAX_LENGTH=39
|
|
|
|
T_String,
|
|
-- A qualifier followed by a quoted string. Only used by
|
|
-- /IDENTIFICATION qualifier.
|
|
-- Example: GNAT LINK /IDENTIFICATION="3.14a1 version"
|
|
|
|
T_Options,
|
|
-- A qualifier followed by a list of options.
|
|
-- Example: GNAT COMPILE /REPRESENTATION_INFO=(ARRAYS,OBJECTS)
|
|
|
|
T_Commands,
|
|
-- A qualifier followed by a list. Only used for
|
|
-- MAKE /COMPILER_QUALIFIERS /BINDER_QUALIFIERS /LINKER_QUALIFIERS
|
|
-- (gnatmake -cargs -bargs -largs )
|
|
-- Example: GNAT MAKE ... /LINKER_QUALIFIERS /VERBOSE FOOBAR.OBJ
|
|
|
|
T_Other,
|
|
-- A qualifier passed directly to the linker. Only used
|
|
-- for LINK and SHARED if no other match is found.
|
|
-- Example: GNAT LINK FOO.ALI /SYSSHR
|
|
|
|
T_Alphanumplus
|
|
-- A qualifier followed by a legal linker symbol prefix. Only used
|
|
-- for BIND /BUILD_LIBRARY (gnatbind -Lxyz).
|
|
-- Example: GNAT BIND /BUILD_LIBRARY=foobar
|
|
);
|
|
|
|
type Item (Id : Item_Id);
|
|
type Item_Ptr is access all Item;
|
|
|
|
type Item (Id : Item_Id) is record
|
|
Name : String_Ptr;
|
|
-- Name of the command, switch (with slash) or option
|
|
|
|
Next : Item_Ptr;
|
|
-- Pointer to next item on list, always has the same Id value
|
|
|
|
Command : Command_Type := Undefined;
|
|
|
|
Unix_String : String_Ptr := null;
|
|
-- Corresponding Unix string. For a command, this is the unix command
|
|
-- name and possible default switches. For a switch or option it is
|
|
-- the unix switch string.
|
|
|
|
case Id is
|
|
|
|
when Id_Command =>
|
|
|
|
Switches : Item_Ptr;
|
|
-- Pointer to list of switch items for the command, linked
|
|
-- through the Next fields with null terminating the list.
|
|
|
|
Usage : String_Ptr;
|
|
-- Usage information, used only for errors and the default
|
|
-- list of commands output.
|
|
|
|
Params : Parameter_Ref;
|
|
-- Array of parameters
|
|
|
|
Defext : String (1 .. 3);
|
|
-- Default extension. If non-blank, then this extension is
|
|
-- supplied by default as the extension for any file parameter
|
|
-- which does not have an extension already.
|
|
|
|
when Id_Switch =>
|
|
|
|
Translation : Translation_Type;
|
|
-- Type of switch translation. For all cases, except Options,
|
|
-- this is the only field needed, since the Unix translation
|
|
-- is found in Unix_String.
|
|
|
|
Options : Item_Ptr;
|
|
-- For the Options case, this field is set to point to a list
|
|
-- of options item (for this case Unix_String is null in the
|
|
-- main switch item). The end of the list is marked by null.
|
|
|
|
when Id_Option =>
|
|
|
|
null;
|
|
-- No special fields needed, since Name and Unix_String are
|
|
-- sufficient to completely described an option.
|
|
|
|
end case;
|
|
end record;
|
|
|
|
subtype Command_Item is Item (Id_Command);
|
|
subtype Switch_Item is Item (Id_Switch);
|
|
subtype Option_Item is Item (Id_Option);
|
|
|
|
-------------------
|
|
-- Switch Tables --
|
|
-------------------
|
|
|
|
-- The switch tables contain an entry for each switch recognized by the
|
|
-- command processor. It is initialized by procedure Initialize.
|
|
|
|
Command_List : array (Real_Command_Type) of Command_Entry;
|
|
|
|
----------------
|
|
-- Procedures --
|
|
----------------
|
|
|
|
procedure Initialize;
|
|
-- Initialized the switch table Command_List
|
|
|
|
procedure Output_Version;
|
|
-- Output the version of this program
|
|
|
|
procedure VMS_Conversion (The_Command : out Command_Type);
|
|
-- Converts VMS command line to equivalent Unix command line
|
|
|
|
end VMS_Conv;
|