X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/e2ab7927bfab05cb08b611ec8827258a395b72ae..9bc6fb0a7d91ae9a6c57cedb76022043db413ba5:/libguile/extensions.c diff --git a/libguile/extensions.c b/libguile/extensions.c index 3d4f7d8cd..83bcee2a1 100644 --- a/libguile/extensions.c +++ b/libguile/extensions.c @@ -41,6 +41,8 @@ * whether to permit this exception to apply to your modifications. * If you do not wish that, delete this exception notice. */ +#include + #include "libguile/_scm.h" #include "libguile/strings.h" #include "libguile/gc.h" @@ -48,24 +50,36 @@ #include "libguile/extensions.h" -struct extension { - struct extension *next; +typedef struct extension_t +{ + struct extension_t *next; const char *lib; const char *init; void (*func)(void *); void *data; -}; +} extension_t; -static struct extension *registered_extensions; +static extension_t *registered_extensions; + +/* Register a LIB/INIT pair for use by `scm_load_extension'. LIB is + allowed to be NULL and then only INIT is used to identify the + registered entry. This is useful when you don't know the library + name (which isn't really relevant anyway in a completely linked + program) and you are sure that INIT is unique (which it must be for + static linking). Hmm, given this reasoning, what use is LIB + anyway? +*/ void scm_c_register_extension (const char *lib, const char *init, void (*func) (void *), void *data) { - struct extension *ext = scm_must_malloc (sizeof(struct extension), - "scm_register_extension"); - ext->lib = scm_must_strdup (lib); - ext->init = scm_must_strdup (init); + extension_t *ext = scm_malloc (sizeof(extension_t)); + if (lib) + ext->lib = scm_strdup (lib); + else + ext->lib = NULL; + ext->init = scm_strdup (init); ext->func = func; ext->data = data; @@ -78,10 +92,10 @@ load_extension (SCM lib, SCM init) { /* Search the registry. */ { - struct extension *ext; + extension_t *ext; for (ext = registered_extensions; ext; ext = ext->next) - if (!strcmp (ext->lib, SCM_STRING_CHARS (lib)) + if ((ext->lib == NULL || !strcmp (ext->lib, SCM_STRING_CHARS (lib))) && !strcmp (ext->init, SCM_STRING_CHARS (init))) { ext->func (ext->data); @@ -102,36 +116,40 @@ scm_c_load_extension (const char *lib, const char *init) SCM_DEFINE (scm_load_extension, "load-extension", 2, 0, 0, (SCM lib, SCM init), - "Load and initilize the extension designated by LIB and INIT." -"When there is no pre-registered function for LIB/INIT, this is " -"equivalent to " -" " -" (dynamic-call INIT (dynamic-link LIB)) " -" " -"When there is a pre-registered function, that function is called " -"instead. " -" " -"Normally, there is no pre-registered function. This option exists " -"only for situations where dynamic linking is unavailable or unwanted. " -"In that case, you would statically link your program with the desired " -"library, and register its init function right after Guile has been " -"initialized. " -" " -"LIB should be a string denoting a shared library without any file type " -"suffix such as \".so\". The suffix is provided automatically. It " -"should also not contain any directory components. Libraries that " -"implement Guile Extensions should be put into the normal locations for " -"shared libraries. We recommend to use the naming convention " -"libguile-bla-blum for a extension related to a module `(bla blum)'. " -" " -"The normal way for a extension to be used is to write a small Scheme " -"file that defines a module, and to load the extension into this " -"module. When the module is auto-loaded, the extension is loaded as " -"well. For example, " -" " -" (define-module (bla blum)) " -" " -" (load-extension \"libguile-bla-blum\" \"bla_init_blum\")") + "Load and initialize the extension designated by LIB and INIT.\n" + "When there is no pre-registered function for LIB/INIT, this is\n" + "equivalent to\n" + "\n" + "@lisp\n" + "(dynamic-call INIT (dynamic-link LIB))\n" + "@end lisp\n" + "\n" + "When there is a pre-registered function, that function is called\n" + "instead.\n" + "\n" + "Normally, there is no pre-registered function. This option exists\n" + "only for situations where dynamic linking is unavailable or unwanted.\n" + "In that case, you would statically link your program with the desired\n" + "library, and register its init function right after Guile has been\n" + "initialized.\n" + "\n" + "LIB should be a string denoting a shared library without any file type\n" + "suffix such as \".so\". The suffix is provided automatically. It\n" + "should also not contain any directory components. Libraries that\n" + "implement Guile Extensions should be put into the normal locations for\n" + "shared libraries. We recommend to use the naming convention\n" + "libguile-bla-blum for a extension related to a module `(bla blum)'.\n" + "\n" + "The normal way for a extension to be used is to write a small Scheme\n" + "file that defines a module, and to load the extension into this\n" + "module. When the module is auto-loaded, the extension is loaded as\n" + "well. For example,\n" + "\n" + "@lisp\n" + "(define-module (bla blum))\n" + "\n" + "(load-extension \"libguile-bla-blum\" \"bla_init_blum\")\n" + "@end lisp") #define FUNC_NAME s_scm_load_extension { SCM_VALIDATE_STRING (1, lib);