Mercurial > hg > xemacs-beta
comparison src/sysdll.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 | b3ea9c582280 |
children | 304aebb79cd3 |
comparison
equal
deleted
inserted
replaced
4951:de60897044f4 | 4952:19a72041c5ed |
---|---|
1 /* sysdll.c --- system dependent support for dynamic linked libraries | 1 /* sysdll.c --- system dependent support for dynamic linked libraries |
2 Copyright (C) 1998 Free Software Foundation, Inc. | 2 Copyright (C) 1998 Free Software Foundation, Inc. |
3 Copyright (C) 2010 Ben Wing. | |
4 | |
3 Author: William Perry <wmperry@aventail.com> | 5 Author: William Perry <wmperry@aventail.com> |
4 | 6 |
5 This file is part of XEmacs. | 7 This file is part of XEmacs. |
6 | 8 |
7 XEmacs is free software; you can redistribute it and/or modify it | 9 XEmacs is free software; you can redistribute it and/or modify it |
17 You should have received a copy of the GNU General Public License | 19 You should have received a copy of the GNU General Public License |
18 along with XEmacs; see the file COPYING. If not, write to the Free | 20 along with XEmacs; see the file COPYING. If not, write to the Free |
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | 21 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
20 02111-1307, USA. */ | 22 02111-1307, USA. */ |
21 | 23 |
24 /* This file has been Mule-ized, Ben Wing, 1-26-10. */ | |
25 | |
22 #ifdef HAVE_CONFIG_H | 26 #ifdef HAVE_CONFIG_H |
23 #include <config.h> | 27 #include <config.h> |
24 #endif | 28 #endif |
25 | 29 |
26 #include <stdlib.h> | 30 #include <stdlib.h> |
27 #include "lisp.h" | 31 #include "lisp.h" |
28 #include "sysdll.h" | 32 #include "sysdll.h" |
29 | 33 |
30 #ifdef DLSYM_NEEDS_UNDERSCORE | 34 #ifdef DLSYM_NEEDS_UNDERSCORE |
31 #define MAYBE_PREPEND_UNDERSCORE(n) do { \ | 35 #define MAYBE_PREPEND_UNDERSCORE(n) do { \ |
32 CIbyte *buf = alloca_array (CIbyte, strlen (n) + 2); \ | 36 Ibyte *buf = alloca_array (Ibyte, qxestrlen (n) + 2); \ |
33 *buf = '_'; \ | 37 *buf = '_'; \ |
34 strcpy (buf + 1, n); \ | 38 qxestrcpy (buf + 1, n); \ |
35 n = buf; \ | 39 n = buf; \ |
36 } while (0) | 40 } while (0) |
37 #else | 41 #else |
38 #define MAYBE_PREPEND_UNDERSCORE(n) | 42 #define MAYBE_PREPEND_UNDERSCORE(n) |
39 #endif | 43 #endif |
83 { | 87 { |
84 return dlclose ((void *) h); | 88 return dlclose ((void *) h); |
85 } | 89 } |
86 | 90 |
87 dll_func | 91 dll_func |
88 dll_function (dll_handle h, const CIbyte *n) | 92 dll_function (dll_handle h, const Ibyte *n) |
89 { | 93 { |
94 Extbyte *next; | |
90 MAYBE_PREPEND_UNDERSCORE (n); | 95 MAYBE_PREPEND_UNDERSCORE (n); |
91 return (dll_func) dlsym ((void *) h, n); | 96 C_STRING_TO_EXTERNAL (n, next, Qdll_function_name_encoding); |
97 return (dll_func) dlsym ((void *) h, next); | |
92 } | 98 } |
93 | 99 |
94 dll_var | 100 dll_var |
95 dll_variable (dll_handle h, const CIbyte *n) | 101 dll_variable (dll_handle h, const Ibyte *n) |
96 { | 102 { |
103 Extbyte *next; | |
97 MAYBE_PREPEND_UNDERSCORE (n); | 104 MAYBE_PREPEND_UNDERSCORE (n); |
98 return (dll_var)dlsym ((void *)h, n); | 105 C_STRING_TO_EXTERNAL (n, next, Qdll_variable_name_encoding); |
106 return (dll_var)dlsym ((void *)h, next); | |
99 } | 107 } |
100 | 108 |
101 Lisp_Object | 109 Lisp_Object |
102 dll_error () | 110 dll_error () |
103 { | 111 { |
162 Lisp_Object | 170 Lisp_Object |
163 dll_error () | 171 dll_error () |
164 { | 172 { |
165 /* #### WTF?! Shouldn't this at least attempt to get strerror or | 173 /* #### WTF?! Shouldn't this at least attempt to get strerror or |
166 something? --hniksic */ | 174 something? --hniksic */ |
167 return build_string ("Generic shared library error", | 175 return build_ascstring ("Generic shared library error"); |
168 Qerror_message_encoding); | |
169 } | 176 } |
170 | 177 |
171 #elif defined (WIN32_NATIVE) || defined (CYGWIN) | 178 #elif defined (WIN32_NATIVE) || defined (CYGWIN) |
172 | 179 |
173 #include "syswindows.h" | 180 #include "syswindows.h" |
194 { | 201 { |
195 return FreeLibrary ((HMODULE) h); | 202 return FreeLibrary ((HMODULE) h); |
196 } | 203 } |
197 | 204 |
198 dll_func | 205 dll_func |
199 dll_function (dll_handle h, const CIbyte *n) | 206 dll_function (dll_handle h, const Ibyte *n) |
200 { | 207 { |
201 return (dll_func) GetProcAddress ((HINSTANCE) h, n); | 208 Extbyte *next = NEW_C_STRING_TO_EXTERNAL (n, Qmswindows_multibyte); |
202 } | 209 return (dll_func) GetProcAddress ((HINSTANCE) h, next); |
203 | 210 } |
204 dll_func | 211 |
205 dll_variable (dll_handle h, const CIbyte *n) | 212 dll_func |
206 { | 213 dll_variable (dll_handle h, const Ibyte *n) |
207 return (dll_func) GetProcAddress ((HINSTANCE) h, n); | 214 { |
215 Extbyte *next = NEW_C_STRING_TO_EXTERNAL (n, Qmswindows_multibyte); | |
216 return (dll_func) GetProcAddress ((HINSTANCE) h, next); | |
208 } | 217 } |
209 | 218 |
210 Lisp_Object | 219 Lisp_Object |
211 dll_error () | 220 dll_error () |
212 { | 221 { |
213 CIbyte err[32]; | 222 Ascbyte err[32]; |
214 snprintf (err, 32, "Windows DLL Error %lu", GetLastError ()); | 223 snprintf (err, 32, "Windows DLL Error %lu", GetLastError ()); |
215 return build_string (err); | 224 return build_ascstring (err); |
216 } | 225 } |
217 #elif defined(HAVE_DYLD) | 226 #elif defined (HAVE_DYLD) |
218 /* This section supports MacOSX dynamic libraries. Dynamically | 227 /* This section supports MacOSX dynamic libraries. Dynamically |
219 loadable libraries must be compiled as bundles, not dynamiclibs. | 228 loadable libraries must be compiled as bundles, not dynamiclibs. |
220 */ | 229 */ |
221 | 230 |
222 #include <mach-o/dyld.h> | 231 #include <mach-o/dyld.h> |
241 } | 250 } |
242 else | 251 else |
243 { | 252 { |
244 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); | 253 LISP_STRING_TO_EXTERNAL (fname, soname, Qdll_filename_encoding); |
245 } | 254 } |
246 ret = NSCreateObjectFileImageFromFile(soname, &file); | 255 ret = NSCreateObjectFileImageFromFile (soname, &file); |
247 if (ret != NSObjectFileImageSuccess) { | 256 if (ret != NSObjectFileImageSuccess) |
248 return NULL; | 257 return NULL; |
249 } | 258 out = NSLinkModule (file, soname, |
250 out = NSLinkModule(file, soname, | 259 NSLINKMODULE_OPTION_BINDNOW | |
251 NSLINKMODULE_OPTION_BINDNOW | | 260 NSLINKMODULE_OPTION_PRIVATE | |
252 NSLINKMODULE_OPTION_PRIVATE | | 261 NSLINKMODULE_OPTION_RETURN_ON_ERROR); |
253 NSLINKMODULE_OPTION_RETURN_ON_ERROR); | 262 return (dll_handle) out; |
254 return (dll_handle)out; | |
255 } | 263 } |
256 | 264 |
257 int | 265 int |
258 dll_close (dll_handle h) | 266 dll_close (dll_handle h) |
259 { | 267 { |
260 return NSUnLinkModule((NSModule)h, NSUNLINKMODULE_OPTION_NONE); | 268 return NSUnLinkModule ((NSModule) h, NSUNLINKMODULE_OPTION_NONE); |
261 } | 269 } |
262 | 270 |
263 /* Given an address, return the mach_header for the image containing it | 271 /* Given an address, return the mach_header for the image containing it |
264 * or zero if the given address is not contained in any loaded images. | 272 * or zero if the given address is not contained in any loaded images. |
265 * | 273 * |
266 * Note: image_for_address(), my_find_image() and search_linked_libs() are | 274 * Note: image_for_address(), my_find_image() and search_linked_libs() are |
267 * based on code from the dlcompat library | 275 * based on code from the dlcompat library |
268 * (http://www.opendarwin.org/projects/dlcompat). | 276 * (http://www.opendarwin.org/projects/dlcompat). |
269 */ | 277 */ |
270 | 278 |
271 static const struct mach_header* | 279 static const struct mach_header * |
272 image_for_address(void *address) | 280 image_for_address (void *address) |
273 { | 281 { |
274 unsigned long i; | 282 unsigned long i; |
275 unsigned long count = _dyld_image_count(); | 283 unsigned long count = _dyld_image_count (); |
276 const struct mach_header *mh = 0; | 284 const struct mach_header *mh = 0; |
277 | 285 |
278 for (i = 0; i < count; i++) | 286 for (i = 0; i < count; i++) |
279 { | 287 { |
280 unsigned long addr = (unsigned long)address - | 288 unsigned long addr = (unsigned long) address - |
281 _dyld_get_image_vmaddr_slide(i); | 289 _dyld_get_image_vmaddr_slide (i); |
282 mh = _dyld_get_image_header(i); | 290 mh = _dyld_get_image_header (i); |
283 | 291 |
284 if (mh) | 292 if (mh) |
285 { | 293 { |
286 struct load_command *lc = | 294 struct load_command *lc = |
287 (struct load_command *)((char *)mh + sizeof(struct mach_header)); | 295 (struct load_command *) ((Rawbyte *) mh + |
296 sizeof(struct mach_header)); | |
288 unsigned long j; | 297 unsigned long j; |
289 | 298 |
290 for (j = 0; j < mh->ncmds; | 299 for (j = 0; j < mh->ncmds; |
291 j++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) | 300 j++, lc = (struct load_command *) ((Rawbyte *)lc + lc->cmdsize)) |
292 { | 301 { |
293 if (LC_SEGMENT == lc->cmd && | 302 if (LC_SEGMENT == lc->cmd && |
294 addr >= ((struct segment_command *)lc)->vmaddr && | 303 addr >= ((struct segment_command *)lc)->vmaddr && |
295 addr < | 304 addr < |
296 ((struct segment_command *)lc)->vmaddr + | 305 ((struct segment_command *)lc)->vmaddr + |
306 | 315 |
307 image_found: | 316 image_found: |
308 return mh; | 317 return mh; |
309 } | 318 } |
310 | 319 |
311 static const struct mach_header* | 320 static const struct mach_header * |
312 my_find_image(const char *name) | 321 my_find_image (const char *name) |
313 { | 322 { |
314 const struct mach_header *mh = (struct mach_header *) | 323 const struct mach_header *mh = (struct mach_header *) |
315 NSAddImage(name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED | | 324 NSAddImage (name, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED | |
316 NSADDIMAGE_OPTION_RETURN_ON_ERROR); | 325 NSADDIMAGE_OPTION_RETURN_ON_ERROR); |
317 | 326 |
318 if (!mh) | 327 if (!mh) |
319 { | 328 { |
320 int count = _dyld_image_count(); | 329 int count = _dyld_image_count (); |
321 int j; | 330 int j; |
322 | 331 |
323 for (j = 0; j < count; j++) | 332 for (j = 0; j < count; j++) |
324 { | 333 { |
325 const char *id = _dyld_get_image_name(j); | 334 const char *id = _dyld_get_image_name (j); |
326 | 335 |
327 if (!strcmp(id, name)) | 336 if (!strcmp (id, name)) |
328 { | 337 { |
329 mh = _dyld_get_image_header(j); | 338 mh = _dyld_get_image_header (j); |
330 break; | 339 break; |
331 } | 340 } |
332 } | 341 } |
333 } | 342 } |
334 | 343 |
341 * should do the same... but we don't bother adding the extra dependencies, if | 350 * should do the same... but we don't bother adding the extra dependencies, if |
342 * the symbols are neither in the loaded image nor any of it's direct | 351 * the symbols are neither in the loaded image nor any of it's direct |
343 * dependencies, then it probably isn't there. | 352 * dependencies, then it probably isn't there. |
344 */ | 353 */ |
345 static NSSymbol | 354 static NSSymbol |
346 search_linked_libs(const struct mach_header * mh, const char *symbol) | 355 search_linked_libs (const struct mach_header * mh, const Ibyte *symbol) |
347 { | 356 { |
348 unsigned long n; | 357 unsigned long n; |
349 NSSymbol nssym = 0; | 358 NSSymbol nssym = 0; |
350 | 359 |
351 struct load_command *lc = | 360 struct load_command *lc = |
352 (struct load_command *)((char *)mh + sizeof(struct mach_header)); | 361 (struct load_command *) ((Rawbyte *) mh + sizeof (struct mach_header)); |
353 | 362 |
354 for (n = 0; n < mh->ncmds; | 363 for (n = 0; n < mh->ncmds; |
355 n++, lc = (struct load_command *)((char *)lc + lc->cmdsize)) | 364 n++, lc = (struct load_command *) ((Rawbyte *) lc + lc->cmdsize)) |
356 { | 365 { |
357 if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) | 366 if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd)) |
358 { | 367 { |
359 struct mach_header *wh; | 368 struct mach_header *wh; |
360 | 369 |
361 if ((wh = (struct mach_header *) | 370 if ((wh = (struct mach_header *) |
362 my_find_image((char *)(((struct dylib_command *)lc)->dylib.name.offset + | 371 my_find_image((Rawbyte *) |
363 (char *)lc)))) | 372 (((struct dylib_command *) lc)-> |
373 dylib.name.offset + (Rawbyte *) lc)))) | |
364 { | 374 { |
365 if (NSIsSymbolNameDefinedInImage(wh, symbol)) | 375 Extbyte *symext = |
376 NEW_C_STRING_TO_EXTERNAL (symbol, Qdll_symbol_encoding); | |
377 if (NSIsSymbolNameDefinedInImage (wh, symext)) | |
366 { | 378 { |
367 nssym = | 379 nssym = |
368 NSLookupSymbolInImage(wh, | 380 NSLookupSymbolInImage |
369 symbol, | 381 (wh, |
370 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | | 382 symext, |
371 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); | 383 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | |
384 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); | |
372 break; | 385 break; |
373 } | 386 } |
374 } | 387 } |
375 } | 388 } |
376 } | 389 } |
377 | 390 |
378 return nssym; | 391 return nssym; |
379 } | 392 } |
380 | 393 |
381 dll_func | 394 dll_func |
382 dll_function (dll_handle h, const CIbyte *n) | 395 dll_function (dll_handle h, const Ibyte *n) |
383 { | 396 { |
384 NSSymbol sym = 0; | 397 NSSymbol sym = 0; |
398 Extbyte *next; | |
399 | |
385 MAYBE_PREPEND_UNDERSCORE (n); | 400 MAYBE_PREPEND_UNDERSCORE (n); |
401 C_STRING_TO_EXTERNAL (n, next, Qdll_function_name_encoding); | |
386 | 402 |
387 /* NULL means the program image and shared libraries, not bundles. */ | 403 /* NULL means the program image and shared libraries, not bundles. */ |
388 | 404 |
389 if (h == NULL) | 405 if (h == NULL) |
390 { | 406 { |
391 /* NOTE: This assumes that this function is included in the main program | 407 /* NOTE: This assumes that this function is included in the main program |
392 and not in a shared library. */ | 408 and not in a shared library. */ |
393 const struct mach_header* my_mh = image_for_address((void*) &dll_function); | 409 const struct mach_header* my_mh = |
394 | 410 image_for_address ((void*) &dll_function); |
395 if (NSIsSymbolNameDefinedInImage(my_mh, n)) | 411 |
412 if (NSIsSymbolNameDefinedInImage (my_mh, next)) | |
396 { | 413 { |
397 sym = | 414 sym = |
398 NSLookupSymbolInImage(my_mh, | 415 NSLookupSymbolInImage |
399 n, | 416 (my_mh, |
400 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | | 417 next, |
401 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); | 418 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | |
419 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); | |
402 } | 420 } |
403 | 421 |
404 if (!sym) | 422 if (!sym) |
405 { | 423 { |
406 sym = search_linked_libs(my_mh, n); | 424 sym = search_linked_libs (my_mh, n); |
407 } | 425 } |
408 } | 426 } |
409 else | 427 else |
410 { | 428 { |
411 sym = NSLookupSymbolInModule((NSModule)h, n); | 429 sym = NSLookupSymbolInModule ((NSModule)h, next); |
412 } | 430 } |
413 | 431 |
414 if (sym == 0) return 0; | 432 if (sym == 0) return 0; |
415 return (dll_func)NSAddressOfSymbol(sym); | 433 return (dll_func) NSAddressOfSymbol (sym); |
416 } | 434 } |
417 | 435 |
418 dll_var | 436 dll_var |
419 dll_variable (dll_handle h, const CIbyte *n) | 437 dll_variable (dll_handle h, const Ibyte *n) |
420 { | 438 { |
421 NSSymbol sym; | 439 NSSymbol sym; |
440 Extbyte *next; | |
441 | |
422 MAYBE_PREPEND_UNDERSCORE (n); | 442 MAYBE_PREPEND_UNDERSCORE (n); |
423 sym = NSLookupSymbolInModule((NSModule)h, n); | 443 C_STRING_TO_EXTERNAL (n, next, Qdll_variable_name_encoding); |
444 | |
445 sym = NSLookupSymbolInModule ((NSModule) h, n); | |
424 if (sym == 0) return 0; | 446 if (sym == 0) return 0; |
425 return (dll_var)NSAddressOfSymbol(sym); | 447 return (dll_var) NSAddressOfSymbol (sym); |
426 } | 448 } |
427 | 449 |
428 Lisp_Object | 450 Lisp_Object |
429 dll_error () | 451 dll_error (void) |
430 { | 452 { |
431 NSLinkEditErrors c; | 453 NSLinkEditErrors c; |
432 int errorNumber; | 454 int errorNumber; |
433 const CIbyte *fileNameWithError, *errorString; | 455 const Extbyte *fileNameWithError, *errorString; |
434 NSLinkEditError(&c, &errorNumber, &fileNameWithError, &errorString); | 456 NSLinkEditError (&c, &errorNumber, &fileNameWithError, &errorString); |
435 return build_ext_string (errorString, Qerror_message_encoding); | 457 return build_ext_string (errorString, Qerror_message_encoding); |
436 } | 458 } |
437 #elif HAVE_LTDL | 459 #elif HAVE_LTDL |
438 /* Libtool's libltdl */ | 460 /* Libtool's libltdl */ |
439 #include <ltdl.h> | 461 #include <ltdl.h> |
459 { | 481 { |
460 return lt_dlclose ((lt_dlhandle) h); | 482 return lt_dlclose ((lt_dlhandle) h); |
461 } | 483 } |
462 | 484 |
463 dll_func | 485 dll_func |
464 dll_function (dll_handle h, const CIbyte *n) | 486 dll_function (dll_handle h, const Ibyte *n) |
465 { | 487 { |
488 Extbyte *next; | |
466 MAYBE_PREPEND_UNDERSCORE (n); | 489 MAYBE_PREPEND_UNDERSCORE (n); |
467 return (dll_func) lt_dlsym ((lt_dlhandle) h, n); | 490 C_STRING_TO_EXTERNAL (n, next, Qdll_function_name_encoding); |
491 return (dll_func) lt_dlsym ((lt_dlhandle) h, next); | |
468 } | 492 } |
469 | 493 |
470 dll_var | 494 dll_var |
471 dll_variable (dll_handle h, const CIbyte *n) | 495 dll_variable (dll_handle h, const Ibyte *n) |
472 { | 496 { |
497 Extbyte *next; | |
473 MAYBE_PREPEND_UNDERSCORE (n); | 498 MAYBE_PREPEND_UNDERSCORE (n); |
474 return (dll_var) lt_dlsym ((lt_dlhandle) h, n); | 499 C_STRING_TO_EXTERNAL (n, next, Qdll_variable_name_encoding); |
500 return (dll_var) lt_dlsym ((lt_dlhandle) h, next); | |
475 } | 501 } |
476 | 502 |
477 Lisp_Object | 503 Lisp_Object |
478 dll_error () | 504 dll_error (void) |
479 { | 505 { |
480 return build_ext_string (lt_dlerror (), Qerror_message_encoding); | 506 return build_ext_string (lt_dlerror (), Qerror_message_encoding); |
481 } | 507 } |
482 #else | 508 #else |
483 /* Catchall if we don't know about this system's method of dynamic loading */ | 509 /* Catchall if we don't know about this system's method of dynamic loading */ |
492 { | 518 { |
493 return 0; | 519 return 0; |
494 } | 520 } |
495 | 521 |
496 dll_func | 522 dll_func |
497 dll_function (dll_handle h, const CIbyte *n) | 523 dll_function (dll_handle h, const Ibyte *n) |
498 { | 524 { |
499 return NULL; | 525 return NULL; |
500 } | 526 } |
501 | 527 |
502 dll_func | 528 dll_func |
503 dll_variable (dll_handle h, const CIbyte *n) | 529 dll_variable (dll_handle h, const Ibyte *n) |
504 { | 530 { |
505 return NULL; | 531 return NULL; |
506 } | 532 } |
507 | 533 |
508 Lisp_Object | 534 Lisp_Object |
509 dll_error () | 535 dll_error (void) |
510 { | 536 { |
511 return build_string ("Shared libraries not implemented on this system"); | 537 return build_ascstring ("Shared libraries not implemented on this system"); |
512 } | 538 } |
513 #endif /* System conditionals */ | 539 #endif /* System conditionals */ |
514 | 540 |
515 #endif /* HAVE_SHLIB */ | 541 #endif /* HAVE_SHLIB */ |