7. Le programme de démonstration

Nous avons beaucoup travaillé, mais il manque le principal; le programme de démonstration. Le voici; je ne le commente pas car il est simple à comprendre.

7.1. main.c

#include <stdio.h>
#include <stdlib.h>
#include "my_config.h"

int
main ()
{
  MYCONFIG *myconfig;

  myconfig = init_config ("configfile");
  if (myconfig)
    {
      printf ("'%d'\n'%d' '%s' \n'%s'\n\n",
	      myconfig->unentier,
	      myconfig->intstr1,
	      myconfig->intstr2, myconfig->unbooleen ? "TRUE" : "FALSE");
    }

  exit (1);
}

7.2. Génération de l'exécutable demo

Il ne reste qu'à compiler main.c et à le lier aux autres objets :

gcc -c main.c
gcc -o demo main.o read_config_lex.o read_config_yy.o -lfl

Une remarque importante : il faut lier le programme de démonstration à la librairie libfl, et pour une compilation sans erreurs, mettre ce -lfl après les objets.

7.3. Le fichier de configuration

Voici mon fichier de configuration, qui s'appelle configfile. Ce nom est codé en dur dans main.c. Ce n'est pas propre du tout, mais cela simplifie amplement le code. Dans un programme plus propre, il faudrait chercher ce fichier dans un sous-répertoire de l'utilisateur, et sinon dans un répertoire système contenant un fichier de configuration générique. Il faudrait aussi tester que le fichier est bien un fichier et non pas un répertoire. Et encore tester qu'il s'ouvre bien... Cela ne rentre pas dans le cadre de cet article.

Le fichier de configuration :

# un commentaire
Intstr 3 'bonjour le monde'
boolean yes
unEntier   13

Notons au passage que le nombre d'espaces n'a pas d'importance, que l'ordre des lignes n'a pas d'importance non plus, et que l'on peut mettre des commentaires où l'on veut.

De plus, ce fichier diffère au niveau contenu du fichier du début de l'article. Ce fichier qu'on avait plus haut doit également marcher!

7.4. Le Makefile

Pour vous éviter d'avoir trop à taper pour tout recompiler à la moindre erreur, voici mon fichier Makefile :

all: read_config_yy.h main.o read_config_lex.o read_config_yy.o
	gcc -o toto main.o read_config_yy.o read_config_lex.o -lfl
clean:
	rm -f *.o
	rm -f read_config_lex.c read_config_yy.c read_config_yy.h
	rm -f toto
	
read_config_lex.o:	read_config_lex.c
	gcc -c ${CFLAGS} read_config_lex.c
	
read_config_yy.o:	read_config_yy.c
	gcc -c ${CFLAGS} read_config_yy.c
	
read_config_lex.c: read_config_lex.l
	flex read_config_lex.l ; mv -f lex.yy.c read_config_lex.c
	
read_config_yy.c: read_config_yy.y
	bison -y -d read_config_yy.y ; mv -f y.tab.c read_config_yy.c; mv -f y.tab.h read_config_yy.h
	
read_config_yy.h: read_config_yy.y
	bison -y -d read_config_yy.y ; mv -f y.tab.c read_config_yy.c; mv -f y.tab.h read_config_yy.h

Rappel : en début de ligne de commande d'un Makefile on n'a jamais d'espaces mais des tabulations. Pour les gens qui ne me croiraient pas ou qui voudraient en savoir plus, l'éditeur favori des linuxiens propose un livre Makefile d'excellente qualité.

création est mise à disposition sous un contrat Creative Commons