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.
#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); }
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.
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!
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é.
© 2001 Yves Mettier