Mercurial > hg > xemacs-beta
annotate src/emodules.c @ 4952:19a72041c5ed
Mule-izing, various fixes related to char * arguments
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (print_pgresult):
* postgresql/postgresql.c (Fpq_conn_defaults):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_result_status):
* postgresql/postgresql.c (Fpq_res_status):
Mule-ize large parts of it.
2010-01-26 Ben Wing <ben@xemacs.org>
* ldap/eldap.c (print_ldap):
* ldap/eldap.c (allocate_ldap):
Use write_ascstring().
src/ChangeLog addition:
2010-01-26 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (build_ascstring):
* alloc.c (build_msg_cistring):
* alloc.c (staticpro_1):
* alloc.c (staticpro_name):
* alloc.c (staticpro_nodump_1):
* alloc.c (staticpro_nodump_name):
* alloc.c (unstaticpro_nodump_1):
* alloc.c (mcpro_1):
* alloc.c (mcpro_name):
* alloc.c (object_memory_usage_stats):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c (print_buffer):
* buffer.c (vars_of_buffer):
* buffer.c (common_init_complex_vars_of_buffer):
* buffer.c (init_initial_directory):
* bytecode.c (invalid_byte_code):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* chartab.c (print_table_entry):
* chartab.c (print_char_table):
* config.h.in:
* console-gtk.c:
* console-gtk.c (gtk_device_to_console_connection):
* console-gtk.c (gtk_semi_canonicalize_console_connection):
* console-gtk.c (gtk_canonicalize_console_connection):
* console-gtk.c (gtk_semi_canonicalize_device_connection):
* console-gtk.c (gtk_canonicalize_device_connection):
* console-stream.c (stream_init_frame_1):
* console-stream.c (vars_of_console_stream):
* console-stream.c (init_console_stream):
* console-x.c (x_semi_canonicalize_console_connection):
* console-x.c (x_semi_canonicalize_device_connection):
* console-x.c (x_canonicalize_device_connection):
* console-x.h:
* data.c (eq_with_ebola_notice):
* data.c (Fsubr_interactive):
* data.c (Fnumber_to_string):
* data.c (digit_to_number):
* device-gtk.c (gtk_init_device):
* device-msw.c (print_devmode):
* device-x.c (x_event_name):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-msw.c (vars_of_dialog_mswindows):
* doc.c (weird_doc):
* doc.c (Fsnarf_documentation):
* doc.c (vars_of_doc):
* dumper.c (pdump):
* dynarr.c:
* dynarr.c (Dynarr_realloc):
* editfns.c (Fuser_real_login_name):
* editfns.c (get_home_directory):
* elhash.c (print_hash_table_data):
* elhash.c (print_hash_table):
* emacs.c (main_1):
* emacs.c (vars_of_emacs):
* emodules.c:
* emodules.c (_emodules_list):
* emodules.c (Fload_module):
* emodules.c (Funload_module):
* emodules.c (Flist_modules):
* emodules.c (find_make_module):
* emodules.c (attempt_module_delete):
* emodules.c (emodules_load):
* emodules.c (emodules_doc_subr):
* emodules.c (emodules_doc_sym):
* emodules.c (syms_of_module):
* emodules.c (vars_of_module):
* emodules.h:
* eval.c (print_subr):
* eval.c (signal_call_debugger):
* eval.c (build_error_data):
* eval.c (signal_error):
* eval.c (maybe_signal_error):
* eval.c (signal_continuable_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (signal_error_2):
* eval.c (maybe_signal_error_2):
* eval.c (signal_continuable_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (signal_ferror):
* eval.c (maybe_signal_ferror):
* eval.c (signal_continuable_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (signal_ferror_with_frob):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (signal_continuable_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (syntax_error):
* eval.c (syntax_error_2):
* eval.c (maybe_syntax_error):
* eval.c (sferror):
* eval.c (sferror_2):
* eval.c (maybe_sferror):
* eval.c (invalid_argument):
* eval.c (invalid_argument_2):
* eval.c (maybe_invalid_argument):
* eval.c (invalid_constant):
* eval.c (invalid_constant_2):
* eval.c (maybe_invalid_constant):
* eval.c (invalid_operation):
* eval.c (invalid_operation_2):
* eval.c (maybe_invalid_operation):
* eval.c (invalid_change):
* eval.c (invalid_change_2):
* eval.c (maybe_invalid_change):
* eval.c (invalid_state):
* eval.c (invalid_state_2):
* eval.c (maybe_invalid_state):
* eval.c (wtaerror):
* eval.c (stack_overflow):
* eval.c (out_of_memory):
* eval.c (print_multiple_value):
* eval.c (issue_call_trapping_problems_warning):
* eval.c (backtrace_specials):
* eval.c (backtrace_unevalled_args):
* eval.c (Fbacktrace):
* eval.c (warn_when_safe):
* event-Xt.c (modwarn):
* event-Xt.c (modbarf):
* event-Xt.c (check_modifier):
* event-Xt.c (store_modifier):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (describe_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (store_modifier):
* event-gtk.c (gtk_reset_modifier_mapping):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (FROB):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-stream.c (external_debugging_print_event):
* event-stream.c (execute_help_form):
* event-stream.c (vars_of_event_stream):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* faces.c (print_face):
* faces.c (complex_vars_of_faces):
* file-coding.c:
* file-coding.c (print_coding_system):
* file-coding.c (print_coding_system_in_print_method):
* file-coding.c (default_query_method):
* file-coding.c (find_coding_system):
* file-coding.c (make_coding_system_1):
* file-coding.c (chain_print):
* file-coding.c (undecided_print):
* file-coding.c (gzip_print):
* file-coding.c (vars_of_file_coding):
* file-coding.c (complex_vars_of_file_coding):
* fileio.c:
* fileio.c (report_file_type_error):
* fileio.c (report_error_with_errno):
* fileio.c (report_file_error):
* fileio.c (barf_or_query_if_file_exists):
* fileio.c (vars_of_fileio):
* floatfns.c (matherr):
* fns.c (print_bit_vector):
* fns.c (Fmapconcat):
* fns.c (add_suffix_to_symbol):
* fns.c (add_prefix_to_symbol):
* frame-gtk.c:
* frame-gtk.c (Fgtk_window_id):
* frame-x.c (def):
* frame-x.c (x_cde_transfer_callback):
* frame.c:
* frame.c (Fmake_frame):
* gc.c (show_gc_cursor_and_message):
* gc.c (vars_of_gc):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (gtk_print_image_instance):
* glyphs-msw.c (mswindows_print_image_instance):
* glyphs-x.c (x_print_image_instance):
* glyphs-x.c (update_widget_face):
* glyphs.c (make_string_from_file):
* glyphs.c (print_image_instance):
* glyphs.c (signal_image_error):
* glyphs.c (signal_image_error_2):
* glyphs.c (signal_double_image_error):
* glyphs.c (signal_double_image_error_2):
* glyphs.c (xbm_mask_file_munging):
* glyphs.c (pixmap_to_lisp_data):
* glyphs.h:
* gui.c (gui_item_display_flush_left):
* hpplay.c (player_error_internal):
* hpplay.c (myHandler):
* intl-win32.c:
* intl-win32.c (langcode_to_lang):
* intl-win32.c (sublangcode_to_lang):
* intl-win32.c (Fmswindows_get_locale_info):
* intl-win32.c (lcid_to_locale_mule_or_no):
* intl-win32.c (mswindows_multibyte_to_unicode_print):
* intl-win32.c (complex_vars_of_intl_win32):
* keymap.c:
* keymap.c (print_keymap):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fkey_description):
* keymap.c (Ftext_char_description):
* lisp.h:
* lisp.h (struct):
* lisp.h (DECLARE_INLINE_HEADER):
* lread.c (Fload_internal):
* lread.c (locate_file):
* lread.c (read_escape):
* lread.c (read_raw_string):
* lread.c (read1):
* lread.c (read_list):
* lread.c (read_compiled_function):
* lread.c (init_lread):
* lrecord.h:
* marker.c (print_marker):
* marker.c (marker_equal):
* menubar-msw.c (displayable_menu_item):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar.c (vars_of_menubar):
* minibuf.c (reinit_complex_vars_of_minibuf):
* minibuf.c (complex_vars_of_minibuf):
* mule-charset.c (Fmake_charset):
* mule-charset.c (complex_vars_of_mule_charset):
* mule-coding.c (iso2022_print):
* mule-coding.c (fixed_width_query):
* number.c (bignum_print):
* number.c (ratio_print):
* number.c (bigfloat_print):
* number.c (bigfloat_finalize):
* objects-msw.c:
* objects-msw.c (mswindows_color_to_string):
* objects-msw.c (mswindows_color_list):
* objects-tty.c:
* objects-tty.c (tty_font_list):
* objects-tty.c (tty_find_charset_font):
* objects-xlike-inc.c (xft_find_charset_font):
* objects-xlike-inc.c (endif):
* print.c:
* print.c (write_istring):
* print.c (write_ascstring):
* print.c (Fterpri):
* print.c (Fprint):
* print.c (print_error_message):
* print.c (print_vector_internal):
* print.c (print_cons):
* print.c (print_string):
* print.c (printing_unreadable_object):
* print.c (print_internal):
* print.c (print_float):
* print.c (print_symbol):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_canonicalize_host_name):
* process-unix.c (unix_canonicalize_host_name):
* process.c (print_process):
* process.c (report_process_error):
* process.c (report_network_error):
* process.c (make_process_internal):
* process.c (Fstart_process_internal):
* process.c (status_message):
* process.c (putenv_internal):
* process.c (vars_of_process):
* process.h:
* profile.c (vars_of_profile):
* rangetab.c (print_range_table):
* realpath.c (vars_of_realpath):
* redisplay.c (vars_of_redisplay):
* search.c (wordify):
* search.c (Freplace_match):
* sheap.c (sheap_adjust_h):
* sound.c (report_sound_error):
* sound.c (Fplay_sound_file):
* specifier.c (print_specifier):
* symbols.c (Fsubr_name):
* symbols.c (do_symval_forwarding):
* symbols.c (set_default_buffer_slot_variable):
* symbols.c (set_default_console_slot_variable):
* symbols.c (store_symval_forwarding):
* symbols.c (default_value):
* symbols.c (defsymbol_massage_name_1):
* symbols.c (defsymbol_massage_name_nodump):
* symbols.c (defsymbol_massage_name):
* symbols.c (defsymbol_massage_multiword_predicate_nodump):
* symbols.c (defsymbol_massage_multiword_predicate):
* symbols.c (defsymbol_nodump):
* symbols.c (defsymbol):
* symbols.c (defkeyword):
* symbols.c (defkeyword_massage_name):
* symbols.c (check_module_subr):
* symbols.c (deferror_1):
* symbols.c (deferror):
* symbols.c (deferror_massage_name):
* symbols.c (deferror_massage_name_and_message):
* symbols.c (defvar_magic):
* symeval.h:
* symeval.h (DEFVAR_SYMVAL_FWD):
* sysdep.c:
* sysdep.c (init_system_name):
* sysdll.c:
* sysdll.c (MAYBE_PREPEND_UNDERSCORE):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (dll_error):
* sysdll.c (dll_open):
* sysdll.c (dll_close):
* sysdll.c (image_for_address):
* sysdll.c (my_find_image):
* sysdll.c (search_linked_libs):
* sysdll.h:
* sysfile.h:
* sysfile.h (DEFAULT_DIRECTORY_FALLBACK):
* syswindows.h:
* tests.c (DFC_CHECK_LENGTH):
* tests.c (DFC_CHECK_CONTENT):
* tests.c (Ftest_hash_tables):
* text.c (vars_of_text):
* text.h:
* tooltalk.c (tt_opnum_string):
* tooltalk.c (tt_message_arg_ival_string):
* tooltalk.c (Ftooltalk_default_procid):
* tooltalk.c (Ftooltalk_default_session):
* tooltalk.c (init_tooltalk):
* tooltalk.c (vars_of_tooltalk):
* ui-gtk.c (Fdll_load):
* ui-gtk.c (type_to_marshaller_type):
* ui-gtk.c (Fgtk_import_function_internal):
* ui-gtk.c (emacs_gtk_object_printer):
* ui-gtk.c (emacs_gtk_boxed_printer):
* unicode.c (unicode_to_ichar):
* unicode.c (unicode_print):
* unicode.c (unicode_query):
* unicode.c (vars_of_unicode):
* unicode.c (complex_vars_of_unicode):
* win32.c:
* win32.c (mswindows_report_process_error):
* window.c (print_window):
* xemacs.def.in.in:
BASIC IDEA: Further fixing up uses of char * and CIbyte *
to reflect their actual semantics; Mule-izing some code;
redoing of the not-yet-working code to handle message translation.
Clean up code to handle message-translation (not yet working).
Create separate versions of build_msg_string() for working with
Ibyte *, CIbyte *, and Ascbyte * arguments. Assert that Ascbyte *
arguments are pure-ASCII. Make build_msg_string() be the same
as build_msg_ascstring(). Create same three versions of GETTEXT()
and DEFER_GETTEXT(). Also create build_defer_string() and
variants for the equivalent of DEFER_GETTEXT() when building a
string. Remove old CGETTEXT(). Clean up code where GETTEXT(),
DEFER_GETTEXT(), build_msg_string(), etc. was being called and
introduce some new calls to build_msg_string(), etc. Remove
GETTEXT() from calls to weird_doc() -- we assume that the
message snarfer knows about weird_doc(). Remove uses of
DEFER_GETTEXT() from error messages in sysdep.c and instead use
special comments /* @@@begin-snarf@@@ */ and /* @@@end-snarf@@@ */
that the message snarfer presumably knows about.
Create build_ascstring() and use it in many instances in place
of build_string(). The purpose of having Ascbyte * variants is
to make the code more self-documenting in terms of what sort of
semantics is expected for char * strings. In fact in the process
of looking for uses of build_string(), much improperly Mule-ized
was discovered.
Mule-ize a lot of code as described in previous paragraph,
e.g. in sysdep.c.
Make the error functions take Ascbyte * strings and fix up a
couple of places where non-pure-ASCII strings were being passed in
(file-coding.c, mule-coding.c, unicode.c). (It's debatable whether
we really need to make the error functions work this way. It
helps catch places where code is written in a way that message
translation won't work, but we may well never implement message
translation.)
Make staticpro() and friends take Ascbyte * strings instead of
raw char * strings. Create a const_Ascbyte_ptr dynarr type
to describe what's held by staticpro_names[] and friends,
create pdump descriptions for const_Ascbyte_ptr dynarrs, and
use them in place of specially-crafted staticpro descriptions.
Mule-ize certain other functions (e.g. x_event_name) by correcting
raw use of char * to Ascbyte *, Rawbyte * or another such type,
and raw use of char[] buffers to another type (usually Ascbyte[]).
Change many uses of write_c_string() to write_msg_string(),
write_ascstring(), etc.
Mule-ize emodules.c, emodules.h, sysdll.h.
Fix some un-Mule-ized code in intl-win32.c.
A comment in event-Xt.c and the limitations of the message
snarfer (make-msgfile or whatever) is presumably incorrect --
it should be smart enough to handle function calls spread over
more than one line. Clean up code in event-Xt.c that was
written awkwardly for this reason.
In config.h.in, instead of NEED_ERROR_CHECK_TYPES_INLINES,
create a more general XEMACS_DEFS_NEEDS_INLINE_DECLS to
indicate when inlined functions need to be declared in
xemacs.defs.in.in, and make use of it in xemacs.defs.in.in.
We need to do this because postgresql.c now calls qxestrdup(),
which is an inline function.
Make nconc2() and other such functions MODULE_API and put
them in xemacs.defs.in.in since postgresql.c now uses them.
Clean up indentation in lread.c and a few other places.
In text.h, document ASSERT_ASCTEXT_ASCII() and
ASSERT_ASCTEXT_ASCII_LEN(), group together the stand-in
encodings and add some more for DLL symbols, function and
variable names, etc.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Tue, 26 Jan 2010 23:22:30 -0600 |
parents | 726060ee587c |
children | 304aebb79cd3 |
rev | line source |
---|---|
428 | 1 /* emodules.c - Support routines for dynamic module loading |
2 (C) Copyright 1998, 1999 J. Kean Johnston. All rights reserved. | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
3 (C) Copyright 2010 Ben Wing. |
428 | 4 |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; 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 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
22 /* This file has been Mule-ized, Ben Wing, 1-26-10. */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
23 |
428 | 24 #include "emodules.h" |
25 #include "sysdll.h" | |
2078 | 26 #ifdef HAVE_LTDL |
27 #include <ltdl.h> | |
28 #endif | |
428 | 29 |
1750 | 30 /* Load path */ |
31 static Lisp_Object Vmodule_load_path; | |
32 | |
33 /* Module lFile extensions */ | |
34 static Lisp_Object Vmodule_extensions; | |
35 | |
428 | 36 #ifdef HAVE_SHLIB |
37 | |
38 /* CE-Emacs version number */ | |
39 Lisp_Object Vmodule_version; | |
40 | |
41 /* Do we do our work quietly? */ | |
42 int load_modules_quietly; | |
43 | |
996 | 44 /* Set this while unloading a module. This should NOT be made set by users, |
45 as it allows the unbinding of symbol-value-forward variables. */ | |
46 int unloading_module; | |
47 | |
564 | 48 Lisp_Object Qdll_error; |
996 | 49 Lisp_Object Qmodule, Qunload_module, module_tag; |
564 | 50 |
428 | 51 typedef struct _emodules_list |
52 { | |
996 | 53 int used; /* Is this slot used? */ |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
54 Ibyte *soname; /* Name of the shared object loaded (full path) */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
55 Ibyte *modname; /* The name of the module */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
56 Ibyte *modver; /* The module version string */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
57 Ibyte *modtitle; /* How the module announces itself */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
58 void (*unload) (void);/* Module cleanup function to run before unloading */ |
996 | 59 dll_handle dlhandle; /* Dynamic lib handle */ |
428 | 60 } emodules_list; |
61 | |
62 static int emodules_depth; | |
63 static dll_handle dlhandle; | |
64 static emodules_list *modules; | |
65 static int modnum; | |
66 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
67 static int find_make_module (Lisp_Object mod, const Ibyte *name, |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
68 const Ibyte *ver, int make_or_find); |
428 | 69 static Lisp_Object module_load_unwind (Lisp_Object); |
70 static void attempt_module_delete (int mod); | |
71 | |
72 DEFUN ("load-module", Fload_module, 1, 3, "FLoad dynamic module: ", /* | |
73 Load in a C Emacs Extension module named FILE. | |
74 The optional NAME and VERSION are used to identify specific modules. | |
75 | |
996 | 76 DO NOT USE THIS FUNCTION in your programs. Use `require' instead. |
77 | |
428 | 78 This function is similar in intent to `load' except that it loads in |
79 pre-compiled C or C++ code, using dynamic shared objects. If NAME is | |
80 specified, then the module is only loaded if its internal name matches | |
81 the NAME specified. If VERSION is specified, then the module is only | |
82 loaded if it matches that VERSION. This function will check to make | |
83 sure that the same module is not loaded twice. Modules are searched | |
84 for in the same way as Lisp files, except that the valid file | |
1632 | 85 extensions are `.so', `.dll', `.ell', or `.dylib'. |
428 | 86 |
87 All symbols in the shared module must be completely resolved in order | |
88 for this function to be successful. Any modules which the specified | |
89 FILE depends on will be automatically loaded. You can determine which | |
90 modules have been loaded as dynamic shared objects by examining the | |
91 return value of the function `list-modules'. | |
92 | |
996 | 93 It is possible, although unwise, to unload modules using `unload-feature'. |
442 | 94 The preferred mechanism for unloading or reloading modules is to quit |
428 | 95 XEmacs, and then reload those new or changed modules that are required. |
96 | |
97 Messages informing you of the progress of the load are displayed unless | |
98 the variable `load-modules-quietly' is non-NIL. | |
99 */ | |
444 | 100 (file, name, version)) |
428 | 101 { |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
102 const Ibyte *mod, *mname, *mver; |
428 | 103 int speccount = specpdl_depth(); |
104 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
105 CHECK_STRING (file); |
428 | 106 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
107 mod = XSTRING_DATA (file); |
428 | 108 |
109 if (NILP (name)) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
110 mname = (const Ibyte *) ""; |
428 | 111 else |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
112 mname = XSTRING_DATA (name); |
428 | 113 |
114 if (NILP (version)) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
115 mver = (const Ibyte *) ""; |
428 | 116 else |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
117 mver = XSTRING_DATA (version); |
428 | 118 |
119 dlhandle = 0; | |
120 record_unwind_protect (module_load_unwind, make_int(modnum)); | |
121 emodules_load (mod, mname, mver); | |
771 | 122 unbind_to (speccount); |
428 | 123 |
124 return Qt; | |
125 } | |
126 | |
996 | 127 DEFUN ("unload-module", Funload_module, 1, 3, 0, /* |
128 Unload a module previously loaded with load-module. | |
428 | 129 |
996 | 130 DO NOT USE THIS FUNCTION in your programs. Use `unload-feature' instead. |
428 | 131 |
132 As with load-module, this function requires at least the module FILE, and | |
133 optionally the module NAME and VERSION to unload. It may not be possible | |
134 for the module to be unloaded from memory, as there may be Lisp objects | |
442 | 135 referring to variables inside the module code. However, once you have |
428 | 136 requested a module to be unloaded, it will be unloaded from memory as |
137 soon as the last reference to symbols within the module is destroyed. | |
138 */ | |
444 | 139 (file, name, version)) |
428 | 140 { |
141 int x; | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
142 const Ibyte *mname, *mver; |
996 | 143 Lisp_Object foundname = Qnil; |
144 struct gcpro gcpro1; | |
428 | 145 |
146 CHECK_STRING(file); | |
147 | |
996 | 148 GCPRO1 (foundname); |
149 if (locate_file (Vmodule_load_path, file, Vmodule_extensions, &foundname, 0) | |
150 < 0) | |
151 return Qt; | |
152 UNGCPRO; | |
428 | 153 |
154 if (NILP (name)) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
155 mname = (const Ibyte *) ""; |
428 | 156 else |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
157 mname = XSTRING_DATA (name); |
428 | 158 |
159 if (NILP (version)) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
160 mver = (const Ibyte *) ""; |
428 | 161 else |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
162 mver = XSTRING_DATA (version); |
428 | 163 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
164 x = find_make_module (foundname, mname, mver, 1); |
428 | 165 if (x != -1) |
996 | 166 { |
167 if (modules[x].unload != NULL) | |
168 modules[x].unload (); | |
169 attempt_module_delete (x); | |
170 } | |
428 | 171 return Qt; |
172 } | |
173 | |
174 DEFUN ("list-modules", Flist_modules, 0, 0, "", /* | |
175 Produce a list of loaded dynamic modules. | |
176 | |
177 This function will return a list of all the loaded dynamic modules. | |
178 Each element in the list is a list in the form (SONAME NAME VER DESC), | |
179 where SONAME is the name of the shared object that was loaded, NAME | |
180 is the internal module name, VER is the version of the module, and DESC | |
181 is how the module describes itself. | |
182 | |
183 This function returns a list, so you will need to assign the return value | |
184 to a variable and then examine the variable with `describe-variable'. | |
185 For example: | |
186 | |
187 (setq mylist (list-modules)) | |
188 (describe-variable 'mylist) | |
189 | |
190 | |
191 NOTE: It is possible for the same module to be loaded more than once, | |
192 at different versions. However, you should never see the same module, | |
193 with the same name and version, loaded more than once. If you do, this | |
194 is a bug, and you are encouraged to report it. | |
195 */ | |
196 ()) | |
197 { | |
198 Lisp_Object mlist = Qnil; | |
199 int i; | |
200 | |
201 for (i = 0; i < modnum; i++) | |
202 { | |
203 if (modules[i].used == 1) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
204 mlist = Fcons (list4 (build_intstring (modules[i].soname), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
205 build_intstring (modules[i].modname), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
206 build_intstring (modules[i].modver), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
207 build_intstring (modules[i].modtitle)), mlist); |
428 | 208 } |
209 | |
210 return mlist; | |
211 } | |
212 | |
213 static int | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
214 find_make_module (Lisp_Object mod, const Ibyte *name, const Ibyte *ver, |
1706 | 215 int mof) |
428 | 216 { |
217 int i, fs = -1; | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
218 Ibyte *modstr = XSTRING_DATA (mod); |
428 | 219 |
220 for (i = 0; i < modnum; i++) | |
221 { | |
222 if (fs == -1 && modules[i].used == 0) | |
223 fs = i; | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
224 if (qxestrcmp (modules[i].soname, modstr) == 0) |
428 | 225 { |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
226 if (name && name[0] && qxestrcmp (modules[i].modname, name)) |
428 | 227 continue; |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
228 if (ver && ver[0] && qxestrcmp (modules[i].modver, ver)) |
428 | 229 continue; |
230 return i; /* Found a match */ | |
231 } | |
232 } | |
233 | |
234 if (mof) | |
235 return fs; | |
236 | |
237 if (fs != -1) | |
238 return fs; /* First free slot */ | |
239 | |
240 /* | |
442 | 241 * We only get here if we haven't found a free slot and the module was |
428 | 242 * not previously loaded. |
243 */ | |
1706 | 244 if (modules == NULL) |
2367 | 245 modules = xnew (emodules_list); |
428 | 246 modnum++; |
2367 | 247 XREALLOC_ARRAY (modules, emodules_list, modnum); |
428 | 248 |
249 fs = modnum - 1; | |
2367 | 250 memset (&modules[fs], 0, sizeof (emodules_list)); |
428 | 251 return fs; |
252 } | |
253 | |
254 static void | |
255 attempt_module_delete (int mod) | |
256 { | |
257 if (dll_close (modules[mod].dlhandle) == 0) | |
258 { | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
259 xfree (modules[mod].soname, Ibyte *); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
260 xfree (modules[mod].modname, Ibyte *); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
261 xfree (modules[mod].modver, Ibyte *); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
262 xfree (modules[mod].modtitle, Ibyte *); |
428 | 263 modules[mod].dlhandle = 0; |
264 modules[mod].used = 0; | |
265 } | |
266 else if (modules[mod].used > 1) | |
267 modules[mod].used = 1; /* We couldn't delete it - it stays */ | |
268 } | |
269 | |
270 static Lisp_Object | |
271 module_load_unwind (Lisp_Object upto) | |
272 { | |
273 int x,l=0; | |
274 | |
275 /* | |
276 * First close off the current handle if it is open. | |
277 */ | |
278 if (dlhandle != 0) | |
279 dll_close (dlhandle); | |
280 dlhandle = 0; | |
281 | |
282 if (CONSP (upto)) | |
283 { | |
284 if (INTP (XCAR (upto))) | |
285 l = XINT (XCAR (upto)); | |
853 | 286 free_cons (upto); |
428 | 287 } |
288 else | |
289 l = XINT (upto); | |
290 | |
291 /* | |
292 * Here we need to go through and dlclose() (IN REVERSE ORDER!) any | |
293 * modules that were loaded as part of this load chain. We only mark | |
294 * the slots as closed if the dlclose() succeeds. | |
295 */ | |
296 for (x = modnum-1; x >= l; x--) | |
297 { | |
298 if (modules[x].used > 1) | |
299 attempt_module_delete (x); | |
300 } | |
301 emodules_depth = 0; | |
302 | |
303 return Qnil; | |
304 } | |
305 | |
306 /* | |
307 * Do the actual grunt-work of loading in a module. We first try and | |
308 * dlopen() the module. If that fails, we have an error and we bail | |
309 * out immediately. If the dlopen() succeeds, we need to check for the | |
442 | 310 * existence of certain special symbols. |
428 | 311 * |
312 * All modules will have complete access to the variables and functions | |
313 * defined within XEmacs itself. It is up to the module to declare any | |
314 * variables or functions it uses, however. Modules will also have access | |
315 * to other functions and variables in other loaded modules, unless they | |
316 * are defined as STATIC. | |
317 * | |
318 * We need to be very careful with how we load modules. If we encounter an | |
319 * error along the way, we need to back out completely to the point at | |
442 | 320 * which the user started. Since we can be called recursively, we need to |
428 | 321 * take care with marking modules as loaded. When we first start loading |
322 * modules, we set the counter to zero. As we enter the function each time, | |
442 | 323 * we increment the counter, and before we leave we decrement it. When |
428 | 324 * we get back down to 0, we know we are at the end of the chain and we |
325 * can mark all the modules in the list as loaded. | |
326 * | |
327 * When we signal an error, we need to be sure to unwind all modules loaded | |
328 * thus far (but only for this module chain). It is assumed that if any | |
329 * modules in a chain fail, then they all do. This is logical, considering | |
442 | 330 * that the only time we recurse is when we have dependent modules. So in |
428 | 331 * the error handler we take great care to close off the module chain before |
332 * we call "error" and let the Fmodule_load unwind_protect() function handle | |
333 * the cleaning up. | |
334 */ | |
335 void | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
336 emodules_load (const Ibyte *module, const Ibyte *modname, |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
337 const Ibyte *modver) |
428 | 338 { |
996 | 339 Lisp_Object old_load_list; |
428 | 340 Lisp_Object filename; |
996 | 341 Lisp_Object foundname, lisp_modname; |
342 int x, mpx; | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
343 const Extbyte **f; |
442 | 344 const long *ellcc_rev; |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
345 Ibyte *mver, *mname, *mtitle, *symname; |
428 | 346 void (*modload)(void) = 0; |
347 void (*modsyms)(void) = 0; | |
348 void (*modvars)(void) = 0; | |
349 void (*moddocs)(void) = 0; | |
996 | 350 void (*modunld)(void) = 0; |
428 | 351 emodules_list *mp; |
996 | 352 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
428 | 353 |
354 filename = Qnil; | |
355 foundname = Qnil; | |
356 | |
357 emodules_depth++; | |
358 dlhandle = 0; | |
359 | |
1706 | 360 if (module == NULL || module[0] == '\0') |
563 | 361 invalid_argument ("Empty module name", Qunbound); |
428 | 362 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
363 GCPRO4 (filename, foundname, old_load_list, lisp_modname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
364 filename = build_intstring (module); |
996 | 365 if (locate_file (Vmodule_load_path, filename, Vmodule_extensions, |
366 &foundname, 0) < 0) | |
563 | 367 signal_error (Qdll_error, "Cannot open dynamic module", filename); |
428 | 368 |
996 | 369 lisp_modname = call1 (Qfile_name_sans_extension, |
370 Ffile_name_nondirectory (foundname)); | |
428 | 371 |
1706 | 372 dlhandle = dll_open (foundname); |
373 if (dlhandle == NULL) | |
563 | 374 { |
1811 | 375 signal_error (Qdll_error, "Opening dynamic module", dll_error ()); |
563 | 376 } |
428 | 377 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
378 ellcc_rev = (const long *) dll_variable (dlhandle, "emodule_compiler"); |
1706 | 379 if (ellcc_rev == NULL || *ellcc_rev <= 0L) |
563 | 380 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_compiler'", Qunbound); |
428 | 381 if (*ellcc_rev > EMODULES_REVISION) |
563 | 382 signal_ferror (Qdll_error, "Invalid dynamic module: Unsupported version `%ld(%ld)'", *ellcc_rev, EMODULES_REVISION); |
428 | 383 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
384 f = (const Extbyte **) dll_variable (dlhandle, "emodule_name"); |
1706 | 385 if (f == NULL || *f == NULL) |
563 | 386 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_name'", Qunbound); |
428 | 387 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
388 mname = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
389 /* #### Not obvious we have to force an alloca copy here, but the old |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
390 code did so */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
391 IBYTE_STRING_TO_ALLOCA (mname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
392 |
428 | 393 if (mname[0] == '\0') |
563 | 394 signal_error (Qdll_error, "Invalid dynamic module: Empty value for `emodule_name'", Qunbound); |
428 | 395 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
396 f = (const Extbyte **) dll_variable (dlhandle, "emodule_version"); |
1706 | 397 if (f == NULL || *f == NULL) |
563 | 398 signal_error (Qdll_error, "Missing symbol `emodule_version': Invalid dynamic module", Qunbound); |
428 | 399 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
400 mver = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
401 /* #### Not obvious we have to force an alloca copy here, but the old |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
402 code did so */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
403 IBYTE_STRING_TO_ALLOCA (mver, mver); |
428 | 404 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
405 f = (const Extbyte **) dll_variable (dlhandle, "emodule_title"); |
1706 | 406 if (f == NULL || *f == NULL) |
563 | 407 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_title'", Qunbound); |
428 | 408 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
409 mtitle = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
410 /* #### Not obvious we have to force an alloca copy here, but the old |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
411 code did so */ |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
412 IBYTE_STRING_TO_ALLOCA (mtitle, mtitle); |
428 | 413 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
414 symname = alloca_ibytes (qxestrlen (mname) + 15); |
428 | 415 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
416 qxestrcpy_ascii (symname, "modules_of_"); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
417 qxestrcat (symname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
418 modload = (void (*)(void)) dll_function (dlhandle, symname); |
428 | 419 /* |
442 | 420 * modload is optional. If the module doesn't require other modules it can |
428 | 421 * be left out. |
422 */ | |
423 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
424 qxestrcpy_ascii (symname, "syms_of_"); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
425 qxestrcat (symname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
426 modsyms = (void (*)(void)) dll_function (dlhandle, symname); |
1706 | 427 if (modsyms == NULL) |
563 | 428 { |
429 missing_symbol: | |
430 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol", | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
431 build_intstring (symname)); |
563 | 432 } |
428 | 433 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
434 qxestrcpy_ascii (symname, "vars_of_"); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
435 qxestrcat (symname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
436 modvars = (void (*)(void)) dll_function (dlhandle, symname); |
1706 | 437 if (modvars == NULL) |
563 | 438 goto missing_symbol; |
428 | 439 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
440 qxestrcpy_ascii (symname, "docs_of_"); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
441 qxestrcat (symname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
442 moddocs = (void (*)(void)) dll_function (dlhandle, symname); |
1706 | 443 if (moddocs == NULL) |
563 | 444 goto missing_symbol; |
428 | 445 |
996 | 446 /* Now look for the optional unload function. */ |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
447 qxestrcpy_ascii (symname, "unload_"); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
448 qxestrcat (symname, mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
449 modunld = (void (*)(void)) dll_function (dlhandle, symname); |
996 | 450 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
451 if (modname && modname[0] && qxestrcmp (modname, mname)) |
563 | 452 signal_error (Qdll_error, "Module name mismatch", Qunbound); |
428 | 453 |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
454 if (modver && modver[0] && qxestrcmp (modver, mver)) |
563 | 455 signal_error (Qdll_error, "Module version mismatch", Qunbound); |
428 | 456 |
457 /* | |
458 * Attempt to make a new slot for this module. If this really is the | |
459 * first time we are loading this module, the used member will be 0. | |
460 * If that is non-zero, we know that we have a previously loaded module | |
442 | 461 * of the same name and version, and we don't need to go any further. |
428 | 462 */ |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
463 mpx = find_make_module (foundname, mname, mver, 0); |
428 | 464 mp = &modules[mpx]; |
465 if (mp->used > 0) | |
466 { | |
467 emodules_depth--; | |
468 dll_close (dlhandle); | |
806 | 469 dlhandle = 0; /* Zero this out before module_load_unwind runs */ |
428 | 470 return; |
471 } | |
472 | |
473 if (!load_modules_quietly) | |
474 message ("Loading %s v%s (%s)", mname, mver, mtitle); | |
475 | |
476 /* | |
477 * We have passed the basic initialization, and can now add this | |
478 * module to the list of modules. | |
479 */ | |
480 mp->used = emodules_depth + 1; | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
481 mp->soname = qxestrdup (XSTRING_DATA (foundname)); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
482 mp->modname = qxestrdup (mname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
483 mp->modver = qxestrdup (mver); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
484 mp->modtitle = qxestrdup (mtitle); |
428 | 485 mp->dlhandle = dlhandle; |
996 | 486 mp->unload = modunld; |
428 | 487 dlhandle = 0; |
488 | |
996 | 489 old_load_list = Vcurrent_load_list; |
490 Vcurrent_load_list = Qnil; | |
491 LOADHIST_ATTACH (lisp_modname); | |
492 LOADHIST_ATTACH (module_tag); | |
493 | |
428 | 494 /* |
495 * Now we need to call the module init function and perform the various | |
496 * startup tasks. | |
497 */ | |
498 if (modload != 0) | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
499 (*modload) (); |
428 | 500 |
501 /* | |
502 * Now we can get the module to initialize its symbols, and then its | |
503 * variables, and lastly the documentation strings. | |
504 */ | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
505 (*modsyms) (); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
506 (*modvars) (); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
507 (*moddocs) (); |
428 | 508 |
509 if (!load_modules_quietly) | |
510 message ("Loaded module %s v%s (%s)", mname, mver, mtitle); | |
511 | |
996 | 512 Vload_history = Fcons (Fnreverse (Vcurrent_load_list), Vload_history); |
513 Vcurrent_load_list = old_load_list; | |
514 UNGCPRO; | |
428 | 515 |
516 emodules_depth--; | |
517 if (emodules_depth == 0) | |
518 { | |
519 /* | |
520 * We have reached the end of the load chain. We now go through the | |
521 * list of loaded modules and mark all the valid modules as just | |
522 * that. | |
523 */ | |
524 for (x = 0; x < modnum; x++) | |
525 if (modules[x].used > 1) | |
526 modules[x].used = 1; | |
527 } | |
528 } | |
529 | |
530 void | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
531 emodules_doc_subr (const Ibyte *symname, const Ibyte *doc) |
428 | 532 { |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
533 Bytecount len = qxestrlen (symname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
534 Lisp_Object sym = oblookup (Vobarray, symname, len); |
440 | 535 Lisp_Subr *subr; |
428 | 536 |
1632 | 537 /* Skip autoload cookies */ |
538 if (SYMBOLP (sym) && SUBRP (XSYMBOL (sym)->function)) | |
428 | 539 { |
1632 | 540 subr = XSUBR (XSYMBOL (sym)->function); |
428 | 541 subr->doc = xstrdup (doc); |
542 } | |
543 /* | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
544 * #### FIXME: I wish there was some way to avoid the xstrdup(). Is it |
428 | 545 * possible to just set a pointer to the string, or somehow create a |
546 * symbol whose value we can point to the constant string? Can someone | |
547 * look into this? | |
548 */ | |
549 } | |
550 | |
551 void | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
552 emodules_doc_sym (const Ibyte *symname, const Ibyte *doc) |
428 | 553 { |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
554 Bytecount len = qxestrlen (symname); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
555 Lisp_Object sym = oblookup (Vobarray, symname, len); |
428 | 556 Lisp_Object docstr; |
557 struct gcpro gcpro1; | |
558 | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
559 if (SYMBOLP (sym)) |
428 | 560 { |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
561 docstr = build_intstring (doc); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
562 GCPRO1 (docstr); |
428 | 563 Fput (sym, Qvariable_documentation, docstr); |
564 UNGCPRO; | |
565 } | |
566 } | |
567 | |
568 | |
569 void | |
570 syms_of_module (void) | |
571 { | |
564 | 572 DEFERROR_STANDARD (Qdll_error, Qerror); |
996 | 573 DEFSYMBOL (Qmodule); |
574 DEFSYMBOL (Qunload_module); | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
575 DEFSUBR (Fload_module); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
576 DEFSUBR (Flist_modules); |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
577 DEFSUBR (Funload_module); |
996 | 578 module_tag = Fcons (Qmodule, Qnil); |
579 staticpro (&module_tag); | |
580 Fput (Qunload_module, Qdisabled, Qt); | |
428 | 581 } |
582 | |
583 void | |
584 reinit_vars_of_module (void) | |
585 { | |
586 emodules_depth = 0; | |
1706 | 587 modules = NULL; |
428 | 588 modnum = 0; |
589 } | |
590 | |
1750 | 591 #endif /* HAVE_SHLIB */ |
592 | |
428 | 593 void |
594 vars_of_module (void) | |
595 { | |
1750 | 596 #ifdef HAVE_SHLIB |
597 Fprovide (intern ("modules")); | |
598 | |
2078 | 599 #ifdef HAVE_LTDL |
600 lt_dlinit (); | |
601 lt_dlmalloc = (lt_ptr (*) (size_t)) xmalloc; | |
602 lt_dlrealloc = (lt_ptr (*) (lt_ptr, size_t)) xrealloc; | |
603 lt_dlfree = (void (*) (lt_ptr)) xfree_1; | |
604 #endif | |
605 | |
428 | 606 DEFVAR_LISP ("module-version", &Vmodule_version /* |
607 Emacs dynamic loading mechanism version, as a string. | |
608 | |
609 This string is in the form XX.YY.ppp, where XX is the major version | |
610 number, YY is the minor version number, and ppp is the patch level. | |
442 | 611 This variable can be used to distinguish between different versions of |
428 | 612 the dynamic loading technology used in Emacs, if required. It is not |
613 a given that this value will be the same as the Emacs version number. | |
614 */ ); | |
615 Vmodule_version = build_string (EMODULES_VERSION); | |
616 | |
617 DEFVAR_BOOL ("load-modules-quietly", &load_modules_quietly /* | |
618 *Set to t if module loading is to be silent. | |
619 | |
620 Normally, when loading dynamic modules, Emacs will inform you of its | |
621 progress, and will display the module name and version if the module | |
622 is loaded correctly. Setting this variable to `t' will suppress these | |
623 messages. This would normally only be done if `load-module' was being | |
624 called by a Lisp function. | |
625 */); | |
1733 | 626 load_modules_quietly = 0; |
428 | 627 |
1750 | 628 DEFVAR_BOOL ("unloading-module", &unloading_module /* |
629 Used internally by `unload-feature'. Do not set this variable. | |
630 Danger, danger, Will Robinson! | |
631 */); | |
632 unloading_module = 0; | |
633 | |
634 #endif /* HAVE_SHLIB */ | |
635 | |
428 | 636 DEFVAR_LISP ("module-load-path", &Vmodule_load_path /* |
637 *List of directories to search for dynamic modules to load. | |
638 Each element is a string (directory name) or nil (try default directory). | |
639 | |
640 Note that elements of this list *may not* begin with "~", so you must | |
442 | 641 call `expand-file-name' on them before adding them to this list. |
428 | 642 |
643 Initialized based on EMACSMODULEPATH environment variable, if any, otherwise | |
644 to default specified the file `paths.h' when XEmacs was built. If there | |
645 were no paths specified in `paths.h', then XEmacs chooses a default | |
646 value for this variable by looking around in the file-system near the | |
647 directory in which the XEmacs executable resides. | |
648 | |
649 Due to the nature of dynamic modules, the path names should almost always | |
442 | 650 refer to architecture-dependent directories. It is unwise to attempt to |
651 store dynamic modules in a heterogenous environment. Some environments | |
428 | 652 are similar enough to each other that XEmacs will be unable to determine |
653 the correctness of a dynamic module, which can have unpredictable results | |
654 when a dynamic module is loaded. | |
655 */); | |
1733 | 656 Vmodule_load_path = Qnil; |
428 | 657 |
1733 | 658 DEFVAR_LISP ("module-extensions", &Vmodule_extensions /* |
659 *List of filename extensions to use when searching for dynamic modules. | |
660 */); | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
661 Vmodule_extensions = list5 (build_ascstring (".ell"), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
662 build_ascstring (".so"), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
663 build_ascstring (".dll"), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
664 build_ascstring (".dylib"), |
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4528
diff
changeset
|
665 build_ascstring ("")); |
428 | 666 } |