Mercurial > hg > xemacs-beta
comparison 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 |
comparison
equal
deleted
inserted
replaced
4951:de60897044f4 | 4952:19a72041c5ed |
---|---|
1 /* emodules.c - Support routines for dynamic module loading | 1 /* emodules.c - Support routines for dynamic module loading |
2 (C) Copyright 1998, 1999 J. Kean Johnston. All rights reserved. | 2 (C) Copyright 1998, 1999 J. Kean Johnston. All rights reserved. |
3 (C) Copyright 2010 Ben Wing. | |
3 | 4 |
4 This file is part of XEmacs. | 5 This file is part of XEmacs. |
5 | 6 |
6 XEmacs is free software; you can redistribute it and/or modify it | 7 XEmacs is free software; you can redistribute it and/or modify it |
7 under the terms of the GNU General Public License as published by the | 8 under the terms of the GNU General Public License as published by the |
15 | 16 |
16 You should have received a copy of the GNU General Public License | 17 You should have received a copy of the GNU General Public License |
17 along with XEmacs; see the file COPYING. If not, write to | 18 along with XEmacs; see the file COPYING. If not, write to |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
19 Boston, MA 02111-1307, USA. */ | 20 Boston, MA 02111-1307, USA. */ |
21 | |
22 /* This file has been Mule-ized, Ben Wing, 1-26-10. */ | |
20 | 23 |
21 #include "emodules.h" | 24 #include "emodules.h" |
22 #include "sysdll.h" | 25 #include "sysdll.h" |
23 #ifdef HAVE_LTDL | 26 #ifdef HAVE_LTDL |
24 #include <ltdl.h> | 27 #include <ltdl.h> |
46 Lisp_Object Qmodule, Qunload_module, module_tag; | 49 Lisp_Object Qmodule, Qunload_module, module_tag; |
47 | 50 |
48 typedef struct _emodules_list | 51 typedef struct _emodules_list |
49 { | 52 { |
50 int used; /* Is this slot used? */ | 53 int used; /* Is this slot used? */ |
51 CIbyte *soname; /* Name of the shared object loaded (full path) */ | 54 Ibyte *soname; /* Name of the shared object loaded (full path) */ |
52 CIbyte *modname; /* The name of the module */ | 55 Ibyte *modname; /* The name of the module */ |
53 CIbyte *modver; /* The module version string */ | 56 Ibyte *modver; /* The module version string */ |
54 CIbyte *modtitle; /* How the module announces itself */ | 57 Ibyte *modtitle; /* How the module announces itself */ |
55 void (*unload)(void); /* Module cleanup function to run before unloading */ | 58 void (*unload) (void);/* Module cleanup function to run before unloading */ |
56 dll_handle dlhandle; /* Dynamic lib handle */ | 59 dll_handle dlhandle; /* Dynamic lib handle */ |
57 } emodules_list; | 60 } emodules_list; |
58 | 61 |
59 static int emodules_depth; | 62 static int emodules_depth; |
60 static dll_handle dlhandle; | 63 static dll_handle dlhandle; |
61 static emodules_list *modules; | 64 static emodules_list *modules; |
62 static int modnum; | 65 static int modnum; |
63 | 66 |
64 static int find_make_module (const CIbyte *mod, const CIbyte *name, | 67 static int find_make_module (Lisp_Object mod, const Ibyte *name, |
65 const CIbyte *ver, int make_or_find); | 68 const Ibyte *ver, int make_or_find); |
66 static Lisp_Object module_load_unwind (Lisp_Object); | 69 static Lisp_Object module_load_unwind (Lisp_Object); |
67 static void attempt_module_delete (int mod); | 70 static void attempt_module_delete (int mod); |
68 | 71 |
69 DEFUN ("load-module", Fload_module, 1, 3, "FLoad dynamic module: ", /* | 72 DEFUN ("load-module", Fload_module, 1, 3, "FLoad dynamic module: ", /* |
70 Load in a C Emacs Extension module named FILE. | 73 Load in a C Emacs Extension module named FILE. |
94 Messages informing you of the progress of the load are displayed unless | 97 Messages informing you of the progress of the load are displayed unless |
95 the variable `load-modules-quietly' is non-NIL. | 98 the variable `load-modules-quietly' is non-NIL. |
96 */ | 99 */ |
97 (file, name, version)) | 100 (file, name, version)) |
98 { | 101 { |
99 const CIbyte *mod, *mname, *mver; | 102 const Ibyte *mod, *mname, *mver; |
100 int speccount = specpdl_depth(); | 103 int speccount = specpdl_depth(); |
101 | 104 |
102 CHECK_STRING(file); | 105 CHECK_STRING (file); |
103 | 106 |
104 mod = (CIbyte *) XSTRING_DATA (file); | 107 mod = XSTRING_DATA (file); |
105 | 108 |
106 if (NILP (name)) | 109 if (NILP (name)) |
107 mname = ""; | 110 mname = (const Ibyte *) ""; |
108 else | 111 else |
109 mname = (CIbyte *) XSTRING_DATA (name); | 112 mname = XSTRING_DATA (name); |
110 | 113 |
111 if (NILP (version)) | 114 if (NILP (version)) |
112 mver = ""; | 115 mver = (const Ibyte *) ""; |
113 else | 116 else |
114 mver = (CIbyte *) XSTRING_DATA (version); | 117 mver = XSTRING_DATA (version); |
115 | 118 |
116 dlhandle = 0; | 119 dlhandle = 0; |
117 record_unwind_protect (module_load_unwind, make_int(modnum)); | 120 record_unwind_protect (module_load_unwind, make_int(modnum)); |
118 emodules_load (mod, mname, mver); | 121 emodules_load (mod, mname, mver); |
119 unbind_to (speccount); | 122 unbind_to (speccount); |
134 soon as the last reference to symbols within the module is destroyed. | 137 soon as the last reference to symbols within the module is destroyed. |
135 */ | 138 */ |
136 (file, name, version)) | 139 (file, name, version)) |
137 { | 140 { |
138 int x; | 141 int x; |
139 const CIbyte *mod, *mname, *mver; | 142 const Ibyte *mname, *mver; |
140 Lisp_Object foundname = Qnil; | 143 Lisp_Object foundname = Qnil; |
141 struct gcpro gcpro1; | 144 struct gcpro gcpro1; |
142 | 145 |
143 CHECK_STRING(file); | 146 CHECK_STRING(file); |
144 | 147 |
145 GCPRO1 (foundname); | 148 GCPRO1 (foundname); |
146 if (locate_file (Vmodule_load_path, file, Vmodule_extensions, &foundname, 0) | 149 if (locate_file (Vmodule_load_path, file, Vmodule_extensions, &foundname, 0) |
147 < 0) | 150 < 0) |
148 return Qt; | 151 return Qt; |
149 mod = (CIbyte *) XSTRING_DATA (foundname); | |
150 UNGCPRO; | 152 UNGCPRO; |
151 | 153 |
152 if (NILP (name)) | 154 if (NILP (name)) |
153 mname = ""; | 155 mname = (const Ibyte *) ""; |
154 else | 156 else |
155 mname = (CIbyte *) XSTRING_DATA (name); | 157 mname = XSTRING_DATA (name); |
156 | 158 |
157 if (NILP (version)) | 159 if (NILP (version)) |
158 mver = ""; | 160 mver = (const Ibyte *) ""; |
159 else | 161 else |
160 mver = (CIbyte *) XSTRING_DATA (version); | 162 mver = XSTRING_DATA (version); |
161 | 163 |
162 x = find_make_module (mod, mname, mver, 1); | 164 x = find_make_module (foundname, mname, mver, 1); |
163 if (x != -1) | 165 if (x != -1) |
164 { | 166 { |
165 if (modules[x].unload != NULL) | 167 if (modules[x].unload != NULL) |
166 modules[x].unload (); | 168 modules[x].unload (); |
167 attempt_module_delete (x); | 169 attempt_module_delete (x); |
197 int i; | 199 int i; |
198 | 200 |
199 for (i = 0; i < modnum; i++) | 201 for (i = 0; i < modnum; i++) |
200 { | 202 { |
201 if (modules[i].used == 1) | 203 if (modules[i].used == 1) |
202 mlist = Fcons (list4 (build_string (modules[i].soname), | 204 mlist = Fcons (list4 (build_intstring (modules[i].soname), |
203 build_string (modules[i].modname), | 205 build_intstring (modules[i].modname), |
204 build_string (modules[i].modver), | 206 build_intstring (modules[i].modver), |
205 build_string (modules[i].modtitle)), mlist); | 207 build_intstring (modules[i].modtitle)), mlist); |
206 } | 208 } |
207 | 209 |
208 return mlist; | 210 return mlist; |
209 } | 211 } |
210 | 212 |
211 static int | 213 static int |
212 find_make_module (const CIbyte *mod, const CIbyte *name, const CIbyte *ver, | 214 find_make_module (Lisp_Object mod, const Ibyte *name, const Ibyte *ver, |
213 int mof) | 215 int mof) |
214 { | 216 { |
215 int i, fs = -1; | 217 int i, fs = -1; |
218 Ibyte *modstr = XSTRING_DATA (mod); | |
216 | 219 |
217 for (i = 0; i < modnum; i++) | 220 for (i = 0; i < modnum; i++) |
218 { | 221 { |
219 if (fs == -1 && modules[i].used == 0) | 222 if (fs == -1 && modules[i].used == 0) |
220 fs = i; | 223 fs = i; |
221 if (strcmp (modules[i].soname, mod) == 0) | 224 if (qxestrcmp (modules[i].soname, modstr) == 0) |
222 { | 225 { |
223 if (name && name[0] && strcmp (modules[i].modname, name)) | 226 if (name && name[0] && qxestrcmp (modules[i].modname, name)) |
224 continue; | 227 continue; |
225 if (ver && ver[0] && strcmp (modules[i].modver, ver)) | 228 if (ver && ver[0] && qxestrcmp (modules[i].modver, ver)) |
226 continue; | 229 continue; |
227 return i; /* Found a match */ | 230 return i; /* Found a match */ |
228 } | 231 } |
229 } | 232 } |
230 | 233 |
251 static void | 254 static void |
252 attempt_module_delete (int mod) | 255 attempt_module_delete (int mod) |
253 { | 256 { |
254 if (dll_close (modules[mod].dlhandle) == 0) | 257 if (dll_close (modules[mod].dlhandle) == 0) |
255 { | 258 { |
256 xfree (modules[mod].soname, CIbyte *); | 259 xfree (modules[mod].soname, Ibyte *); |
257 xfree (modules[mod].modname, CIbyte *); | 260 xfree (modules[mod].modname, Ibyte *); |
258 xfree (modules[mod].modver, CIbyte *); | 261 xfree (modules[mod].modver, Ibyte *); |
259 xfree (modules[mod].modtitle, CIbyte *); | 262 xfree (modules[mod].modtitle, Ibyte *); |
260 modules[mod].dlhandle = 0; | 263 modules[mod].dlhandle = 0; |
261 modules[mod].used = 0; | 264 modules[mod].used = 0; |
262 } | 265 } |
263 else if (modules[mod].used > 1) | 266 else if (modules[mod].used > 1) |
264 modules[mod].used = 1; /* We couldn't delete it - it stays */ | 267 modules[mod].used = 1; /* We couldn't delete it - it stays */ |
328 * the error handler we take great care to close off the module chain before | 331 * the error handler we take great care to close off the module chain before |
329 * we call "error" and let the Fmodule_load unwind_protect() function handle | 332 * we call "error" and let the Fmodule_load unwind_protect() function handle |
330 * the cleaning up. | 333 * the cleaning up. |
331 */ | 334 */ |
332 void | 335 void |
333 emodules_load (const CIbyte *module, const CIbyte *modname, | 336 emodules_load (const Ibyte *module, const Ibyte *modname, |
334 const CIbyte *modver) | 337 const Ibyte *modver) |
335 { | 338 { |
336 /* !!#### Needs serious work */ | |
337 Lisp_Object old_load_list; | 339 Lisp_Object old_load_list; |
338 Lisp_Object filename; | 340 Lisp_Object filename; |
339 Lisp_Object foundname, lisp_modname; | 341 Lisp_Object foundname, lisp_modname; |
340 int x, mpx; | 342 int x, mpx; |
341 CIbyte *soname; | 343 const Extbyte **f; |
342 const CIbyte **f; | |
343 const long *ellcc_rev; | 344 const long *ellcc_rev; |
344 CIbyte *mver, *mname, *mtitle, *symname; | 345 Ibyte *mver, *mname, *mtitle, *symname; |
345 void (*modload)(void) = 0; | 346 void (*modload)(void) = 0; |
346 void (*modsyms)(void) = 0; | 347 void (*modsyms)(void) = 0; |
347 void (*modvars)(void) = 0; | 348 void (*modvars)(void) = 0; |
348 void (*moddocs)(void) = 0; | 349 void (*moddocs)(void) = 0; |
349 void (*modunld)(void) = 0; | 350 void (*modunld)(void) = 0; |
357 dlhandle = 0; | 358 dlhandle = 0; |
358 | 359 |
359 if (module == NULL || module[0] == '\0') | 360 if (module == NULL || module[0] == '\0') |
360 invalid_argument ("Empty module name", Qunbound); | 361 invalid_argument ("Empty module name", Qunbound); |
361 | 362 |
362 GCPRO4(filename, foundname, old_load_list, lisp_modname); | 363 GCPRO4 (filename, foundname, old_load_list, lisp_modname); |
363 filename = build_string (module); | 364 filename = build_intstring (module); |
364 if (locate_file (Vmodule_load_path, filename, Vmodule_extensions, | 365 if (locate_file (Vmodule_load_path, filename, Vmodule_extensions, |
365 &foundname, 0) < 0) | 366 &foundname, 0) < 0) |
366 signal_error (Qdll_error, "Cannot open dynamic module", filename); | 367 signal_error (Qdll_error, "Cannot open dynamic module", filename); |
367 | 368 |
368 LISP_STRING_TO_EXTERNAL (foundname, soname, Qfile_name); | |
369 lisp_modname = call1 (Qfile_name_sans_extension, | 369 lisp_modname = call1 (Qfile_name_sans_extension, |
370 Ffile_name_nondirectory (foundname)); | 370 Ffile_name_nondirectory (foundname)); |
371 | 371 |
372 dlhandle = dll_open (foundname); | 372 dlhandle = dll_open (foundname); |
373 if (dlhandle == NULL) | 373 if (dlhandle == NULL) |
374 { | 374 { |
375 signal_error (Qdll_error, "Opening dynamic module", dll_error ()); | 375 signal_error (Qdll_error, "Opening dynamic module", dll_error ()); |
376 } | 376 } |
377 | 377 |
378 ellcc_rev = (const long *)dll_variable (dlhandle, "emodule_compiler"); | 378 ellcc_rev = (const long *) dll_variable (dlhandle, "emodule_compiler"); |
379 if (ellcc_rev == NULL || *ellcc_rev <= 0L) | 379 if (ellcc_rev == NULL || *ellcc_rev <= 0L) |
380 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_compiler'", Qunbound); | 380 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_compiler'", Qunbound); |
381 if (*ellcc_rev > EMODULES_REVISION) | 381 if (*ellcc_rev > EMODULES_REVISION) |
382 signal_ferror (Qdll_error, "Invalid dynamic module: Unsupported version `%ld(%ld)'", *ellcc_rev, EMODULES_REVISION); | 382 signal_ferror (Qdll_error, "Invalid dynamic module: Unsupported version `%ld(%ld)'", *ellcc_rev, EMODULES_REVISION); |
383 | 383 |
384 f = (const CIbyte **) dll_variable (dlhandle, "emodule_name"); | 384 f = (const Extbyte **) dll_variable (dlhandle, "emodule_name"); |
385 if (f == NULL || *f == NULL) | 385 if (f == NULL || *f == NULL) |
386 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_name'", Qunbound); | 386 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_name'", Qunbound); |
387 | 387 |
388 mname = (CIbyte *) ALLOCA (strlen (*f) + 1); | 388 mname = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
389 strcpy (mname, *f); | 389 /* #### Not obvious we have to force an alloca copy here, but the old |
390 code did so */ | |
391 IBYTE_STRING_TO_ALLOCA (mname, mname); | |
392 | |
390 if (mname[0] == '\0') | 393 if (mname[0] == '\0') |
391 signal_error (Qdll_error, "Invalid dynamic module: Empty value for `emodule_name'", Qunbound); | 394 signal_error (Qdll_error, "Invalid dynamic module: Empty value for `emodule_name'", Qunbound); |
392 | 395 |
393 f = (const CIbyte **) dll_variable (dlhandle, "emodule_version"); | 396 f = (const Extbyte **) dll_variable (dlhandle, "emodule_version"); |
394 if (f == NULL || *f == NULL) | 397 if (f == NULL || *f == NULL) |
395 signal_error (Qdll_error, "Missing symbol `emodule_version': Invalid dynamic module", Qunbound); | 398 signal_error (Qdll_error, "Missing symbol `emodule_version': Invalid dynamic module", Qunbound); |
396 | 399 |
397 mver = (CIbyte *) ALLOCA (strlen (*f) + 1); | 400 mver = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
398 strcpy (mver, *f); | 401 /* #### Not obvious we have to force an alloca copy here, but the old |
399 | 402 code did so */ |
400 f = (const CIbyte **) dll_variable (dlhandle, "emodule_title"); | 403 IBYTE_STRING_TO_ALLOCA (mver, mver); |
404 | |
405 f = (const Extbyte **) dll_variable (dlhandle, "emodule_title"); | |
401 if (f == NULL || *f == NULL) | 406 if (f == NULL || *f == NULL) |
402 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_title'", Qunbound); | 407 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol `emodule_title'", Qunbound); |
403 | 408 |
404 mtitle = (CIbyte *) ALLOCA (strlen (*f) + 1); | 409 mtitle = NEW_EXTERNAL_TO_C_STRING (f, Qemodule_string_encoding); |
405 strcpy (mtitle, *f); | 410 /* #### Not obvious we have to force an alloca copy here, but the old |
406 | 411 code did so */ |
407 symname = (CIbyte *) ALLOCA (strlen (mname) + 15); | 412 IBYTE_STRING_TO_ALLOCA (mtitle, mtitle); |
408 | 413 |
409 strcpy (symname, "modules_of_"); | 414 symname = alloca_ibytes (qxestrlen (mname) + 15); |
410 strcat (symname, mname); | 415 |
411 modload = (void (*)(void))dll_function (dlhandle, symname); | 416 qxestrcpy_ascii (symname, "modules_of_"); |
417 qxestrcat (symname, mname); | |
418 modload = (void (*)(void)) dll_function (dlhandle, symname); | |
412 /* | 419 /* |
413 * modload is optional. If the module doesn't require other modules it can | 420 * modload is optional. If the module doesn't require other modules it can |
414 * be left out. | 421 * be left out. |
415 */ | 422 */ |
416 | 423 |
417 strcpy (symname, "syms_of_"); | 424 qxestrcpy_ascii (symname, "syms_of_"); |
418 strcat (symname, mname); | 425 qxestrcat (symname, mname); |
419 modsyms = (void (*)(void))dll_function (dlhandle, symname); | 426 modsyms = (void (*)(void)) dll_function (dlhandle, symname); |
420 if (modsyms == NULL) | 427 if (modsyms == NULL) |
421 { | 428 { |
422 missing_symbol: | 429 missing_symbol: |
423 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol", | 430 signal_error (Qdll_error, "Invalid dynamic module: Missing symbol", |
424 build_string (symname)); | 431 build_intstring (symname)); |
425 } | 432 } |
426 | 433 |
427 strcpy (symname, "vars_of_"); | 434 qxestrcpy_ascii (symname, "vars_of_"); |
428 strcat (symname, mname); | 435 qxestrcat (symname, mname); |
429 modvars = (void (*)(void))dll_function (dlhandle, symname); | 436 modvars = (void (*)(void)) dll_function (dlhandle, symname); |
430 if (modvars == NULL) | 437 if (modvars == NULL) |
431 goto missing_symbol; | 438 goto missing_symbol; |
432 | 439 |
433 strcpy (symname, "docs_of_"); | 440 qxestrcpy_ascii (symname, "docs_of_"); |
434 strcat (symname, mname); | 441 qxestrcat (symname, mname); |
435 moddocs = (void (*)(void))dll_function (dlhandle, symname); | 442 moddocs = (void (*)(void)) dll_function (dlhandle, symname); |
436 if (moddocs == NULL) | 443 if (moddocs == NULL) |
437 goto missing_symbol; | 444 goto missing_symbol; |
438 | 445 |
439 /* Now look for the optional unload function. */ | 446 /* Now look for the optional unload function. */ |
440 strcpy (symname, "unload_"); | 447 qxestrcpy_ascii (symname, "unload_"); |
441 strcat (symname, mname); | 448 qxestrcat (symname, mname); |
442 modunld = (void (*)(void))dll_function (dlhandle, symname); | 449 modunld = (void (*)(void)) dll_function (dlhandle, symname); |
443 | 450 |
444 if (modname && modname[0] && strcmp (modname, mname)) | 451 if (modname && modname[0] && qxestrcmp (modname, mname)) |
445 signal_error (Qdll_error, "Module name mismatch", Qunbound); | 452 signal_error (Qdll_error, "Module name mismatch", Qunbound); |
446 | 453 |
447 if (modver && modver[0] && strcmp (modver, mver)) | 454 if (modver && modver[0] && qxestrcmp (modver, mver)) |
448 signal_error (Qdll_error, "Module version mismatch", Qunbound); | 455 signal_error (Qdll_error, "Module version mismatch", Qunbound); |
449 | 456 |
450 /* | 457 /* |
451 * Attempt to make a new slot for this module. If this really is the | 458 * Attempt to make a new slot for this module. If this really is the |
452 * first time we are loading this module, the used member will be 0. | 459 * first time we are loading this module, the used member will be 0. |
453 * If that is non-zero, we know that we have a previously loaded module | 460 * If that is non-zero, we know that we have a previously loaded module |
454 * of the same name and version, and we don't need to go any further. | 461 * of the same name and version, and we don't need to go any further. |
455 */ | 462 */ |
456 mpx = find_make_module (soname, mname, mver, 0); | 463 mpx = find_make_module (foundname, mname, mver, 0); |
457 mp = &modules[mpx]; | 464 mp = &modules[mpx]; |
458 if (mp->used > 0) | 465 if (mp->used > 0) |
459 { | 466 { |
460 emodules_depth--; | 467 emodules_depth--; |
461 dll_close (dlhandle); | 468 dll_close (dlhandle); |
469 /* | 476 /* |
470 * We have passed the basic initialization, and can now add this | 477 * We have passed the basic initialization, and can now add this |
471 * module to the list of modules. | 478 * module to the list of modules. |
472 */ | 479 */ |
473 mp->used = emodules_depth + 1; | 480 mp->used = emodules_depth + 1; |
474 mp->soname = xstrdup (soname); | 481 mp->soname = qxestrdup (XSTRING_DATA (foundname)); |
475 mp->modname = xstrdup (mname); | 482 mp->modname = qxestrdup (mname); |
476 mp->modver = xstrdup (mver); | 483 mp->modver = qxestrdup (mver); |
477 mp->modtitle = xstrdup (mtitle); | 484 mp->modtitle = qxestrdup (mtitle); |
478 mp->dlhandle = dlhandle; | 485 mp->dlhandle = dlhandle; |
479 mp->unload = modunld; | 486 mp->unload = modunld; |
480 dlhandle = 0; | 487 dlhandle = 0; |
481 | 488 |
482 old_load_list = Vcurrent_load_list; | 489 old_load_list = Vcurrent_load_list; |
487 /* | 494 /* |
488 * Now we need to call the module init function and perform the various | 495 * Now we need to call the module init function and perform the various |
489 * startup tasks. | 496 * startup tasks. |
490 */ | 497 */ |
491 if (modload != 0) | 498 if (modload != 0) |
492 (*modload)(); | 499 (*modload) (); |
493 | 500 |
494 /* | 501 /* |
495 * Now we can get the module to initialize its symbols, and then its | 502 * Now we can get the module to initialize its symbols, and then its |
496 * variables, and lastly the documentation strings. | 503 * variables, and lastly the documentation strings. |
497 */ | 504 */ |
498 (*modsyms)(); | 505 (*modsyms) (); |
499 (*modvars)(); | 506 (*modvars) (); |
500 (*moddocs)(); | 507 (*moddocs) (); |
501 | 508 |
502 if (!load_modules_quietly) | 509 if (!load_modules_quietly) |
503 message ("Loaded module %s v%s (%s)", mname, mver, mtitle); | 510 message ("Loaded module %s v%s (%s)", mname, mver, mtitle); |
504 | 511 |
505 Vload_history = Fcons (Fnreverse (Vcurrent_load_list), Vload_history); | 512 Vload_history = Fcons (Fnreverse (Vcurrent_load_list), Vload_history); |
519 modules[x].used = 1; | 526 modules[x].used = 1; |
520 } | 527 } |
521 } | 528 } |
522 | 529 |
523 void | 530 void |
524 emodules_doc_subr(const char *symname, const char *doc) | 531 emodules_doc_subr (const Ibyte *symname, const Ibyte *doc) |
525 { | 532 { |
526 Bytecount len = strlen (symname); | 533 Bytecount len = qxestrlen (symname); |
527 Lisp_Object sym = oblookup (Vobarray, (const Ibyte *)symname, len); | 534 Lisp_Object sym = oblookup (Vobarray, symname, len); |
528 Lisp_Subr *subr; | 535 Lisp_Subr *subr; |
529 | 536 |
530 /* Skip autoload cookies */ | 537 /* Skip autoload cookies */ |
531 if (SYMBOLP (sym) && SUBRP (XSYMBOL (sym)->function)) | 538 if (SYMBOLP (sym) && SUBRP (XSYMBOL (sym)->function)) |
532 { | 539 { |
533 subr = XSUBR (XSYMBOL (sym)->function); | 540 subr = XSUBR (XSYMBOL (sym)->function); |
534 subr->doc = xstrdup (doc); | 541 subr->doc = xstrdup (doc); |
535 } | 542 } |
536 /* | 543 /* |
537 * FIXME: I wish there was some way to avoid the xstrdup(). Is it | 544 * #### FIXME: I wish there was some way to avoid the xstrdup(). Is it |
538 * possible to just set a pointer to the string, or somehow create a | 545 * possible to just set a pointer to the string, or somehow create a |
539 * symbol whose value we can point to the constant string? Can someone | 546 * symbol whose value we can point to the constant string? Can someone |
540 * look into this? | 547 * look into this? |
541 */ | 548 */ |
542 } | 549 } |
543 | 550 |
544 void | 551 void |
545 emodules_doc_sym (const char *symname, const char *doc) | 552 emodules_doc_sym (const Ibyte *symname, const Ibyte *doc) |
546 { | 553 { |
547 Bytecount len = strlen (symname); | 554 Bytecount len = qxestrlen (symname); |
548 Lisp_Object sym = oblookup (Vobarray, (const Ibyte *)symname, len); | 555 Lisp_Object sym = oblookup (Vobarray, symname, len); |
549 Lisp_Object docstr; | 556 Lisp_Object docstr; |
550 struct gcpro gcpro1; | 557 struct gcpro gcpro1; |
551 | 558 |
552 if (SYMBOLP(sym)) | 559 if (SYMBOLP (sym)) |
553 { | 560 { |
554 docstr = build_string (doc); | 561 docstr = build_intstring (doc); |
555 GCPRO1(docstr); | 562 GCPRO1 (docstr); |
556 Fput (sym, Qvariable_documentation, docstr); | 563 Fput (sym, Qvariable_documentation, docstr); |
557 UNGCPRO; | 564 UNGCPRO; |
558 } | 565 } |
559 } | 566 } |
560 | 567 |
563 syms_of_module (void) | 570 syms_of_module (void) |
564 { | 571 { |
565 DEFERROR_STANDARD (Qdll_error, Qerror); | 572 DEFERROR_STANDARD (Qdll_error, Qerror); |
566 DEFSYMBOL (Qmodule); | 573 DEFSYMBOL (Qmodule); |
567 DEFSYMBOL (Qunload_module); | 574 DEFSYMBOL (Qunload_module); |
568 DEFSUBR(Fload_module); | 575 DEFSUBR (Fload_module); |
569 DEFSUBR(Flist_modules); | 576 DEFSUBR (Flist_modules); |
570 DEFSUBR(Funload_module); | 577 DEFSUBR (Funload_module); |
571 module_tag = Fcons (Qmodule, Qnil); | 578 module_tag = Fcons (Qmodule, Qnil); |
572 staticpro (&module_tag); | 579 staticpro (&module_tag); |
573 Fput (Qunload_module, Qdisabled, Qt); | 580 Fput (Qunload_module, Qdisabled, Qt); |
574 } | 581 } |
575 | 582 |
649 Vmodule_load_path = Qnil; | 656 Vmodule_load_path = Qnil; |
650 | 657 |
651 DEFVAR_LISP ("module-extensions", &Vmodule_extensions /* | 658 DEFVAR_LISP ("module-extensions", &Vmodule_extensions /* |
652 *List of filename extensions to use when searching for dynamic modules. | 659 *List of filename extensions to use when searching for dynamic modules. |
653 */); | 660 */); |
654 Vmodule_extensions = list5 (build_string (".ell"), | 661 Vmodule_extensions = list5 (build_ascstring (".ell"), |
655 build_string (".so"), | 662 build_ascstring (".so"), |
656 build_string (".dll"), | 663 build_ascstring (".dll"), |
657 build_string (".dylib"), | 664 build_ascstring (".dylib"), |
658 build_string ("")); | 665 build_ascstring ("")); |
659 } | 666 } |