Foros - Stratos

Programadores => Código de la Semana => Mensaje iniciado por: ethernet en 09 de Marzo de 2003, 05:23:22 PM

Título: Carga de configuración con Lua - Luis Cabellos
Publicado por: ethernet en 09 de Marzo de 2003, 05:23:22 PM


--funcion tonta para ver que se puede incluir



-- mas significado a un fichero de configuracion



function pantalla(an,al)



   al = 480 / 640 * an



   return an, al



end







ancho, alto = pantalla(800,480)



otro = ancho / alto



nombre = "tholatmundontttAdiostmundo"





Y a continuación como leeríamos los valores de ancho, alto, otro y nombre desde el programa





   ConfigFile mi_conf("configura.lua");







   double val;



   mi_conf.DaValor(val, "ancho");



   printf("valor de ancho = %fn",val);



   mi_conf.DaValor(val, "alto");



   printf("valor de alto = %fn",val);



   char *nombre=0;



   mi_conf.DaValor(nombre, "nombre");



   printf("valor de nombre = %sn",nombre);



   mi_conf.DaValor(val, "otro");



printf("valor de otro = %fn",val);






La ventaja de usar este tipo de archivos de configuración es la potencia que tienen y a la vez la simplicidad de uso. Otra ventaja en el caso de LUA es que el archivo de configuración puede compilarse a un archivo binario, sin necesidad de tocar el programa propio.



A continuación pongo el código de la clase. Comentar lo siguiente. El constructor ejecuta el fichero de configuración y si ocurre algún error lo marca en una variable booleana, esto permite impedir que se llame erróneamente a funciones de Lua en el resto de la clase. Las funciones que comienzan con 'lua_' son del interfaz de LUA. Para ejecutar el programa se necesita 'lua.dll'.




extern "C"{



.#include "lua.h"



};







class ConfigFile{



public:



   ConfigFile(const char *file);



   ~ConfigFile();







   bool DaValor(double &val, const char *nom);



   bool DaValor(const char *(&val),const char *nom);







private:



   lua_State *m_lua;



   bool mb_error;



};







ConfigFile::ConfigFile(const char *file){



   m_lua = lua_open(100);



   mb_error = (0 != lua_dofile(m_lua, file));



}







ConfigFile::~ConfigFile(){



   if( mb_error ) return;



   lua_close(m_lua);



}







bool ConfigFile::DaValor(double &val, const char *nom){



   if( mb_error ) return false;



   // meter en la pila el valor de nom



   lua_getglobal(m_lua, nom);



   int indice = lua_gettop(m_lua);







   bool retorno = false;



   // si nom es un nombre



   if( lua_isnumber(m_lua, indice) ){



       // obtener el valor de nom



       val=lua_tonumber(m_lua, indice);



       retorno = true;



   }







   // restaurar la pila



   lua_pop(m_lua, 1);



   return retorno;



}







bool ConfigFile::DaValor(const char *(&val),const char *nom){



   if( mb_error ) return false;



   // meter en la pila el valor de nom



   lua_getglobal(m_lua, nom);



   int indice = lua_gettop(m_lua);







   bool retorno = false;



   // si nom es un string



   if( lua_isstring(m_lua, indice) ){



       // obtener el valor de nom



       val = lua_tostring(m_lua, indice);



       retorno = true;



   }







   // restaurar la pila



   lua_pop(m_lua, 1);



   return retorno;



}





Puedes bajar el codigo de:

        http://www26.brinkster.com/zhen4/config.zip


Un saludo, Luis Cabellos

Web: http://www.zhenstudio.net

Éste código fue enviado por Luis Cabellos  el  1 de marzo del 2003 zhen@iespana.es

Si quieres enviar tu propio código hazlo a  eth_cotd@lycos.es
Título: Carga de configuración con Lua - Luis Cabellos
Publicado por: Zaelsius en 11 de Marzo de 2003, 06:01:24 PM
¡Muy interesante!
Título: Carga de configuración con Lua - Luis Cabellos
Publicado por: ethernet en 11 de Marzo de 2003, 06:37:32 PM
No he tenido tiempo de mirar mucho el codigo, de todas formas es una alternativa interesante a la propuesta el otro dia sobre ficheros .ini. La logica adicional q puedes añadir puede dar mucho de si. Supongo q podras usar cualquier caracteristica de LUA.

saludos
Título: Carga de configuración con Lua - Luis Cabellos
Publicado por: Zhen en 12 de Marzo de 2003, 12:18:17 AM
                                Bueno antes de que os de tiempo a mirarlo mas detenidamente  :-? y me pilleis el error, el método que devuelve una cadena de texto puede dar error de memoria si se libera el objeto ConfigFile. De la siguiente manera se crea una nueva cadena y ya se encargada el usuario de borrarlo cuando crea.



   if( lua_isstring(m_lua, indice) ){

       // borrar val anterior

       if(val) delete[] val;

       // obtener el valor de nom

       val = strdup(lua_tostring(m_lua, indice));

       retorno = true;

   }



Tambien comentar que se puede usar toda la potencia de Lua en el archivo de configuracion, aunque puede ser necesario cargar las librerias adicionales con lua_iolibopen(m_lua); lua_mathlibopen(m_lua); /*...*/ en el constructor.

Un saludo, Luis Cabellos                                
Título: Carga de configuración con Lua - Luis Cabellos
Publicado por: ethernet en 12 de Marzo de 2003, 07:04:19 PM
Yo lo haria devolviendo la cadena directamente, para algo esta std::string,



std::string pilla_valor(....)

{



   char *s=lua_pillo_str(...);

   return std::string(s);

 



}