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 */