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 char buf
[JIM_PATH_LEN
];
38 Jim_Obj
*prefixObjPtr
;
41 if (Jim_ListIndex(interp
, libPathObjPtr
, i
, &prefixObjPtr
, JIM_NONE
) != JIM_OK
)
43 prefix
= Jim_GetString(prefixObjPtr
, &prefixlen
);
44 if (prefixlen
+ strlen(pathName
) + 1 >= JIM_PATH_LEN
)
46 if (*pathName
== '/') {
47 strcpy(buf
, pathName
);
49 else if (prefixlen
&& prefix
[prefixlen
- 1] == '/')
50 sprintf(buf
, "%s%s", prefix
, pathName
);
52 sprintf(buf
, "%s/%s", prefix
, pathName
);
57 handle
= dlopen(buf
, RTLD_LAZY
);
60 Jim_SetResultFormatted(interp
, "error loading extension \"%s\": %s", pathName
,
67 /* Now, we use a unique init symbol depending on the extension name.
68 * This is done for compatibility between static and dynamic extensions.
69 * For extension readline.so, the init symbol is "Jim_readlineInit"
77 pt
= strrchr(pathName
, '/');
84 pt
= strchr(pkgname
, '.');
86 pkgnamelen
= pt
- pkgname
;
89 pkgnamelen
= strlen(pkgname
);
91 snprintf(initsym
, sizeof(initsym
), "Jim_%.*sInit", pkgnamelen
, pkgname
);
93 if ((onload
= dlsym(handle
, initsym
)) == NULL
) {
94 Jim_SetResultFormatted(interp
,
95 "No %s symbol found in extension %s", initsym
, pathName
);
99 if (onload(interp
) == JIM_ERR
) {
103 Jim_SetEmptyResult(interp
);
104 if (libPathObjPtr
!= NULL
)
105 Jim_DecrRefCount(interp
, libPathObjPtr
);
109 if (libPathObjPtr
!= NULL
)
110 Jim_DecrRefCount(interp
, libPathObjPtr
);
113 #else /* JIM_DYNLIB */
114 int Jim_LoadLibrary(Jim_Interp
*interp
, const char *pathName
)
117 JIM_NOTUSED(pathName
);
119 Jim_SetResultString(interp
, "the Jim binary has no support for [load]", -1);
122 #endif /* JIM_DYNLIB */
125 static int Jim_LoadCoreCommand(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
128 Jim_WrongNumArgs(interp
, 1, argv
, "libaryFile");
131 return Jim_LoadLibrary(interp
, Jim_GetString(argv
[1], NULL
));
134 int Jim_loadInit(Jim_Interp
*interp
)
136 Jim_CreateCommand(interp
, "load", Jim_LoadCoreCommand
, NULL
, NULL
);