comparison src/dll.c @ 265:8efd647ea9ca r20-5b31

Import from CVS: tag r20-5b31
author cvs
date Mon, 13 Aug 2007 10:25:37 +0200
parents
children c5d627a313b1
comparison
equal deleted inserted replaced
264:682d2a9d41a5 265:8efd647ea9ca
1 /* Lisp interface to dynamic loading.
2 Copyright (C) 1998 Joshua Rowe.
3 Additional cleanup by Hrvoje Niksic.
4
5 This file is part of XEmacs.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 /* Synched up with: Not in FSF. */
23
24 /* A shared object may have the following symbols defined:
25 syms_of
26 vars_of
27 complex_vars_of
28 They are called in that order. Each takes and returns void
29 arguments.
30
31 All of this needs lots and LOTS of work. Some things to work on:
32
33 1) A good foreign interface. We probably need to get rid of
34 syms_of and similar junk, and define a more normal interfacing to
35 the outside world, e.g. an init_emacs_module() function. See below
36 for more discussion about it. Also, we need a modules/ directory
37 with a few nice sample modules, a sample Makefile, etc. so people
38 can start hacking.
39
40 2) I'm getting coredumps very often -- practically every time I
41 compile without USE_MINIMAL_TAGBITS, and even with it sometimes. I
42 wasn't able to resolve these.
43
44 3) All of this is sooo simple-minded. As it gets more complex,
45 we'll have to look at how others have done similar things
46 (e.g. Perl and Zsh 3.1), to avoid botching it up. */
47
48 #include <config.h>
49 #include "lisp.h"
50 #include "emacsfns.h"
51 #include "buffer.h"
52
53 #include <stdio.h>
54 #include "sysdll.h"
55 #include <errno.h>
56
57
58 DEFUN ("dll-open", Fdll_open, 1, 1, "FShared object: ", /*
59 Load LIBRARY as a shared object file.
60
61 After the LIBRARY is dynamically linked with the executable, the
62 following functions are called:
63
64 syms_of(), containing definitions of symbols and subr's;
65 vars_of(), containing definitions of variables;
66 complex_vars_of(), containing complex definitions of variables.
67
68 After this point, any lisp symbols defined in the shared object are
69 available for use.
70 */
71 (library))
72 {
73 /* This function can GC */
74 dll_handle *handle;
75 char *file;
76 void (*function)();
77
78 CHECK_STRING (library);
79 library = Fexpand_file_name (library, Qnil);
80
81 file = XSTRING_DATA (library);
82 /* #### Is this right? */
83 GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (file, file);
84
85 handle = dll_open (file);
86 if (handle == NULL)
87 {
88 signal_error (Qerror,
89 list3 (build_translated_string ("Cannot load shared library"),
90 library, build_translated_string (dll_error (handle))));
91 }
92
93 /* #### This looks unnecessary here, because at this time one
94 initialization function is fully sufficient. However, I am not
95 removing this support, since we may wish to add mechanisms for
96 static linking, which would have invoke these function via normal
97 paths.
98
99 #### But then this is not sufficient, because one could as well
100 honor specifier_vars_of_foo(), etc. Maybe we should scrap it
101 after all.
102
103 #### What if one of the first two functions signal an error?
104 Should we take care to execute the other two? My fingers are
105 getting itchy! */
106
107 function = dll_function (handle, "syms_of");
108 if (function)
109 (*function) ();
110
111 function = dll_function (handle, "vars_of");
112 if (function)
113 (*function) ();
114
115 function = dll_function (handle, "complex_vars_of");
116 if (function)
117 (*function) ();
118
119 return Qnil;
120 }
121
122 void syms_of_dll ()
123 {
124 DEFSUBR (Fdll_open);
125 }