4 /* -----------------------------------------------------------------------------
5 * Dynamic libraries support (WIN32 not supported)
6 * ---------------------------------------------------------------------------*/
12 int Jim_LoadLibrary(Jim_Interp
*interp
, const char *pathName
)
14 Jim_Obj
*libPathObjPtr
;
17 int (*onload
) (Jim_Interp
*interp
);
19 libPathObjPtr
= Jim_GetGlobalVariableStr(interp
, JIM_LIBPATH
, JIM_NONE
);
20 if (libPathObjPtr
== NULL
) {
25 Jim_IncrRefCount(libPathObjPtr
);
26 prefixc
= Jim_ListLength(interp
, libPathObjPtr
);
29 for (i
= -1; i
< prefixc
; i
++) {
31 handle
= dlopen(pathName
, RTLD_LAZY
);
35 /* REVISIT: Move off stack */
36 char buf
[JIM_PATH_LEN
];
39 Jim_Obj
*prefixObjPtr
;
42 if (Jim_ListIndex(interp
, libPathObjPtr
, i
, &prefixObjPtr
, JIM_NONE
) != JIM_OK
)
44 prefix
= Jim_GetString(prefixObjPtr
, &prefixlen
);
45 if (prefixlen
+ strlen(pathName
) + 1 >= JIM_PATH_LEN
)
47 if (*pathName
== '/') {
48 strcpy(buf
, pathName
);
50 else if (prefixlen
&& prefix
[prefixlen
- 1] == '/')
51 sprintf(buf
, "%s%s", prefix
, pathName
);
53 sprintf(buf
, "%s/%s", prefix
, pathName
);
58 handle
= dlopen(buf
, RTLD_LAZY
);
61 Jim_SetResultFormatted(interp
, "error loading extension \"%s\": %s", pathName
,
68 /* Now, we use a unique init symbol depending on the extension name.
69 * This is done for compatibility between static and dynamic extensions.
70 * For extension readline.so, the init symbol is "Jim_readlineInit"
78 pt
= strrchr(pathName
, '/');
85 pt
= strchr(pkgname
, '.');
87 pkgnamelen
= pt
- pkgname
;
90 pkgnamelen
= strlen(pkgname
);
92 snprintf(initsym
, sizeof(initsym
), "Jim_%.*sInit", pkgnamelen
, pkgname
);
94 if ((onload
= dlsym(handle
, initsym
)) == NULL
) {
95 Jim_SetResultFormatted(interp
,
96 "No %s symbol found in extension %s", initsym
, pathName
);
100 if (onload(interp
) == JIM_ERR
) {
104 Jim_SetEmptyResult(interp
);
105 if (libPathObjPtr
!= NULL
)
106 Jim_DecrRefCount(interp
, libPathObjPtr
);
110 if (libPathObjPtr
!= NULL
)
111 Jim_DecrRefCount(interp
, libPathObjPtr
);
114 #else /* JIM_DYNLIB */
115 int Jim_LoadLibrary(Jim_Interp
*interp
, const char *pathName
)
118 JIM_NOTUSED(pathName
);
120 Jim_SetResultString(interp
, "the Jim binary has no support for [load]", -1);
123 #endif /* JIM_DYNLIB */
126 static int Jim_LoadCoreCommand(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
129 Jim_WrongNumArgs(interp
, 1, argv
, "libaryFile");
132 return Jim_LoadLibrary(interp
, Jim_GetString(argv
[1], NULL
));
135 int Jim_loadInit(Jim_Interp
*interp
)
137 Jim_CreateCommand(interp
, "load", Jim_LoadCoreCommand
, NULL
, NULL
);