summaryrefslogtreecommitdiff
path: root/loadlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-11-11 13:42:57 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2004-11-11 13:42:57 -0200
commit2ed07ea8c1912a6e2c44924764934fe30f6b9db2 (patch)
tree59c1b3f8932e3af8c2681d526b6cb9fe245b5a69 /loadlib.c
parentcfd7bc478f21494c254a8ed514271dbe655721b0 (diff)
downloadlua-github-2ed07ea8c1912a6e2c44924764934fe30f6b9db2.tar.gz
towards "requiring" C libraries
Diffstat (limited to 'loadlib.c')
-rw-r--r--loadlib.c67
1 files changed, 39 insertions, 28 deletions
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;
}