Package: GNAT.Command_Line

Dependencies

with GNAT.Directory_Operations;
with GNAT.Regexp;

Description

begin exit when S'Length = 0; Put_Line ("Got " & S); end; end loop;

exception when Invalid_Switch => Put_Line ("Invalid Switch " & Full_Switch); when Invalid_Parameter => Put_Line ("No parameter for " & Full_Switch); end;

A more complicated example would involve the use of sections for the switches, as for instance in gnatmake. These sections are separated by special switches, chosen by the programer. Each section act as a command line of its own.

begin Initialize_Option_Scan ('-', False, "largs bargs cargs"); loop -- same loop as above to get switches and arguments end loop;

Goto_Section ("bargs"); loop -- same loop as above to get switches and arguments -- The supports switches in Get_Opt might be different end loop;

Goto_Section ("cargs"); loop -- same loop as above to get switches and arguments -- The supports switches in Get_Opt might be different end loop; end;


Header

package GNAT.Command_Line is
 

Exceptions

Invalid_Parameter
Raised when a parameter is missing, or an attempt is made to obtain a parameter for a switch that does not allow a parameter
Invalid_Section
Raised when an invalid section is selected by Goto_Section
Invalid_Switch
Raised when an invalid switch is detected in the command line

Type Summary

Expansion_Iterator (limited type)
Primitive Operations:  Expansion, Start_Expansion

Other Items:

procedure Initialize_Option_Scan
  (Switch_Char              : Character := '-';
   Stop_At_First_Non_Switch : Boolean := False;
   Section_Delimiters       : String := "");
This procedure resets the internal state of the package to prepare to rescan the parameters. It need not (but may be) called before the first use of Getopt, but it must be called if you want to start rescanning the command line parameters from the start. The optional parameter Switch_Char can be used to reset the switch character, e.g. to '/' for use in DOS-like systems. The optional parameter Stop_At_First_Non_Switch indicates if Getopt is to look for switches on the whole command line, or if it has to stop as soon as a non-switch argument is found.

Example:

Arguments: my_application file1 -c

if Stop_At_First_Non_Switch is False, then -c will be considered as a switch (returned by getopt), otherwise it will be considered as a normal argument (returned by Get_Argument).

if SECTION_DELIMITERS is set, then every following subprogram (Getopt and Get_Argument) will only operate within a section, which is delimited by any of these delimiters or the end of the command line.

Example: Initialize_Option_Scan ("largs bargs cargs");

Arguments on command line : my_application -c -bargs -d -e -largs -f This line is made of three section, the first one is the default one and includes only the '-c' switch, the second one is between -bargs and -largs and includes '-d -e' and the last one includes '-f'


procedure Goto_Section (Name : String := "");
Change the current section. The next Getopt of Get_Argument will start looking at the beginning of the section. An empty name ("") refers to the first section between the program name and the first section delimiter. If the section does not exist, then Invalid_Section is raised.

function Full_Switch return String;
Returns the full name of the last switch found (Getopt only returns the first character)

function Getopt (Switches : String) return Character;
This function moves to the next switch on the command line (defined as a switch character followed by a character within Switches, casing being significant). The result returned is the first character of the particular switch located. If there are no more switches in the current section, returns ASCII.NUL. The switches need not be separated by spaces (they can be concatenated if they do not require an argument, e.g. -ab is the same as two separate arguments -a -b).

Switches is a string of all the possible switches, separated by a space. A switch can be followed by one of the following characters :

':' The switch requires a parameter. There can optionally be a space on the command line between the switch and its parameter '!' The switch requires a parameter, but there can be no space on the command line between the switch and its parameter '?' The switch may have an optional parameter. There can no space between the switch and its argument ex/ if Switches has the following value : "a? b" The command line can be : -afoo : -a switch with 'foo' parameter -a foo : -a switch and another element on the command line 'foo', returned by Get_Argument

Example: if Switches is "-a: -aO:", you can have the following command lines : -aarg : 'a' switch with 'arg' parameter -a arg : 'a' switch with 'arg' parameter -aOarg : 'aO' switch with 'arg' parameter -aO arg : 'aO' switch with 'arg' parameter

Example:

Getopt ("a b: ac ad?")

accept either 'a' or 'ac' with no argument, accept 'b' with a required argument accept 'ad' with an optional argument

If the first item in switches is '*', then Getopt will catch every element on the command line that was not caught by any other switch. The character returned by GetOpt is '*'

Example Getopt ("* a b") If the command line is '-a -c toto.o -b', GetOpt will return successively 'a', '*', '*' and 'b'. When '*' is returnd, Full_Switch returns the corresponding item on the command line.

When Getopt encounters an invalid switch, it raises the exception Invalid_Switch and sets Full_Switch to return the invalid switch. When Getopt can not find the parameter associated with a switch, it raises Invalid_Parameter, and sets Full_Switch to return the invalid switch character.

Note: in case of ambiguity, e.g. switches a ab abc, then the longest matching switch is returned.

Arbitrary characters are allowed for switches, although it is strongly recommanded to use only letters and digits for portability reasons.


function Get_Argument (Do_Expansion : Boolean := False) return String;
Returns the next element in the command line which is not a switch. This function should not be called before Getopt has returned ASCII.NUL.

If Expansion is True, then the parameter on the command line will considered as filename with wild cards, and will be expanded. The matching file names will be returned one at a time. When there are no more arguments on the command line, this function returns an empty string. This is useful in non-Unix systems for obtaining normal expansion of wild card references.


function Parameter return String;
Returns parameter associated with the last switch returned by Getopt. If no parameter was associated with the last switch, or no previous call has been made to Get_Argument, raises Invalid_Parameter. If the last switch was associated with an optionnal argument and this argument was not found on the command line, Parameter returns an empty string

type Expansion_Iterator is limited private;
Type used during expansion of file names

procedure Start_Expansion
  (Iterator     : out Expansion_Iterator;
   Pattern      : String;
   Directory    : String := "";
   Basic_Regexp : Boolean := True);
Initialize an wild card expansion. The next calls to Expansion will return the next file name in Directory which match Pattern (Pattern is a regular expression, using only the Unix shell and DOS syntax if Basic_Regexp is True. When Directory is an empty string, the current directory is searched.

function Expansion (Iterator : Expansion_Iterator) return String;
Return the next file in the directory matching the parameters given to Start_Expansion and updates Iterator to point to the next entry. Returns an empty string when there are no more files in the directory. If Expansion is called again after an empty string has been returned, then the exception GNAT.Directory_Operations.Directory_Error is raised.

private

   --  Implementation-defined ...
end GNAT.Command_Line;