2010-11-08 12 views
11

Sto provando ad impostare la mia variabile LUA_PATH globale direttamente da C/C++, sto usando Lua dalle mie applicazioni iPhone, quindi il mio percorso tende a cambiare tra le applicazioni (ogni app per iPhone ha una cartella separata nel dispositivo).Impostazione della variabile LUA_PATH globale da C++/C?

So che potrei impostare LUA_PATH ricompilando lua con un percorso "fisso", ma questo è abbastanza lontano dall'ideale.

(che sto cercando di fare questo al fine di essere in grado di utilizzare require, dai miei .lua script.

Qualcuno potrebbe darmi una mano qui?

risposta

20

In 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! 
} 

non ho ancora testato o compilato. Ho usato: http://lua.org/pil e http://lua.org/manual/5.1

0

Credo che questo non sarà possibili in quanto, come si metioned, per motivi di sicurezza ogni applicazione per iPhone vive in un proprio sandbox.

Penso usando setenv imposterà la variabile d'ambiente solo per il processo in corso ed è bambini.

E a proposito: se hai intenzione di inviare la tua app all'App Store, (per quanto ne so) i linguaggi/gli interpreti degli script sono fobidati dal contratto che hai firmato.

+1

Credo che fossero proibiti, ma non lo sono più. – Puppy

+0

@ DeadMG2 Forse mi sono perso qualcosa. Penso che nessuno abbia mai letto in dettaglio le frequenti modifiche e aggiunte al contratto – Kai

0
#include <stdlib.h> 

...

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

... o qualcosa del genere ...

+1

Non sono sicuro che funzioni su iPhone. – onemasse

3

È inoltre possibile modificare package.path in Lua prima di chiamare require.

0

Non ho molta familiarità con lo sviluppo di iPhone, ma è possibile impostare la variabile env LUA_PATH prima di eseguire l'applicazione?

Per esempio, in Linux, ho potuto scrivere uno script che esegue il binario in questo modo:

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

Windows ha una funzionalità simile con i file batch.

Se è davvero necessario modificarlo in codice, non so come fare a meno di usare luaL_loadbuffer e lua_pcall per eseguire un comando "package.path = blah".

+1

Oppure 'env LUA_PATH =" foo "/ percorso/su/eseguibile'. – lhf

+0

Non penso che LUA_PATH sia una variabile di ambiente. – Watusimoto

+0

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

4

ObjC: Seguendo dall'altra risposta, ecco cosa funziona per me. È necessario l'aggiunta di "/?.lua".

 
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

Funziona perfettamente, grazie. Esattamente quello che stavo cercando. – codeshaman

2

È possibile impostare il LUA_PATH e LUA_CPATH all'interno di C++ molto facilmente eseguendo una coppia funzioni lual_dostring.

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

Questi due linea chiamata dopo che hai il tuo lua_State (L qui) e prima della lual_loadfile() e lau_pcall() chiamate di funzione aggiungerà al percorso attualmente impostato e cPath. In questo caso aggiungo ad entrambe un'istruzione per dare un'occhiata locale all'esecuzione.

Mi ci sono volute ore per trovare questa soluzione .. Spero che aiuti.

Problemi correlati