mirror of
https://github.com/lua/lua.git
synced 2025-01-14 05:43:00 +08:00
towards "requiring" C libraries
This commit is contained in:
parent
cfd7bc478f
commit
2ed07ea8c1
67
loadlib.c
67
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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user