------------------------------------------------------------------------------ -- -- -- 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, 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;