[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] dynamic-modules 3f762bd 02/22: add `load-module' function
From: |
Teodor Zlatanov |
Subject: |
[Emacs-diffs] dynamic-modules 3f762bd 02/22: add `load-module' function to emacs lisp. |
Date: |
Thu, 27 Nov 2014 02:01:48 +0000 |
branch: dynamic-modules
commit 3f762bd2f94da9d972af23007830e1fb9bf2f69c
Author: Aurélien Aptel <address@hidden>
Date: Tue Nov 18 23:11:57 2014 +0100
add `load-module' function to emacs lisp.
a) load compiled module
b) check for plugin_is_GPL_compatible symbol
c) run module's init() function
---
src/lread.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/lread.c b/src/lread.c
index 6f71ff5..d08d898 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -64,6 +64,10 @@ along with GNU Emacs. If not, see
<http://www.gnu.org/licenses/>. */
#define file_tell ftell
#endif
+#ifdef HAVE_LTDL
+#include <ltdl.h>
+#endif
+
/* Hash table read constants. */
static Lisp_Object Qhash_table, Qdata;
static Lisp_Object Qtest;
@@ -998,6 +1002,49 @@ This uses the variables `load-suffixes' and
`load-file-rep-suffixes'. */)
return Fnreverse (lst);
}
+DEFUN ("load-module", Fload_module, Sload_module, 1, 1, 0,
+ doc: /* Dymamically load a compiled module. */)
+ (Lisp_Object file)
+{
+#ifdef HAVE_LTDL
+ static int lt_init_done = 0;
+ lt_dlhandle handle;
+ void (*module_init) ();
+ void *gpl_sym;
+
+ if (!lt_init_done)
+ {
+ int ret = lt_dlinit ();
+ if (ret)
+ {
+ const char* s = lt_dlerror ();
+ error ("ltdl init fail: %s", s);
+ }
+ lt_init_done = 1;
+ }
+
+ CHECK_STRING (file);
+
+ handle = lt_dlopen (SDATA (file));
+ if (!handle)
+ error ("Cannot load file %s", SDATA (file));
+
+ gpl_sym = lt_dlsym (handle, "plugin_is_GPL_compatible");
+ if (!gpl_sym)
+ error ("Module %s is not GPL compatible", SDATA (file));
+
+ module_init = (void (*) ()) lt_dlsym (handle, "init");
+ if (!module_init)
+ error ("Module %s does not have an init function.", SDATA (file));
+
+ module_init ();
+
+ return Qt;
+#else
+ return Qnil;
+#endif
+}
+
DEFUN ("load", Fload, Sload, 1, 5, 0,
doc: /* Execute a file of Lisp code named FILE.
First try FILE with `.elc' appended, then try with `.el',
@@ -4491,6 +4538,7 @@ syms_of_lread (void)
defsubr (&Sget_file_char);
defsubr (&Smapatoms);
defsubr (&Slocate_file_internal);
+ defsubr (&Sload_module);
DEFVAR_LISP ("obarray", Vobarray,
doc: /* Symbol table for use by `intern' and `read'.
- [Emacs-diffs] branch dynamic-modules created (now 9313182), Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules 14ea9e0 03/22: intern literal strings as regular string., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules 3f762bd 02/22: add `load-module' function to emacs lisp.,
Teodor Zlatanov <=
- [Emacs-diffs] dynamic-modules 5c710fb 01/22: add libltdl configure option/dependency., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules 2010646 04/22: add sample module `fmod'., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules 1be03fd 08/22: doc.c: don't prefix doc path by ../etc/ for modules, Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules fa450f8 07/22: doc.c: use DOC format sanity checks instead of bytecompiled checks on module doc files., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules d2271bc 06/22: alloc.c: protect doc field from GC., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules cc5fe95 09/22: move fmod module in modules/fmod/., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules c0eb5a6 05/22: change Subr doc field from char* to Lisp_Object., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules e374b97 11/22: opaque: add comments., Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules 1be7b68 10/22: new module: opaque, Teodor Zlatanov, 2014/11/26
- [Emacs-diffs] dynamic-modules db69d49 12/22: new module: elisp, Teodor Zlatanov, 2014/11/26