INI-tiation

Configurer un logiciel peut se faire de différentes façons. La première est, par exemple, d’utiliser des options sur la ligne de commande. Cela se fait au travers du paquetage Ada.Command_Line ou encore plus simplement au travers du paquetage GNAT.Command_Line qui permet de définir et de traiter simplement les options d’une ligne de commande.

Cela étant, aussi riches que peuvent être ces options, elles ont leurs limites et il faut envisager une autre approche.

La première qui nous vienne à l’esprit est d’utiliser un ou des fichiers de configuration (nous nous cantonnerons ici à un seul fichier au format texte).

Pour sa structure, mieux vaut s’appuyer sur des standards connus tels que : CSV, XML, JSON, YAML, TOML, INI, etc. Ces standards ont leurs avantages et leurs inconvénients et peuvent être interprétés nativement en Ada.

Dans ce bestiaire, les fichiers INI se caractérisent par leur simplicité, leur lisibilité et leur universalité (présents sous Linux, Windows). Cela étant, leur structure très « plate » ne permet pas de faire des choses élaborées comme le permet par exemple le format XML qui, pour le coup, n’est pas très « lisible ».

Dans la suite de cet article, nous allons présenter comment ce format INI peut être facilement utilisé au sein d’une application Ada.

Fichiers au format INI

Les fichiers .ini sont des fichiers texte facilement éditables. Ces fichiers sont constitués de sections. Chaque section décrit des paramètres. Une section commence par un titre placé entre crochets [] ne comportant aucun blanc. Un champ paramètre est décrit par son identifiant suivi d’un champ contenant ses valeurs. Les deux champs (paramètres et valeurs) sont séparés par un =. Un commentaire commence par le caractère # et se termine à la fin de la ligne.

Le paquetage GNATCOLL.Config

Ce paquetage permet de traiter de façon indifférenciée des fichiers de configuration au format texte.

L’implémentation par défaut prend en charge les fichiers .ini.

Exemple

Imaginons que nous souhaitions configurer un certain nombre de composants dans notre application.

Cela concerne :

  • L’activation et/ou la configuration des IOs,
  • La configuration d’une interface réseau,
  • La configuration d’une interface MODBUS.

Cette configuration se fera au travers du fichier .ini suivant :

# Exemple de commentaire.
[io]
syslog = yes
log = yes
dir = $HOME
[net]
host = 192.168.1.59
port = 4264
cycle = 100
[modbus]
addr = 16#1a#
timeout = 300
cycle = 500

Alors, le code suivant basé sur GNATCOLL.Config permettra d’accéder facilement aux informations de configuration :

with GNATCOLL.Config, Ada.Text_IO, Ada.Environment_Variables;
use GNATCOLL.Config, Ada.Text_IO, Ada.Environment_Variables;

procedure Mon_Appli is
   INI_File : constant String := "mon_appli.ini";
   C : INI_Parser;
   type Section_T is (IO, Net, Modbus);
   type Key_T is (Syslog, Log, Dir,    --> io
                  Cycle,               --> net + modbus
                  Host, Port,          -->
                  Addr, Timeout);      --> modbus
begin
   C.Configure (Home => Value ("HOME")); -- !
   C.Open (INI_File);

   while not C.At_End loop
      declare
         Section : constant Section_T := Section_T'Value (C.Section);
         Key     : constant Key_T     := Key_T'Value (C.Key);
         Value   : constant String    := C.Value;
      begin
         Put_Line (Section'Img & ":" & Key'Img & ":" & Value);

         case Section is
            when IO =>
               case Key is
               when Syslog =>
                  
               end case;
            when Net =>
               
         end case;
      end;
      C.Next;
   end loop;

end Mon_Appli;

Et l’exécution affichera entre autres :

IO:SYSLOG:yes
IO:LOG:yes
IO:DIR:/home/dupond
NET:HOST:192.168.1.59
NET:PORT:4264
NET:CYCLE:100
MODBUS:ADDR:16#1a#
MODBUS:TIMEOUT:300
MODBUS:CYCLE:500

On peut remarquer ici que la valeur de la clé dir de notre fichier .ini a été substituée par la valeur de la variable d’environnement HOME (ici /home/dupond).

Conclusion

Mettre en œuvre un fichier .ini est extrêmement simple et cela répond bien souvent aux besoins de configurations d’applications plus ou moins exigeantes sur ce point. Si cela ne suffit pas, alors, il est toujours possible de s’orienter vers des solutions autour par exemple de xmlAda [2] mais cela se fera au détriment de la simplicité.

Références

[1] : https://docs.adacore.com/gnatcoll-docs/config.html

[2] : https://docs.adacore.com/xmlada-docs/index.html

Comments