2010-11-08 28 views
11

Estoy tratando de establecer mi variable global LUA_PATH directamente desde C/C++, estoy usando Lua desde mis aplicaciones de iPhone, por lo que mi ruta tiende a cambiar entre aplicaciones (cada aplicación de iPhone tiene una carpeta separada en el dispositivo).Estableciendo la variable global LUA_PATH de C++/C?

Sé que podría establecer el LUA_PATH recompilando lua con una ruta "fija", pero eso está bastante lejos de ser ideal.

(estoy tratando de hacer esto con el fin de poder utilizar require, de mis .lua guiones.

Podría alguien ayudarme aquí?

Respuesta

20

En C++:

int setLuaPath(lua_State* L, const char* path) 
{ 
    lua_getglobal(L, "package"); 
    lua_getfield(L, -1, "path"); // get field "path" from table at top of stack (-1) 
    std::string cur_path = lua_tostring(L, -1); // grab path string from top of stack 
    cur_path.append(";"); // do your path magic here 
    cur_path.append(path); 
    lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5 
    lua_pushstring(L, cur_path.c_str()); // push the new one 
    lua_setfield(L, -2, "path"); // set the field "path" in table at -2 with value at top of stack 
    lua_pop(L, 1); // get rid of package table from top of stack 
    return 0; // all done! 
} 

No he probado o compilado. Usé: http://lua.org/pil y http://lua.org/manual/5.1

0

supongo que esto no será possibles, ya que, a medida que metioned, por razones de seguridad cada aplicación para el iPhone que vive en propia caja de arena.

Creo usando setenv va a establecer la variable de entorno sólo para el proceso actual y de los niños.

Y por cierto: si planeas enviar tu aplicación a la AppStore, (hasta donde yo sé) los lenguajes de escritura/intérpretes están prohibidos por el contrato que firmaste.

+1

Creo que solían estar prohibidos, pero ya no están prohibidos. – Puppy

+0

@ DeadMG2 Tal vez me perdí algo. Creo que nadie lee en detalle los frecuentes cambios y adiciones al contrato – Kai

0
#include <stdlib.h> 

...

setenv ("LUA_PATH", (char *)my_path, 1); 

... o algo por el estilo ...

+1

No estoy seguro si funciona en iPhone. – onemasse

3

También puede cambiar package.path en Lua antes de llamar require.

0

No estoy muy familiarizado con el desarrollo de iPhone, pero ¿puede establecer la variable de entorno LUA_PATH antes de ejecutar su aplicación?

Por ejemplo, en Linux, podría escribir un script que ejecuta el binario de este modo:

export LUA_PATH="foo" 
/path/to/executable 

Windows tiene una funcionalidad similar con archivos por lotes.

Si realmente necesita cambiarlo en el código, no sé cómo hacer eso sin usar luaL_loadbuffer y lua_pcall para ejecutar un comando "package.path = blah".

+1

O 'env LUA_PATH =" foo "/ ruta/a/ejecutable'. – lhf

+0

No creo que LUA_PATH sea una variable de entorno. – Watusimoto

+0

@Watusimoto http://www.lua.org/pil/8.1.html. Grep LUA_PATH. – lhumongous

4

ObjC: A raíz de la otra respuesta, esto es lo que funciona para mí. El agregado de "/?.lua" es necesario.

 
int setLuaPath(NSString* path) 
{ 
    lua_getglobal(L, "package"); 
    lua_getfield(L, -1, "path"); // get field "path" from table at top of stack (-1) 
    NSString * cur_path = [NSString stringWithUTF8String:lua_tostring(L, -1)]; // grab path string from top of stack 
    cur_path = [cur_path stringByAppendingString:@";"]; // do your path magic here 
    cur_path = [cur_path stringByAppendingString:path]; 
    cur_path = [cur_path stringByAppendingString:@"/?.lua"]; 
    lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5 
    lua_pushstring(L, [cur_path UTF8String]); // push the new one 
    lua_setfield(L, -2, "path"); // set the field "path" in table at -2 with value at top of stack 
    lua_pop(L, 1); // get rid of package table from top of stack 
    return 0; // all done! 
} 

    ... add this code somewhere, near where you lua_open() for example 

    // Set Lua's Package.path to where our Lua files can be found 
    NSString *luaPath = [[NSBundle mainBundle] pathForResource:@"name of any one of my lua files" ofType:@"lua"]; 
    setLuaPath([luaPath stringByDeletingLastPathComponent]); 
    ... 
+0

Esto funciona sin problemas, gracias. Exactamente lo que estaba buscando. – codeshaman

2

puede establecer el LUA_PATH y LUA_CPATH en C++ muy fácilmente mediante la ejecución de un par lual_dostring funciones.

luaL_dostring(L, "package.path = package.path .. ';?.lua'"); 
luaL_dostring(L, "package.cpath = package.cpath .. ';?.dll'"); 

Estos dos líneas de llamada después de tener su lua_State (L aquí) y antes de su lual_loadfile() y lau_pcall() las llamadas a funciones se sumará a la ruta establecida actualmente y cpath. En este caso, agrego a ambas una instrucción para ver localmente la ejecución.

Me llevó horas encontrar esta solución. Espero que ayude.