diff options
author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2014-12-02 16:17:10 -0500 |
---|---|---|
committer | Ted Zlatanov <tzz@lifelogs.com> | 2014-12-04 19:54:16 -0500 |
commit | ae901ddbfff04e8b1b0d63c452a6ca3f4c81fb17 (patch) | |
tree | b806504944c633be45255321d1203bbcc2504781 /modules/opaque/opaque.c | |
parent | dd601050e7db69f322eea09d99751d8e6363b153 (diff) | |
download | emacs-dynamic-modules-rc2.tar.gz |
Add external modulesold-branches/dynamic-modules-rc2dynamic-modules-rc2
* configure.ac: Add libtool support and module Makefiles.
* src/Makefile.in: Support libtool.
* src/alloc.c (mark_object): Mark the doc field of Lisp_Subr as object.
* src/doc.c (doc_is_from_module_p, get_doc_string, reread_doc_file)
(store_function_docstring, build_file_p, Fsnarf_documentation):
Support docstrings for external modules.
* src/lisp.h: Make the doc field of Lisp_Subr a Lisp_Object.
* src/lread.c (Fget_load_suffixes, Fload_module, string_suffixes_p)
(string_suffix_p, Fload, intern_c_string_1, defsubr)
(syms_of_lread): Add loading of external modules and the
docstrings of their functions.
* modules/curl: New module.
* modules/elisp: New module.
* modules/fmod: New module.
* modules/opaque: New module.
* modules/yaml: New module.
Diffstat (limited to 'modules/opaque/opaque.c')
-rw-r--r-- | modules/opaque/opaque.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/modules/opaque/opaque.c b/modules/opaque/opaque.c new file mode 100644 index 00000000000..2366b2ed2e9 --- /dev/null +++ b/modules/opaque/opaque.c @@ -0,0 +1,64 @@ +#include <config.h> +#include <lisp.h> + +int plugin_is_GPL_compatible; +static Lisp_Object Qopaque; + +struct opaque +{ + int a, b, c; +}; + +static Lisp_Object Qa, Qb, Qc; + +EXFUN (Fopaque_make, 3); +DEFUN ("opaque-make", Fopaque_make, Sopaque_make, 3, 3, 0, + doc: "Make opaque type.") + (Lisp_Object a, Lisp_Object b, Lisp_Object c) +{ + struct opaque *p = malloc (sizeof (*p)); + p->a = XINT (a); + p->b = XINT (b); + p->c = XINT (c); + + /* + store p as a the first slot (index 0) of a Lisp_Save_Value (which + is a Lisp_Misc) + */ + return make_save_ptr ((void*)p); +} + +EXFUN (Fopaque_free, 1); +DEFUN ("opaque-free", Fopaque_free, Sopaque_free, 1, 1, 0, + doc: "Free opaque object OBJ.") + (Lisp_Object obj) +{ + /* the pointer is in the first slot (index 0) */ + free (XSAVE_POINTER (obj, 0)); + return Qnil; +} + +EXFUN (Fopaque_get, 2); +DEFUN ("opaque-get", Fopaque_get, Sopaque_get, 2, 2, 0, + doc: "Return the field F (`a', `b', `c') of the opaque object OBJ.") + (Lisp_Object obj, Lisp_Object f) +{ + struct opaque *p = XSAVE_POINTER (obj, 0); + int val = EQ (f, Qa) ? p->a : EQ (f, Qb) ? p->b : EQ (f, Qc) ? p->c : -1; + return make_number (val); +} + +void init () +{ + DEFSYM (Qopaque, "opaque"); + + DEFSYM (Qa, "a"); + DEFSYM (Qb, "b"); + DEFSYM (Qc, "c"); + + defsubr (&Sopaque_make); + defsubr (&Sopaque_free); + defsubr (&Sopaque_get); + + Fprovide (Qopaque, Qnil); +} |