#include "lisp/require.h"
LispObj *
Lisp_Load(LispBuiltin *builtin)
{
LispObj *filename, *verbose, *print, *if_does_not_exist;
if_does_not_exist = ARGUMENT(3);
print = ARGUMENT(2);
verbose = ARGUMENT(1);
filename = ARGUMENT(0);
if (PATHNAMEP(filename))
filename = CAR(filename->data.pathname);
else {
CHECK_STRING(filename);
}
return (LispLoadFile(filename,
verbose != UNSPEC && verbose != NIL,
print != UNSPEC && print != NIL,
if_does_not_exist != UNSPEC &&
if_does_not_exist != NIL));
}
LispObj *
Lisp_Require(LispBuiltin *builtin)
{
char filename[1024], *ext;
int len;
LispObj *obj, *module, *pathname;
pathname = ARGUMENT(1);
module = ARGUMENT(0);
CHECK_STRING(module);
if (pathname != UNSPEC) {
if (PATHNAMEP(pathname))
pathname = CAR(pathname->data.pathname);
else {
CHECK_STRING(pathname);
}
}
else
pathname = module;
for (obj = MOD; CONSP(obj); obj = CDR(obj)) {
if (strcmp(THESTR(CAR(obj)), THESTR(module)) == 0)
return (module);
}
if (THESTR(pathname)[0] != '/') {
#ifdef LISPDIR
snprintf(filename, sizeof(filename), "%s", LISPDIR);
#else
getcwd(filename, sizeof(filename));
#endif
}
else
filename[0] = '\0';
*(filename + sizeof(filename) - 5) = '\0';
len = strlen(filename);
if (!len || filename[len - 1] != '/') {
strcat(filename, "/");
++len;
}
snprintf(filename + len, sizeof(filename) - len - 5, "%s", THESTR(pathname));
ext = filename + strlen(filename);
#ifdef SHARED_MODULES
strcpy(ext, ".so");
if (access(filename, R_OK) == 0) {
LispModule *lisp_module;
char data[64];
int len;
if (lisp__data.module == NULL) {
if (dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL) == NULL)
LispDestroy("%s: ", STRFUN(builtin), dlerror());
}
lisp_module = (LispModule*)LispMalloc(sizeof(LispModule));
if ((lisp_module->handle =
dlopen(filename, RTLD_LAZY | RTLD_GLOBAL)) == NULL)
LispDestroy("%s: dlopen: %s", STRFUN(builtin), dlerror());
snprintf(data, sizeof(data), "%sLispModuleData", THESTR(module));
if ((lisp_module->data =
(LispModuleData*)dlsym(lisp_module->handle, data)) == NULL) {
dlclose(lisp_module->handle);
LispDestroy("%s: cannot find LispModuleData for %s",
STRFUN(builtin), STROBJ(module));
}
LispMused(lisp_module);
lisp_module->next = lisp__data.module;
lisp__data.module = lisp_module;
if (lisp_module->data->load)
(lisp_module->data->load)();
if (MOD == NIL)
MOD = CONS(module, NIL);
else {
RPLACD(MOD, CONS(CAR(MOD), CDR(MOD)));
RPLACA(MOD, module);
}
LispSetVar(lisp__data.modules, MOD);
return (module);
}
#endif
strcpy(ext, ".lsp");
(void)LispLoadFile(STRING(filename), 0, 0, 0);
return (module);
}