From 2ed07ea8c1912a6e2c44924764934fe30f6b9db2 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 11 Nov 2004 13:42:57 -0200 Subject: towards "requiring" C libraries --- loadlib.c | 67 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 28 deletions(-) (limited to 'loadlib.c') diff --git a/loadlib.c b/loadlib.c index ebfa4d51..ae5b8ca7 100644 --- a/loadlib.c +++ b/loadlib.c @@ -1,5 +1,5 @@ /* -** $Id: loadlib.c,v 1.7 2004/10/07 17:27:20 roberto Exp roberto $ +** $Id: loadlib.c,v 1.8 2004/10/18 18:07:31 roberto Exp roberto $ ** Dynamic library loader for Lua ** See Copyright Notice in lua.h * @@ -33,6 +33,10 @@ #include "lualib.h" +#define ERR_OPEN 1 +#define ERR_FUNCTION 2 + + static void registerlib (lua_State *L, const void *lib); @@ -48,10 +52,8 @@ static void registerlib (lua_State *L, const void *lib); #define freelib dlclose -static int loadlib(lua_State *L) +static int loadlib(lua_State *L, const char *path, const char *init) { - const char *path=luaL_checkstring(L,1); - const char *init=luaL_checkstring(L,2); void *lib=dlopen(path,RTLD_NOW); if (lib!=NULL) { @@ -60,15 +62,16 @@ static int loadlib(lua_State *L) { registerlib(L, lib); lua_pushcfunction(L,f); - return 1; + return 0; } } - /* else return appropriate error messages */ - lua_pushnil(L); + /* else return appropriate error message */ lua_pushstring(L,dlerror()); - lua_pushstring(L,(lib!=NULL) ? "init" : "open"); - if (lib!=NULL) dlclose(lib); - return 3; + if (lib!=NULL) { + dlclose(lib); + return ERR_FUNCTION; /* error loading function */ + } + else return ERR_OPEN; /* error loading library */ } @@ -93,10 +96,8 @@ static void pusherror(lua_State *L) lua_pushfstring(L,"system error %d\n",error); } -static int loadlib(lua_State *L) +static int loadlib(lua_State *L, const char *path, const char *init) { - const char *path=luaL_checkstring(L,1); - const char *init=luaL_checkstring(L,2); HINSTANCE lib=LoadLibrary(path); if (lib!=NULL) { @@ -108,11 +109,12 @@ static int loadlib(lua_State *L) return 1; } } - lua_pushnil(L); pusherror(L); - lua_pushstring(L,(lib!=NULL) ? "init" : "open"); - if (lib!=NULL) FreeLibrary(lib); - return 3; + if (lib!=NULL) { + FreeLibrary(lib); + return ERR_OPEN; + } + else return ERR_FUNCTION; } @@ -136,16 +138,12 @@ static void pusherror (lua_State *L) lua_pushstring(L, err_str); } -static int loadlib (lua_State *L) { - const char *path=luaL_checkstring(L,1); - const char *init=luaL_checkstring(L,2); +static int loadlib (lua_State *L, const char *path, const char *init) { const struct mach_header *lib; /* this would be a rare case, but prevents crashing if it happens */ if(!_dyld_present()) { - lua_pushnil(L); lua_pushstring(L,"dyld not present."); - lua_pushstring(L,"absent"); - return 3; + return ERR_OPEN; } lib = NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR); if(lib != NULL) { @@ -156,15 +154,13 @@ static int loadlib (lua_State *L) { lua_CFunction f = (lua_CFunction)NSAddressOfSymbol(init_sym); registerlib(L, lib); lua_pushcfunction(L,f); - return 1; + return 0; } } /* else an error ocurred */ - lua_pushnil(L); pusherror(L); - lua_pushstring(L, (lib != NULL) ? "init" : "open"); /* Can't unload image */ - return 3; + return (lib != NULL) ? ERR_FUNCTION : ERR_OPEN; } @@ -213,12 +209,27 @@ static int gctm (lua_State *L) return 0; } + +static int loadlib1 (lua_State *L) { + const char *path=luaL_checkstring(L,1); + const char *init=luaL_checkstring(L,2); + int res = loadlib(L,path,init); + if (res == 0) /* no error? */ + return 1; /* function is at stack top */ + else { /* error */ + lua_pushnil(L); + lua_insert(L,-2); /* insert nil before error message */ + lua_pushstring(L, (res==ERR_OPEN)?"open":"init"); + return 3; + } +} + LUALIB_API int luaopen_loadlib (lua_State *L) { luaL_newmetatable(L, "_LOADLIB"); lua_pushcfunction(L, gctm); lua_setfield(L, -2, "__gc"); - lua_register(L,"loadlib",loadlib); + lua_register(L,"loadlib",loadlib1); return 0; } -- cgit v1.2.1