with Ada.Command_line; use Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;
procedure Cmdline is
begin
Put_Line (Integer'Image(Argument_Count) & " Parametros ...");
for I in 1..Argument_Count loop
Put_Line ("Parameter " & Integer'Image(I) & " : " & Argument(I));
end loop;
if Argument_Count /= 1 then
Put_Line ("Just one parameter please");
return;
end if;
Put_Line ("Hello " & Argument(1));
end Cmdline;Para poder acceder a los parámetros pasados a través de la línea de
comandos Ada proporciona el paquete Ada.Command_line. Este
paquete define un array llamado Argument que contiene los
argumentos comenzando con el índice 1. El número de argumentos de
almacena en la función Argument_Count.
Este paquete también nos proporciona el nombre del programa siendo
ejecutado en la función Command_Name.
Como sucede con otros lenguajes, ADA nos ofrece varias posibilidades
para poder procesar la línea de comando de forma sencilla. Como siempre
elegiremos la versión más parecida a getopt que es, por así
decirlo, la implementación estándar. El código sería algo como esto:
with GNAT.Command_Line;
with Ada.Command_Line;
with GNAT.Strings;
procedure CmdlineGetopt is
use Ada.Text_IO;
use GNAT.Command_Line;
use GNAT.Strings;
Config : Command_Line_Configuration;
Help_Flag : aliased Boolean := False;
Input_File : aliased String_Access := new String'("input.txt");
Output_File : aliased String_Access := new String'("output.txt");
procedure Print_Help is
begin
Put_Line ("Usage: program [options]");
Put_Line ("Options:");
Put_Line (" -h, --help Show this help message");
Put_Line (" -i, --input FILE Input file (default: input.txt)");
Put_Line (" -o, --output FILE Output file (default: output.txt)");
end Print_Help;
begin
Define_Switch
(Config => Config,
Switch => "-h",
Long_Switch => "--help",
Help => "Show program help1",
Output => Help_Flag'Access);
Define_Switch
(Config => Config,
Switch => "-i:",
Long_Switch => "--input:",
Help => "Input file",
Output => Input_File'Access);
Define_Switch
(Config => Config,
Switch => "-o:",
Long_Switch => "--output:",
Help => "Output file",
Output => Output_File'Access);
begin
Getopt (Config);
if Help_Flag then
Print_Help;
return;
end if;
Put_Line ("Input file : " & Input_File.all);
Put_Line ("Output file: " & Output_File.all);
exception
when Exit_From_Command_Line =>
-- Normal early exit (e.g. --help)
Ada.Command_Line.Set_Exit_Status (Ada.Command_Line.Success);
return;
end;
end CmdlineGetopt;Como siempre algunos comentarios sobre este código.
La línea Input_File : aliased String_Acess := new...
está declarando un puntero puntero a una cadena de caracteres e
inicializandolo con new. La palabra clave
aliased significa que la variable tiene una dirección
estable cuando se usa 'Address. String_Access
es un tipo que normalmente se declara como
type String_Access is access all Strings;
Lo primero que podemos ver en este nuevo código es que hemos usado Define_switch para definir
todos los flags de nuestro programa. GNAT.Command_line
ofrece otros procedimientos como Define_parameter para
definir en detalle flags con parámetros (en principio
Define_switch es para valores booleanos), sin embargo, el
parámetro output de Define_switch, nos permite
indicar donde queremos almacenar los valores de esos flags. Observad que
para input y output hemos añadido
: al final de la opción para indicar que estos flags
reciben parámetros… de la forma a la que nos tiene acostumbrados
getopts.
En ADA, no existe nada parecido a exit, así que o el
programa termina normalmente o debemos producir una excepción. Si
retornamos del programa principal, como estamos haciendo en
el bloque if que muestra la ayuda, el programa generará una
excepción que se mostrará en pantalla y parecerá un error.
Podemos retornar un valor de estado al terminar el programa utilizando el procedimiento
Set_Exit_Statusdel paqueteAda.Command_Line.
Para evitarlo, podemos capturar al excepción, lo cual podemos hacer
metiendo el código que produce la excepción en un bloque
begin - end e incluyendo el bloque
exception donde procesar la excepción
Exit_From_Command_Line.
Resumen
- Ada retorna los parámetros de la línea de comandos en el array
Ada.Command_Line.Argumentscomo cadenas de caracteres. - El array de argumentos comienza en
1. - El paquete
GNAT.Command_Linenos ofrece un interfaz similar agetoptpara procesar nuestra línea de comando fácilmente.
■
