mercredi 14 avril 2010

Développement modulaire en C++: Fichier de configuration LUA

L'intérêt d'insérer un langage script son application ne se fait pas obligatoirement ressentir dès le début d'un développement. Cependant ça permet de prévoir une éventuelle évolution de son projet vers un développement plus modulaire.

Je vais donc vous écrire une série de posts qui auront pour objectif de faire évoluer le grand classique "Hello world" vers une grande modularité. Une bonne raison d'intégrer du LUA dans son programme peut être la lecture d'un fichier de configuration ; une fonctionnalité utilisée par une grande majorité d'application.

Commençons avec le programme suivant qui permet d'afficher 5 lignes "Hello world" :
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

int main(void)
{
    string text = "Hello world\n";
    int nbLines = 5;

    for (int i=0; i<nblines; i++)
        printf(text.c_str());

    return 0;
}

Et ajoutons y maintenant la possibilité de modifier le texte et le nombre de lignes par le biais d'un fichier de configuration LUA :
// Librairies LUA
extern "C" {
 #include <lauxlib.h>
 #include <lualib.h>
}
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

int main(void)
{
    lua_State *L;
    string text = "Hello world\n";
    int nbLines = 5;

    /*
     * Instance de l'interface LUA
     */
    L = luaL_newstate();
    luaL_openlibs(L); /* Chargement des libraries standard */
    if ( luaL_dofile(L, "configuration.lua") ) {  /* Chargement du fichier */
        fprintf(stderr, "Impossible de charger le fichier de configuration: %s\n", lua_tostring(L, -1));
        exit(1);
    }

    // recupere la variable text
    lua_settop(L,0);
    lua_getfield(L, LUA_GLOBALSINDEX, "TEXT");
    if (lua_isstring(L, -1)) {
        text = lua_tostring(L, -1);
    }
    lua_pop(L, 1);

    // recupere la variable nbLines
    lua_settop(L,0);
    lua_getfield(L, LUA_GLOBALSINDEX, "NB_LINES");
    if (lua_isnumber(L, -1)) {
        nbLines = lua_tonumber(L, -1);
    }
    lua_pop(L, 1);

    for (int i=0; i<nblines; i++)
        printf(text.c_str());

    return 0;
}


Avec comme fichier de configuration :
NB_LINES = 2
TEXT = "Hello world [MODIFIE]\n"


Ou bien :
NB_LINES = 1
TEXT = "Vous êtes sous " .. os.getenv("OS") .. "\n"


Pour l'instant ce n'est pas plus compliqué qu'une autre méthode, mais je suis certain que vous y voyez déjà quelques avantages... Non ?

Téléchargement des sources (+ exécutable Windows)

Aucun commentaire:

Enregistrer un commentaire