Mercurial > hg > xemacs-beta
annotate src/database.c @ 1204:e22b0213b713
[xemacs-hg @ 2003-01-12 11:07:58 by michaels]
modules/ChangeLog:
2002-12-16 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
remove ifdef USE_KKCC.
src/ChangeLog:
2003-01-08 Mike Sperber <mike@xemacs.org>
* console.h (CDFW_CONSOLE): Don't lead to a crash if we're dealing
with a dead window/frame/device/console.
2002-12-20 Mike Sperber <mike@xemacs.org>
* ui-gtk.c: Fix typo from Ben's patch: emacs_ffi_data is a
typedef, not a struct. emacs_gtk_object_data is a typedef, not a
struct.
* gtk-glue.c (gdk_event_to_emacs_event): Fix typos from Ben's
patch: le -> emacs_event + rearrange the code.
* event-gtk.c (gtk_event_to_emacs_event): Fix typos from Ben's
patch: ..._UNDERLYING_GDK_EVENT -> ..._GDK_EVENT, ev -> key_event.
* device-gtk.c: Fix typo from Ben's patch: x_keysym_map_hash_table
-> x_keysym_map_hashtable.
2002-12-19 Mike Sperber <mike@xemacs.org>
* menubar-x.c (set_frame_menubar): Initialize protect_me field of
popup_data.
2002-12-16 Ben Wing <ben@xemacs.org>
Major cleanup of KKCC, etc.
KKCC, pdump-related:
-- descriptions are written for all objects. this required some
changes in the format of some objects, e.g. extents, popup-data,
coding system, lstream, lcrecord-list.
-- KKCC now handles weakness in markers, hash tables, elsewhere
correctly (formerly, you'd eventually get a stack overflow due
to endlessly expanding markers).
-- textual changes: lrecord_description -> memory_description,
struct_description -> sized_memory_description.
-- extensive comment describing descriptions and pdump.
-- redo XD_UNION so it works inline and change its format to provide
sufficient info for pdump. implement XD_UNION in pdump. also add
XD_UNION_DYNAMIC_SIZE, which works like XD_UNION except for when
auto-computing structure sizes.
-- add support for XD_INDIRECT in description offsets (used by
extents).
-- add support for "description maps", allowing for indirect
descriptions that are retrieved from an object at run-time. this
generalizes XD_CODING_SYSTEM_END, XD_SPECIFIER_END, etc., which
have now been eliminated.
-- add a fifth field "flags" to memory_description, to support flags
that can be specified for this particular line. Currently defined
flags are XD_FLAG_NO_KKCC (KKCC should ignore this entry; useful
for the weakness above in markers, etc.), XD_FLAG_NO_PDUMP (pdump
should ignore this entry), XD_FLAG_UNION_DEFAULT_ENTRY (in
union maps, this specifies a "default" entry for all remaining
values), and XD_FLAG_FREE_LISP_OBJECT (for use with lcrecord-lists).
-- clean up the kkcc-itis in events, so that the differences
between event data as separate objects and as a union are now
minimized to a small number of places. with the new XD_UNION, we
no longer need event data as separate objects, so this code is no
longer ifdef USE_KKCC, but instead ifdef EVENT_DATA_AS_OBJECTS,
not used by default. make sure that we explicitly free the
separate event data objects when no longer in use, to maintain the
invariant the event processing causes no consing.
-- also remove other USE_KKCC ifdefs when not necessary.
-- allow for KKCC compilation under MS Windows.
-- fix README.kkcc.
-- dump_add_root_object -> dump_add_root_lisp_object.
-- implement dump_add_root_block and use this to handle
dump_add_opaque.
-- factor out some code duplicated in kkcc and pdump.
Other allocation/object-related:
-- change various *slots.h so MARKED_SLOT() call no longer
includes semicolon.
-- free_marker() takes a Lisp_Object not a direct pointer.
-- make bit vectors lcrecords, like vectors, and eliminate code
that essentially duplicated the lcrecord handling.
-- additional asserts in FREE_FIXED_TYPE, formerly duplicated in
the various callers of this.
-- all lcrecord allocation functions now zero out the returned
lcrecords. unnecessary calls to zero_lcrecord removed. add long
comment describing these functions.
-- extract out process and coding system slots, like for buffers,
frames, etc.
-- lcrecords now set the type of items sitting on the free list to
lcrecord_type_free.
-- changes to the way that gap arrays are allocated, for kkcc's
benefit -- now, one single memory block with a stretchy array on
the end, instead of a separate block holding the array.
Error-checking-related:
-- now can compile with C++ under MS Windows. clean up compile errors
discovered that way. (a few were real problems)
-- add C++ error-checking code to verify problems with mismatched
GCPRO/UNGCPRO. (there were a few in the kkcc code.) add long
comment about how to catch insufficient GCPRO (yes, it's possible
using C++).
-- add debug_p4(), a simple object printer, when debug_print()
doesn't work.
-- add dp() and db() as short synonyms of debug_print(),
debug_backtrace().
-- `print' tries EXTREMELY hard to avoid core dumping when printing
when crashing or from debug_print(), and tries as hard as it
reasonably can in other situations.
-- Correct the message output upon crashing to be more up-to-date.
Event-related:
-- document event-matches-key-specifier-p better.
-- generalize the dispatch queues formerly duplicated in the
various event implementations. add event methods to drain pending
events. generalize and clean up QUIT handling, removing
event-specific quit processing. allow arbitrary keystrokes, not
just ASCII, to be the QUIT char. among other things, this should
fix some longstanding bugs in X quit handling. long comment
describing the various event queues.
-- implement delaying of XFlush() if there are pending expose events.
SOMEONE PLEASE TRY THIS OUT.
-- Fix `xemacs -batch -l dunnet' under Cygwin. Try to fix under
MS Windows but not quite there yet.
Other:
-- class -> class_ and no more C++ games with this item.
new -> new_ in the lwlib code, so far not elsewhere.
-- use `struct htentry' not `struct hentry' in elhash.c to avoid
debugger confusion with hash.c.
-- new macros ALIST_LOOP_3, ALIST_LOOP_4.
* README.kkcc:
* alloc.c:
* alloc.c (deadbeef_memory):
* alloc.c (allocate_lisp_storage):
* alloc.c (copy_lisp_object):
* alloc.c (ALLOCATE_FIXED_TYPE_1):
* alloc.c (FREE_FIXED_TYPE):
* alloc.c (make_vector_internal):
* alloc.c (make_bit_vector_internal):
* alloc.c (make_key_data):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (struct string_chars_block):
* alloc.c (mark_lcrecord_list):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (alloc_automanaged_lcrecord):
* alloc.c (staticpro_1):
* alloc.c (staticpro):
* alloc.c (lispdesc_indirect_count_1):
* alloc.c (lispdesc_indirect_description_1):
* alloc.c (lispdesc_one_description_line_size):
* alloc.c (lispdesc_structure_size):
* alloc.c (mark_object_maybe_checking_free):
* alloc.c (mark_with_description):
* alloc.c (mark_struct_contents):
* alloc.c (mark_object):
* alloc.c (tick_lcrecord_stats):
* alloc.c (free_cons):
* alloc.c (free_key_data):
* alloc.c (free_button_data):
* alloc.c (free_motion_data):
* alloc.c (free_process_data):
* alloc.c (free_timeout_data):
* alloc.c (free_magic_data):
* alloc.c (free_magic_eval_data):
* alloc.c (free_eval_data):
* alloc.c (free_misc_user_data):
* alloc.c (free_marker):
* alloc.c (compact_string_chars):
* alloc.c (gc_sweep):
* alloc.c (garbage_collect_1):
* alloc.c (Fgarbage_collect):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c:
* buffer.c (mark_buffer):
* buffer.c (MARKED_SLOT):
* buffer.c (cleanup_buffer_undo_lists):
* buffer.c (Fget_file_buffer):
* buffer.h (MARKED_SLOT):
* bufslots.h:
* bytecode.c:
* callint.c:
* casetab.c:
* chartab.c:
* chartab.c (symbol_to_char_table_type):
* cmdloop.c:
* cmdloop.c (Fcommand_loop_1):
* config.h.in (new):
* conslots.h:
* console-gtk-impl.h (struct gtk_frame):
* console-impl.h:
* console-impl.h (struct console):
* console-impl.h (MARKED_SLOT):
* console-impl.h (CONSOLE_QUIT_EVENT):
* console-msw-impl.h (XM_BUMPQUEUE):
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.h:
* console-stream-impl.h:
* console-stream-impl.h (struct stream_console):
* console-stream.c:
* console-stream.c (stream_init_console):
* console-stream.h:
* console-tty.c:
* console-tty.h:
* console-x.h:
* console.c:
* console.c (mark_console):
* console.c (MARKED_SLOT):
* console.c (allocate_console):
* console.c (get_console_variant):
* console.c (create_console):
* console.c (delete_console_internal):
* console.c (Fset_input_mode):
* console.c (Fcurrent_input_mode):
* console.c (common_init_complex_vars_of_console):
* console.h:
* console.h (console_variant):
* console.h (device_metrics):
* data.c:
* data.c (Faref):
* data.c (Faset):
* data.c (decode_weak_list_type):
* database.c:
* debug.c (xemacs_debug_loop):
* debug.c (FROB):
* debug.c (Fadd_debug_class_to_check):
* debug.c (Fdelete_debug_class_to_check):
* debug.c (Fset_debug_classes_to_check):
* debug.c (Fset_debug_class_types_to_check):
* debug.c (Fdebug_types_being_checked):
* debug.h (DASSERT):
* device-gtk.c:
* device-impl.h (struct device):
* device-impl.h (MARKED_SLOT):
* device-msw.c:
* device-x.c:
* device-x.c (x_init_device_class):
* device-x.c (x_comp_visual_info):
* device-x.c (x_try_best_visual_class):
* device-x.c (x_init_device):
* device-x.c (construct_name_list):
* device-x.c (x_get_resource_prefix):
* device-x.c (Fx_get_resource):
* device-x.c (Fx_display_visual_class):
* device.c:
* device.c (MARKED_SLOT):
* device.c (allocate_device):
* device.c (Fmake_device):
* device.c (delete_device_internal):
* device.c (Fset_device_class):
* device.h:
* devslots.h:
* devslots.h (MARKED_SLOT):
* dialog-msw.c:
* dired-msw.c (mswindows_ls_sort_fcn):
* dired-msw.c (mswindows_get_files):
* dired-msw.c (mswindows_format_file):
* doprnt.c (parse_doprnt_spec):
* dumper.c:
* dumper.c (struct):
* dumper.c (dump_add_root_block):
* dumper.c (dump_add_root_struct_ptr):
* dumper.c (dump_add_root_lisp_object):
* dumper.c (pdump_struct_list_elt):
* dumper.c (pdump_get_entry_list):
* dumper.c (pdump_backtrace):
* dumper.c (pdump_bump_depth):
* dumper.c (pdump_register_sub):
* dumper.c (pdump_register_object):
* dumper.c (pdump_register_struct_contents):
* dumper.c (pdump_register_struct):
* dumper.c (pdump_store_new_pointer_offsets):
* dumper.c (pdump_dump_data):
* dumper.c (pdump_reloc_one):
* dumper.c (pdump_allocate_offset):
* dumper.c (pdump_scan_by_alignment):
* dumper.c (pdump_dump_root_blocks):
* dumper.c (pdump_dump_rtables):
* dumper.c (pdump_dump_root_lisp_objects):
* dumper.c (pdump):
* dumper.c (pdump_load_finish):
* dumper.c (pdump_file_get):
* dumper.c (pdump_resource_get):
* dumper.c (pdump_load):
* editfns.c (save_excursion_restore):
* editfns.c (user_login_name):
* editfns.c (save_restriction_restore):
* elhash.c:
* elhash.c (htentry):
* elhash.c (struct Lisp_Hash_Table):
* elhash.c (HTENTRY_CLEAR_P):
* elhash.c (LINEAR_PROBING_LOOP):
* elhash.c (check_hash_table_invariants):
* elhash.c (mark_hash_table):
* elhash.c (hash_table_equal):
* elhash.c (print_hash_table_data):
* elhash.c (free_hentries):
* elhash.c (make_general_lisp_hash_table):
* elhash.c (decode_hash_table_weakness):
* elhash.c (decode_hash_table_test):
* elhash.c (Fcopy_hash_table):
* elhash.c (resize_hash_table):
* elhash.c (pdump_reorganize_hash_table):
* elhash.c (find_htentry):
* elhash.c (Fgethash):
* elhash.c (Fputhash):
* elhash.c (remhash_1):
* elhash.c (Fremhash):
* elhash.c (Fclrhash):
* elhash.c (copy_compress_hentries):
* elhash.c (elisp_maphash_unsafe):
* elhash.c (finish_marking_weak_hash_tables):
* elhash.c (prune_weak_hash_tables):
* elhash.h:
* emacs.c:
* emacs.c (main_1):
* emacs.c (main):
* emacs.c (shut_down_emacs):
* emodules.h (dump_add_root_lisp_object):
* eval.c:
* eval.c (unwind_to_catch):
* eval.c (maybe_signal_error_1):
* eval.c (maybe_signal_continuable_error_1):
* eval.c (maybe_signal_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (maybe_signal_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (maybe_signal_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (maybe_syntax_error):
* eval.c (maybe_sferror):
* eval.c (maybe_invalid_argument):
* eval.c (maybe_invalid_constant):
* eval.c (maybe_invalid_operation):
* eval.c (maybe_invalid_change):
* eval.c (maybe_invalid_state):
* eval.c (Feval):
* eval.c (call_trapping_problems):
* eval.c (call_with_suspended_errors):
* eval.c (warn_when_safe_lispobj):
* eval.c (warn_when_safe):
* eval.c (vars_of_eval):
* event-Xt.c:
* event-Xt.c (maybe_define_x_key_as_self_inserting_character):
* event-Xt.c (x_to_emacs_keysym):
* event-Xt.c (x_event_to_emacs_event):
* event-Xt.c (emacs_Xt_enqueue_focus_event):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (emacs_Xt_compare_magic_event):
* event-Xt.c (emacs_Xt_hash_magic_event):
* event-Xt.c (emacs_Xt_handle_magic_event):
* event-Xt.c (Xt_timeout_to_emacs_event):
* event-Xt.c (Xt_process_to_emacs_event):
* event-Xt.c (signal_special_Xt_user_event):
* event-Xt.c (emacs_Xt_next_event):
* event-Xt.c (emacs_Xt_event_handler):
* event-Xt.c (emacs_Xt_drain_queue):
* event-Xt.c (emacs_Xt_event_pending_p):
* event-Xt.c (check_if_pending_expose_event):
* event-Xt.c (reinit_vars_of_event_Xt):
* event-Xt.c (vars_of_event_Xt):
* event-gtk.c:
* event-gtk.c (IS_MODIFIER_KEY):
* event-gtk.c (emacs_gtk_format_magic_event):
* event-gtk.c (emacs_gtk_compare_magic_event):
* event-gtk.c (emacs_gtk_hash_magic_event):
* event-gtk.c (emacs_gtk_handle_magic_event):
* event-gtk.c (gtk_to_emacs_keysym):
* event-gtk.c (gtk_timeout_to_emacs_event):
* event-gtk.c (gtk_process_to_emacs_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (signal_special_gtk_user_event):
* event-gtk.c (emacs_gtk_next_event):
* event-gtk.c (gtk_event_to_emacs_event):
* event-gtk.c (generic_event_handler):
* event-gtk.c (emacs_shell_event_handler):
* event-gtk.c (emacs_gtk_drain_queue):
* event-gtk.c (emacs_gtk_event_pending_p):
* event-gtk.c (reinit_vars_of_event_gtk):
* event-gtk.c (vars_of_event_gtk):
* event-msw.c:
* event-msw.c (struct winsock_stream):
* event-msw.c (winsock_reader):
* event-msw.c (winsock_writer):
* event-msw.c (mswindows_enqueue_dispatch_event):
* event-msw.c (mswindows_enqueue_misc_user_event):
* event-msw.c (mswindows_enqueue_magic_event):
* event-msw.c (mswindows_enqueue_process_event):
* event-msw.c (mswindows_enqueue_mouse_button_event):
* event-msw.c (mswindows_enqueue_keypress_event):
* event-msw.c (mswindows_dequeue_dispatch_event):
* event-msw.c (emacs_mswindows_drain_queue):
* event-msw.c (mswindows_need_event_in_modal_loop):
* event-msw.c (mswindows_need_event):
* event-msw.c (mswindows_wm_timer_callback):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (remove_timeout_mapper):
* event-msw.c (emacs_mswindows_remove_timeout):
* event-msw.c (emacs_mswindows_event_pending_p):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-msw.c (emacs_mswindows_compare_magic_event):
* event-msw.c (emacs_mswindows_hash_magic_event):
* event-msw.c (emacs_mswindows_handle_magic_event):
* event-msw.c (emacs_mswindows_select_console):
* event-msw.c (emacs_mswindows_unselect_console):
* event-msw.c (reinit_vars_of_event_mswindows):
* event-msw.c (vars_of_event_mswindows):
* event-stream.c:
* event-stream.c (mark_command_builder):
* event-stream.c (reset_command_builder_event_chain):
* event-stream.c (allocate_command_builder):
* event-stream.c (copy_command_builder):
* event-stream.c (command_builder_append_event):
* event-stream.c (event_stream_event_pending_p):
* event-stream.c (event_stream_force_event_pending):
* event-stream.c (maybe_read_quit_event):
* event-stream.c (event_stream_drain_queue):
* event-stream.c (remove_quit_p_event):
* event-stream.c (event_stream_quit_p):
* event-stream.c (echo_key_event):
* event-stream.c (maybe_kbd_translate):
* event-stream.c (execute_help_form):
* event-stream.c (event_stream_generate_wakeup):
* event-stream.c (enqueue_dispatch_event):
* event-stream.c (enqueue_magic_eval_event):
* event-stream.c (Fenqueue_eval_event):
* event-stream.c (enqueue_misc_user_event):
* event-stream.c (enqueue_misc_user_event_pos):
* event-stream.c (next_event_internal):
* event-stream.c (Fnext_event):
* event-stream.c (Faccept_process_output):
* event-stream.c (execute_internal_event):
* event-stream.c (munge_keymap_translate):
* event-stream.c (command_builder_find_leaf_no_mule_processing):
* event-stream.c (command_builder_find_leaf):
* event-stream.c (lookup_command_event):
* event-stream.c (is_scrollbar_event):
* event-stream.c (execute_command_event):
* event-stream.c (Fdispatch_event):
* event-stream.c (Fread_key_sequence):
* event-stream.c (dribble_out_event):
* event-stream.c (vars_of_event_stream):
* event-tty.c (tty_timeout_to_emacs_event):
* event-tty.c (emacs_tty_next_event):
* event-tty.c (emacs_tty_drain_queue):
* event-tty.c (reinit_vars_of_event_tty):
* event-unixoid.c:
* event-unixoid.c (find_tty_or_stream_console_from_fd):
* event-unixoid.c (read_event_from_tty_or_stream_desc):
* event-unixoid.c (drain_tty_devices):
* event-unixoid.c (poll_fds_for_input):
* events.c:
* events.c (deinitialize_event):
* events.c (zero_event):
* events.c (mark_event):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* events.c (event_hash):
* events.c (Fmake_event):
* events.c (Fdeallocate_event):
* events.c (Fcopy_event):
* events.c (map_event_chain_remove):
* events.c (character_to_event):
* events.c (event_to_character):
* events.c (Fevent_to_character):
* events.c (format_event_object):
* events.c (upshift_event):
* events.c (downshift_event):
* events.c (event_upshifted_p):
* events.c (Fevent_live_p):
* events.c (Fevent_type):
* events.c (Fevent_timestamp):
* events.c (CHECK_EVENT_TYPE):
* events.c (CHECK_EVENT_TYPE2):
* events.c (CHECK_EVENT_TYPE3):
* events.c (Fevent_key):
* events.c (Fevent_button):
* events.c (Fevent_modifier_bits):
* events.c (event_x_y_pixel_internal):
* events.c (event_pixel_translation):
* events.c (Fevent_process):
* events.c (Fevent_function):
* events.c (Fevent_object):
* events.c (Fevent_properties):
* events.c (syms_of_events):
* events.c (vars_of_events):
* events.h:
* events.h (struct event_stream):
* events.h (struct Lisp_Key_Data):
* events.h (KEY_DATA_KEYSYM):
* events.h (EVENT_KEY_KEYSYM):
* events.h (struct Lisp_Button_Data):
* events.h (EVENT_BUTTON_BUTTON):
* events.h (struct Lisp_Motion_Data):
* events.h (EVENT_MOTION_X):
* events.h (struct Lisp_Process_Data):
* events.h (EVENT_PROCESS_PROCESS):
* events.h (struct Lisp_Timeout_Data):
* events.h (EVENT_TIMEOUT_INTERVAL_ID):
* events.h (struct Lisp_Eval_Data):
* events.h (EVENT_EVAL_FUNCTION):
* events.h (struct Lisp_Misc_User_Data):
* events.h (EVENT_MISC_USER_FUNCTION):
* events.h (struct Lisp_Magic_Eval_Data):
* events.h (EVENT_MAGIC_EVAL_INTERNAL_FUNCTION):
* events.h (struct Lisp_Magic_Data):
* events.h (EVENT_MAGIC_UNDERLYING):
* events.h (EVENT_MAGIC_GDK_EVENT):
* events.h (struct Lisp_Event):
* events.h (XEVENT_CHANNEL):
* events.h (SET_EVENT_TIMESTAMP_ZERO):
* events.h (SET_EVENT_CHANNEL):
* events.h (SET_EVENT_NEXT):
* events.h (XSET_EVENT_TYPE):
* events.h (struct command_builder):
* extents.c:
* extents.c (gap_array_adjust_markers):
* extents.c (gap_array_recompute_derived_values):
* extents.c (gap_array_move_gap):
* extents.c (gap_array_make_gap):
* extents.c (gap_array_insert_els):
* extents.c (gap_array_delete_els):
* extents.c (gap_array_make_marker):
* extents.c (gap_array_delete_marker):
* extents.c (gap_array_move_marker):
* extents.c (make_gap_array):
* extents.c (free_gap_array):
* extents.c (extent_list_num_els):
* extents.c (extent_list_insert):
* extents.c (mark_extent_auxiliary):
* extents.c (allocate_extent_auxiliary):
* extents.c (decode_extent_at_flag):
* extents.c (verify_extent_mapper):
* extents.c (symbol_to_glyph_layout):
* extents.c (syms_of_extents):
* faces.c:
* file-coding.c:
* file-coding.c (struct_detector_category_description =):
* file-coding.c (detector_category_dynarr_description_1):
* file-coding.c (struct_detector_description =):
* file-coding.c (detector_dynarr_description_1):
* file-coding.c (MARKED_SLOT):
* file-coding.c (mark_coding_system):
* file-coding.c (coding_system_extra_description_map):
* file-coding.c (coding_system_description):
* file-coding.c (allocate_coding_system):
* file-coding.c (symbol_to_eol_type):
* file-coding.c (Fcoding_system_aliasee):
* file-coding.c (set_coding_stream_coding_system):
* file-coding.c (struct convert_eol_coding_system):
* file-coding.c (struct undecided_coding_system):
* file-coding.c (undecided_mark_coding_stream):
* file-coding.c (coding_category_symbol_to_id):
* file-coding.c (struct gzip_coding_system):
* file-coding.c (coding_system_type_create):
* file-coding.h:
* file-coding.h (struct Lisp_Coding_System):
* file-coding.h (CODING_SYSTEM_SLOT_DECLARATION):
* file-coding.h (coding_system_variant):
* file-coding.h (struct coding_system_methods):
* file-coding.h (DEFINE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (struct coding_stream):
* fileio.c (Fsubstitute_in_file_name):
* floatfns.c:
* fns.c:
* fns.c (base64_encode_1):
* frame-gtk.c:
* frame-gtk.c (Fgtk_start_drag_internal):
* frame-impl.h (struct frame):
* frame-impl.h (MARKED_SLOT):
* frame-msw.c:
* frame-x.c:
* frame-x.c (Fcde_start_drag_internal):
* frame-x.c (Foffix_start_drag_internal):
* frame.c:
* frame.c (MARKED_SLOT):
* frame.c (allocate_frame_core):
* frame.c (delete_frame_internal):
* frame.c (Fmouse_position_as_motion_event):
* frameslots.h:
* frameslots.h (MARKED_SLOT_ARRAY):
* free-hook.c:
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-x.c:
* glyphs-x.c (convert_EImage_to_XImage):
* glyphs.c:
* glyphs.c (process_image_string_instantiator):
* glyphs.c (mark_image_instance):
* glyphs.c (allocate_image_instance):
* glyphs.c (unmap_subwindow):
* glyphs.c (map_subwindow):
* glyphs.c (syms_of_glyphs):
* glyphs.c (specifier_type_create_image):
* glyphs.h:
* glyphs.h (struct text_image_instance):
* glyphs.h (struct Lisp_Image_Instance):
* gmalloc.c:
* gmalloc.c ("C"):
* gpmevent.c (Freceive_gpm_event):
* gpmevent.c (gpm_next_event_cb):
* gpmevent.c (vars_of_gpmevent):
* gtk-glue.c (gdk_event_to_emacs_event):
* gtk-xemacs.c (gtk_xemacs_class_init):
* gui-msw.c:
* gui-msw.c (mswindows_handle_gui_wm_command):
* gui-msw.c (mswindows_translate_menu_or_dialog_item):
* gui-x.c:
* gui-x.c (mark_popup_data):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (gcpro_popup_callbacks):
* gui-x.c (ungcpro_popup_callbacks):
* gui-x.c (free_popup_widget_value_tree):
* gui-x.c (popup_selection_callback):
* gui-x.h:
* gui-x.h (struct popup_data):
* gui.c:
* gui.c (allocate_gui_item):
* gutter.c (decode_gutter_position):
* hash.c (NULL_ENTRY):
* indent.c (vmotion_1):
* indent.c (vmotion_pixels):
* input-method-motif.c (res):
* input-method-xlib.c (IMInstantiateCallback):
* input-method-xlib.c (XIM_init_device):
* input-method-xlib.c (res):
* intl-encap-win32.c:
* intl-encap-win32.c (qxeSHGetDataFromIDList):
* intl-win32.c:
* intl-win32.c (mswindows_multibyte_cp_type):
* intl-win32.c (struct mswindows_multibyte_coding_system):
* keymap.c:
* keymap.c (make_key_description):
* keymap.c (keymap_store):
* keymap.c (get_keyelt):
* keymap.c (keymap_lookup_1):
* keymap.c (define_key_parser):
* keymap.c (key_desc_list_to_event):
* keymap.c (event_matches_key_specifier_p):
* keymap.c (meta_prefix_char_p):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fdefine_key):
* keymap.c (struct raw_lookup_key_mapper_closure):
* keymap.c (raw_lookup_key):
* keymap.c (raw_lookup_key_mapper):
* keymap.c (lookup_keys):
* keymap.c (lookup_events):
* keymap.c (Flookup_key):
* keymap.c (struct map_keymap_unsorted_closure):
* keymap.c (map_keymap_unsorted_mapper):
* keymap.c (map_keymap_sorted):
* keymap.c (map_keymap_mapper):
* keymap.c (map_keymap):
* keymap.c (accessible_keymaps_mapper_1):
* keymap.c (Faccessible_keymaps):
* keymap.c (Fsingle_key_description):
* keymap.c (raw_keys_to_keys):
* keymap.c (format_raw_keys):
* keymap.c (where_is_recursive_mapper):
* keymap.c (where_is_internal):
* keymap.c (describe_map_mapper_shadow_search):
* keymap.c (keymap_lookup_inherited_mapper):
* keymap.c (describe_map_mapper):
* keymap.h (event_matches_key_specifier_p):
* lisp.h:
* lisp.h (this):
* lisp.h (RETURN_NOT_REACHED):
* lisp.h (struct Lisp_Vector):
* lisp.h (struct Lisp_Bit_Vector):
* lisp.h (UNGCPRO_1):
* lisp.h (NUNGCPRO):
* lisp.h (NNUNGCPRO):
* lisp.h (DECLARE_INLINE_HEADER):
* lrecord.h:
* lrecord.h (struct lrecord_header):
* lrecord.h (struct lcrecord_header):
* lrecord.h (lrecord_type):
* lrecord.h (struct lrecord_implementation):
* lrecord.h (RECORD_DUMPABLE):
* lrecord.h (memory_description_type):
* lrecord.h (data_description_entry_flags):
* lrecord.h (struct memory_description):
* lrecord.h (struct sized_memory_description):
* lrecord.h (XD_INDIRECT):
* lrecord.h (XD_IS_INDIRECT):
* lrecord.h (XD_DYNARR_DESC):
* lrecord.h (DEFINE_BASIC_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION):
* lrecord.h (alloc_lcrecord_type):
* lstream.c:
* lstream.c (Lstream_new):
* lstream.c (lisp_buffer_marker):
* lstream.h:
* lstream.h (lstream_implementation):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
* marker.c:
* marker.c (copy_marker_1):
* mem-limits.h:
* menubar-gtk.c:
* menubar-gtk.c (gtk_popup_menu):
* menubar-msw.c:
* menubar-msw.c (mswindows_popup_menu):
* menubar-x.c (make_dummy_xbutton_event):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (menu_accelerator_safe_compare):
* menubar-x.c (menu_accelerator_safe_mod_compare):
* mule-charset.c:
* mule-charset.c (make_charset):
* mule-charset.c (Fcharset_property):
* mule-coding.c:
* mule-coding.c (ccs_description_1):
* mule-coding.c (ccs_description =):
* mule-coding.c (ccsd_description_1):
* mule-coding.c (ccsd_description =):
* nt.c (getpwnam):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_is_executable):
* nt.c (read_unc_volume):
* nt.c (mswindows_access):
* nt.c (mswindows_link):
* nt.c (mswindows_fstat):
* nt.c (mswindows_stat):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* nt.c (Fmswindows_long_file_name):
* objects-impl.h (struct Lisp_Color_Instance):
* objects-impl.h (struct Lisp_Font_Instance):
* objects-tty.c:
* objects-x.c (allocate_nearest_color):
* objects.c:
* objects.c (Fmake_color_instance):
* objects.c (Fmake_font_instance):
* objects.c (font_instantiate):
* opaque.c:
* opaque.c (make_opaque):
* opaque.c (make_opaque_ptr):
* opaque.c (reinit_opaque_early):
* opaque.c (init_opaque_once_early):
* print.c:
* print.c (printing_badness):
* print.c (printing_major_badness):
* print.c (print_internal):
* print.c (debug_p4):
* print.c (dp):
* print.c (debug_backtrace):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-unix.c:
* process-unix.c (struct unix_process_data):
* process-unix.c (get_internet_address):
* process-unix.c (unix_alloc_process_data):
* process-unix.c (unix_create_process):
* process-unix.c (try_to_initialize_subtty):
* process-unix.c (unix_kill_child_process):
* process-unix.c (process_type_create_unix):
* process.c:
* process.c (mark_process):
* process.c (MARKED_SLOT):
* process.c (make_process_internal):
* process.c (Fprocess_tty_name):
* process.c (decode_signal):
* process.h:
* procimpl.h:
* procimpl.h (struct process_methods):
* procimpl.h (struct Lisp_Process):
* rangetab.c:
* realpath.c (readlink_and_correct_case):
* redisplay-x.c (x_window_output_end):
* redisplay-x.c (x_redraw_exposed_area):
* redisplay-x.c (x_clear_frame):
* redisplay.c:
* redisplay.h:
* redisplay.h (struct rune_dglyph):
* redisplay.h (struct rune):
* scrollbar.c:
* scrollbar.c (create_scrollbar_instance):
* specifier.c:
* specifier.c (specifier_empty_extra_description_1):
* specifier.c (make_specifier_internal):
* specifier.c (decode_locale_type):
* specifier.c (decode_how_to_add_specification):
* specifier.h:
* specifier.h (struct specifier_methods):
* specifier.h (DEFINE_SPECIFIER_TYPE_WITH_DATA):
* specifier.h (INITIALIZE_SPECIFIER_TYPE_WITH_DATA):
* symbols.c:
* symbols.c (Fsetplist):
* symbols.c (default_value):
* symbols.c (decode_magic_handler_type):
* symbols.c (handler_type_from_function_symbol):
* symbols.c (Fdefvaralias):
* symbols.c (init_symbols_once_early):
* symbols.c (reinit_symbols_early):
* symsinit.h:
* sysdep.c (sys_subshell):
* sysdep.c (tty_init_sys_modes_on_device):
* syswindows.h:
* text.c (dfc_convert_to_external_format):
* text.c (dfc_convert_to_internal_format):
* text.c (reinit_eistring_early):
* text.c (init_eistring_once_early):
* text.c (reinit_vars_of_text):
* text.h:
* text.h (INC_IBYTEPTR_FMT):
* text.h (DEC_IBYTEPTR_FMT):
* toolbar.c:
* toolbar.c (decode_toolbar_position):
* tooltalk.c:
* ui-gtk.c:
* unexnt.c:
* unexnt.c (_start):
* unexnt.c (unexec):
* unexnt.c (get_section_info):
* unicode.c:
* unicode.c (vars_of_unicode):
* window.c:
* window.c (allocate_window):
* window.c (new_window_mirror):
* window.c (update_mirror_internal):
* winslots.h:
author | michaels |
---|---|
date | Sun, 12 Jan 2003 11:08:22 +0000 |
parents | 0dade3314f4f |
children | 19738a2a5138 |
rev | line source |
---|---|
428 | 1 /* Database access routines |
2 Copyright (C) 1996, William M. Perry | |
793 | 3 Copyright (C) 2001, 2002 Ben Wing. |
428 | 4 |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
24 /* Written by Bill Perry */ | |
25 /* Substantially rewritten by Martin Buchholz */ | |
26 /* db 2.x support added by Andreas Jaeger */ | |
771 | 27 /* Mule-ized 6-22-00 Ben Wing */ |
428 | 28 |
29 #include <config.h> | |
30 #include "lisp.h" | |
771 | 31 |
428 | 32 #include "sysfile.h" |
33 #include "buffer.h" | |
34 | |
35 #ifndef HAVE_DATABASE | |
36 #error HAVE_DATABASE not defined!! | |
37 #endif | |
38 | |
39 #include "database.h" /* Our include file */ | |
40 | |
41 #ifdef HAVE_BERKELEY_DB | |
42 /* Work around Berkeley DB's use of int types which are defined | |
43 slightly differently in the not quite yet standard <inttypes.h>. | |
44 See db.h for details of why we're resorting to this... */ | |
45 /* glibc 2.1 doesn't have this problem with DB 2.x */ | |
46 #if !(defined __GLIBC__ && __GLIBC_MINOR__ >= 1) | |
47 #ifdef HAVE_INTTYPES_H | |
48 #define __BIT_TYPES_DEFINED__ | |
49 #include <inttypes.h> | |
50 typedef uint8_t u_int8_t; | |
51 typedef uint16_t u_int16_t; | |
52 typedef uint32_t u_int32_t; | |
53 #ifdef WE_DONT_NEED_QUADS | |
54 typedef uint64_t u_int64_t; | |
55 #endif /* WE_DONT_NEED_QUADS */ | |
56 #endif /* HAVE_INTTYPES_H */ | |
57 #endif /* !(defined __GLIBC__ && __GLIBC_MINOR__ >= 1) */ | |
442 | 58 #include DB_H_FILE /* Berkeley db's header file */ |
428 | 59 #ifndef DB_VERSION_MAJOR |
60 # define DB_VERSION_MAJOR 1 | |
61 #endif /* DB_VERSION_MAJOR */ | |
1141 | 62 #ifndef DB_VERSION_MINOR |
63 # define DB_VERSION_MINOR 0 | |
64 #endif /* DB_VERSION_MINOR */ | |
428 | 65 Lisp_Object Qberkeley_db; |
66 Lisp_Object Qhash, Qbtree, Qrecno, Qunknown; | |
448 | 67 #if DB_VERSION_MAJOR > 2 |
68 Lisp_Object Qqueue; | |
69 #endif | |
428 | 70 #endif /* HAVE_BERKELEY_DB */ |
71 | |
72 #ifdef HAVE_DBM | |
73 #include <ndbm.h> | |
74 Lisp_Object Qdbm; | |
75 #endif /* HAVE_DBM */ | |
76 | |
77 Lisp_Object Vdatabase_coding_system; | |
78 | |
79 Lisp_Object Qdatabasep; | |
80 | |
81 typedef struct | |
82 { | |
83 Lisp_Object (*get_subtype) (Lisp_Database *); | |
84 Lisp_Object (*get_type) (Lisp_Database *); | |
85 Lisp_Object (*get) (Lisp_Database *, Lisp_Object); | |
86 int (*put) (Lisp_Database *, Lisp_Object, Lisp_Object, Lisp_Object); | |
87 int (*rem) (Lisp_Database *, Lisp_Object); | |
88 void (*map) (Lisp_Database *, Lisp_Object); | |
89 void (*close) (Lisp_Database *); | |
90 Lisp_Object (*last_error) (Lisp_Database *); | |
91 } DB_FUNCS; | |
92 | |
93 struct Lisp_Database | |
94 { | |
95 struct lcrecord_header header; | |
96 Lisp_Object fname; | |
97 int mode; | |
98 int access_; | |
99 int dberrno; | |
100 int live_p; | |
101 #ifdef HAVE_DBM | |
102 DBM *dbm_handle; | |
103 #endif | |
104 #ifdef HAVE_BERKELEY_DB | |
105 DB *db_handle; | |
106 #endif | |
107 DB_FUNCS *funcs; | |
108 Lisp_Object coding_system; | |
109 }; | |
110 | |
111 #define XDATABASE(x) XRECORD (x, database, Lisp_Database) | |
617 | 112 #define wrap_database(p) wrap_record (p, database) |
428 | 113 #define DATABASEP(x) RECORDP (x, database) |
114 #define CHECK_DATABASE(x) CHECK_RECORD (x, database) | |
115 #define CONCHECK_DATABASE(x) CONCHECK_RECORD (x, database) | |
116 #define DATABASE_LIVE_P(x) (x->live_p) | |
117 | |
118 #define CHECK_LIVE_DATABASE(db) do { \ | |
119 CHECK_DATABASE (db); \ | |
120 if (!DATABASE_LIVE_P (XDATABASE(db))) \ | |
563 | 121 invalid_operation ("Attempting to access closed database", db); \ |
428 | 122 } while (0) |
123 | |
124 | |
125 static Lisp_Database * | |
126 allocate_database (void) | |
127 { | |
128 Lisp_Database *db = alloc_lcrecord_type (Lisp_Database, &lrecord_database); | |
129 | |
130 db->fname = Qnil; | |
131 db->live_p = 0; | |
132 #ifdef HAVE_BERKELEY_DB | |
133 db->db_handle = NULL; | |
134 #endif | |
135 #ifdef HAVE_DBM | |
136 db->dbm_handle = NULL; | |
137 #endif | |
138 db->access_ = 0; | |
139 db->mode = 0; | |
140 db->dberrno = 0; | |
771 | 141 db->coding_system = Qnil; |
428 | 142 return db; |
143 } | |
144 | |
1204 | 145 static const struct memory_description database_description[] = { |
934 | 146 { XD_LISP_OBJECT, offsetof (struct Lisp_Database, fname) }, |
147 { XD_END} | |
148 }; | |
149 | |
428 | 150 static Lisp_Object |
444 | 151 mark_database (Lisp_Object object) |
428 | 152 { |
444 | 153 Lisp_Database *db = XDATABASE (object); |
428 | 154 return db->fname; |
155 } | |
156 | |
157 static void | |
158 print_database (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) | |
159 { | |
160 Lisp_Database *db = XDATABASE (obj); | |
161 | |
162 if (print_readably) | |
563 | 163 printing_unreadable_object ("#<database 0x%x>", db->header.uid); |
428 | 164 |
793 | 165 write_fmt_string_lisp (printcharfun, "#<database \"%s\" (%s/%s/", |
166 3, db->fname, db->funcs->get_type (db), | |
167 db->funcs->get_subtype (db)); | |
168 | |
169 write_fmt_string (printcharfun, "%s) 0x%x>", | |
170 (!DATABASE_LIVE_P (db) ? "closed" : | |
171 (db->access_ & O_WRONLY) ? "writeonly" : | |
172 (db->access_ & O_RDWR) ? "readwrite" : "readonly"), | |
173 db->header.uid); | |
428 | 174 } |
175 | |
176 static void | |
177 finalize_database (void *header, int for_disksave) | |
178 { | |
179 Lisp_Database *db = (Lisp_Database *) header; | |
180 | |
181 if (for_disksave) | |
182 { | |
563 | 183 invalid_operation |
793 | 184 ("Can't dump an emacs containing database objects", |
185 wrap_database (db)); | |
428 | 186 } |
187 db->funcs->close (db); | |
188 } | |
189 | |
934 | 190 DEFINE_LRECORD_IMPLEMENTATION ("database", database, |
191 0, /*dumpable-flag*/ | |
192 mark_database, print_database, | |
193 finalize_database, 0, 0, | |
194 database_description, | |
195 Lisp_Database); | |
428 | 196 |
197 DEFUN ("close-database", Fclose_database, 1, 1, 0, /* | |
198 Close database DATABASE. | |
199 */ | |
200 (database)) | |
201 { | |
202 Lisp_Database *db; | |
203 CHECK_LIVE_DATABASE (database); | |
204 db = XDATABASE (database); | |
205 db->funcs->close (db); | |
206 db->live_p = 0; | |
207 return Qnil; | |
208 } | |
209 | |
210 DEFUN ("database-type", Fdatabase_type, 1, 1, 0, /* | |
211 Return the type of database DATABASE. | |
212 */ | |
213 (database)) | |
214 { | |
215 CHECK_DATABASE (database); | |
216 | |
217 return XDATABASE (database)->funcs->get_type (XDATABASE (database)); | |
218 } | |
219 | |
220 DEFUN ("database-subtype", Fdatabase_subtype, 1, 1, 0, /* | |
221 Return the subtype of database DATABASE, if any. | |
222 */ | |
223 (database)) | |
224 { | |
225 CHECK_DATABASE (database); | |
226 | |
227 return XDATABASE (database)->funcs->get_subtype (XDATABASE (database)); | |
228 } | |
229 | |
230 DEFUN ("database-live-p", Fdatabase_live_p, 1, 1, 0, /* | |
444 | 231 Return t if OBJECT is an active database. |
428 | 232 */ |
444 | 233 (object)) |
428 | 234 { |
444 | 235 return DATABASEP (object) && DATABASE_LIVE_P (XDATABASE (object)) ? |
236 Qt : Qnil; | |
428 | 237 } |
238 | |
239 DEFUN ("database-file-name", Fdatabase_file_name, 1, 1, 0, /* | |
240 Return the filename associated with the database DATABASE. | |
241 */ | |
242 (database)) | |
243 { | |
244 CHECK_DATABASE (database); | |
245 | |
246 return XDATABASE (database)->fname; | |
247 } | |
248 | |
249 DEFUN ("databasep", Fdatabasep, 1, 1, 0, /* | |
444 | 250 Return t if OBJECT is a database. |
428 | 251 */ |
444 | 252 (object)) |
428 | 253 { |
444 | 254 return DATABASEP (object) ? Qt : Qnil; |
428 | 255 } |
256 | |
257 #ifdef HAVE_DBM | |
258 static void | |
259 dbm_map (Lisp_Database *db, Lisp_Object func) | |
260 { | |
261 datum keydatum, valdatum; | |
262 Lisp_Object key, val; | |
263 | |
264 for (keydatum = dbm_firstkey (db->dbm_handle); | |
265 keydatum.dptr != NULL; | |
266 keydatum = dbm_nextkey (db->dbm_handle)) | |
267 { | |
268 valdatum = dbm_fetch (db->dbm_handle, keydatum); | |
771 | 269 key = make_ext_string (keydatum.dptr, keydatum.dsize, |
270 db->coding_system); | |
271 val = make_ext_string (valdatum.dptr, valdatum.dsize, | |
272 db->coding_system); | |
428 | 273 call2 (func, key, val); |
274 } | |
275 } | |
276 | |
277 static Lisp_Object | |
278 dbm_get (Lisp_Database *db, Lisp_Object key) | |
279 { | |
280 datum keydatum, valdatum; | |
281 | |
771 | 282 TO_EXTERNAL_FORMAT (LISP_STRING, key, |
283 ALLOCA, (keydatum.dptr, keydatum.dsize), | |
284 db->coding_system); | |
428 | 285 valdatum = dbm_fetch (db->dbm_handle, keydatum); |
286 | |
287 return (valdatum.dptr | |
771 | 288 ? make_ext_string (valdatum.dptr, valdatum.dsize, |
289 db->coding_system) | |
428 | 290 : Qnil); |
291 } | |
292 | |
293 static int | |
294 dbm_put (Lisp_Database *db, | |
295 Lisp_Object key, Lisp_Object val, Lisp_Object replace) | |
296 { | |
297 datum keydatum, valdatum; | |
298 | |
771 | 299 TO_EXTERNAL_FORMAT (LISP_STRING, val, |
300 ALLOCA, (valdatum.dptr, valdatum.dsize), | |
301 db->coding_system); | |
302 TO_EXTERNAL_FORMAT (LISP_STRING, key, | |
303 ALLOCA, (keydatum.dptr, keydatum.dsize), | |
304 db->coding_system); | |
428 | 305 |
306 return !dbm_store (db->dbm_handle, keydatum, valdatum, | |
307 NILP (replace) ? DBM_INSERT : DBM_REPLACE); | |
308 } | |
309 | |
310 static int | |
311 dbm_remove (Lisp_Database *db, Lisp_Object key) | |
312 { | |
313 datum keydatum; | |
314 | |
771 | 315 TO_EXTERNAL_FORMAT (LISP_STRING, key, |
316 ALLOCA, (keydatum.dptr, keydatum.dsize), | |
317 db->coding_system); | |
428 | 318 |
319 return dbm_delete (db->dbm_handle, keydatum); | |
320 } | |
321 | |
322 static Lisp_Object | |
323 dbm_type (Lisp_Database *db) | |
324 { | |
325 return Qdbm; | |
326 } | |
327 | |
328 static Lisp_Object | |
329 dbm_subtype (Lisp_Database *db) | |
330 { | |
331 return Qnil; | |
332 } | |
333 | |
334 static Lisp_Object | |
335 dbm_lasterr (Lisp_Database *db) | |
336 { | |
337 return lisp_strerror (db->dberrno); | |
338 } | |
339 | |
340 static void | |
341 dbm_closeit (Lisp_Database *db) | |
342 { | |
343 if (db->dbm_handle) | |
344 { | |
345 dbm_close (db->dbm_handle); | |
346 db->dbm_handle = NULL; | |
347 } | |
348 } | |
349 | |
350 static DB_FUNCS ndbm_func_block = | |
351 { | |
352 dbm_subtype, | |
353 dbm_type, | |
354 dbm_get, | |
355 dbm_put, | |
356 dbm_remove, | |
357 dbm_map, | |
358 dbm_closeit, | |
359 dbm_lasterr | |
360 }; | |
361 #endif /* HAVE_DBM */ | |
362 | |
363 #ifdef HAVE_BERKELEY_DB | |
364 static Lisp_Object | |
365 berkdb_type (Lisp_Database *db) | |
366 { | |
367 return Qberkeley_db; | |
368 } | |
369 | |
370 static Lisp_Object | |
371 berkdb_subtype (Lisp_Database *db) | |
372 { | |
373 if (!db->db_handle) | |
374 return Qnil; | |
375 | |
376 switch (db->db_handle->type) | |
377 { | |
378 case DB_BTREE: return Qbtree; | |
379 case DB_HASH: return Qhash; | |
380 case DB_RECNO: return Qrecno; | |
448 | 381 #if DB_VERSION_MAJOR > 2 |
382 case DB_QUEUE: return Qqueue; | |
383 #endif | |
428 | 384 default: return Qunknown; |
385 } | |
386 } | |
387 | |
388 static Lisp_Object | |
389 berkdb_lasterr (Lisp_Database *db) | |
390 { | |
391 return lisp_strerror (db->dberrno); | |
392 } | |
393 | |
394 static Lisp_Object | |
395 berkdb_get (Lisp_Database *db, Lisp_Object key) | |
396 { | |
397 DBT keydatum, valdatum; | |
398 int status = 0; | |
399 | |
400 /* DB Version 2 requires DBT's to be zeroed before use. */ | |
401 xzero (keydatum); | |
402 xzero (valdatum); | |
403 | |
771 | 404 TO_EXTERNAL_FORMAT (LISP_STRING, key, |
405 ALLOCA, (keydatum.data, keydatum.size), | |
406 db->coding_system); | |
428 | 407 |
408 #if DB_VERSION_MAJOR == 1 | |
409 status = db->db_handle->get (db->db_handle, &keydatum, &valdatum, 0); | |
410 #else | |
411 status = db->db_handle->get (db->db_handle, NULL, &keydatum, &valdatum, 0); | |
412 #endif /* DB_VERSION_MAJOR */ | |
413 | |
414 if (!status) | |
771 | 415 return make_ext_string (valdatum.data, valdatum.size, |
416 db->coding_system); | |
428 | 417 |
418 #if DB_VERSION_MAJOR == 1 | |
419 db->dberrno = (status == 1) ? -1 : errno; | |
420 #else | |
421 db->dberrno = (status < 0) ? -1 : errno; | |
422 #endif /* DB_VERSION_MAJOR */ | |
423 | |
424 return Qnil; | |
425 } | |
426 | |
427 static int | |
428 berkdb_put (Lisp_Database *db, | |
429 Lisp_Object key, | |
430 Lisp_Object val, | |
431 Lisp_Object replace) | |
432 { | |
433 DBT keydatum, valdatum; | |
434 int status = 0; | |
435 | |
436 /* DB Version 2 requires DBT's to be zeroed before use. */ | |
437 xzero (keydatum); | |
438 xzero (valdatum); | |
439 | |
771 | 440 TO_EXTERNAL_FORMAT (LISP_STRING, key, |
441 ALLOCA, (keydatum.data, keydatum.size), | |
442 db->coding_system); | |
443 TO_EXTERNAL_FORMAT (LISP_STRING, val, | |
444 ALLOCA, (valdatum.data, valdatum.size), | |
445 db->coding_system); | |
428 | 446 #if DB_VERSION_MAJOR == 1 |
447 status = db->db_handle->put (db->db_handle, &keydatum, &valdatum, | |
448 NILP (replace) ? R_NOOVERWRITE : 0); | |
449 db->dberrno = (status == 1) ? -1 : errno; | |
450 #else | |
451 status = db->db_handle->put (db->db_handle, NULL, &keydatum, &valdatum, | |
452 NILP (replace) ? DB_NOOVERWRITE : 0); | |
453 db->dberrno = (status < 0) ? -1 : errno; | |
454 #endif/* DV_VERSION_MAJOR = 2 */ | |
455 | |
456 return status; | |
457 } | |
458 | |
459 static int | |
460 berkdb_remove (Lisp_Database *db, Lisp_Object key) | |
461 { | |
462 DBT keydatum; | |
463 int status; | |
464 | |
465 /* DB Version 2 requires DBT's to be zeroed before use. */ | |
466 xzero (keydatum); | |
467 | |
771 | 468 TO_EXTERNAL_FORMAT (LISP_STRING, key, |
469 ALLOCA, (keydatum.data, keydatum.size), | |
470 db->coding_system); | |
428 | 471 |
472 #if DB_VERSION_MAJOR == 1 | |
473 status = db->db_handle->del (db->db_handle, &keydatum, 0); | |
474 #else | |
475 status = db->db_handle->del (db->db_handle, NULL, &keydatum, 0); | |
476 #endif /* DB_VERSION_MAJOR */ | |
477 | |
478 if (!status) | |
479 return 0; | |
480 | |
481 #if DB_VERSION_MAJOR == 1 | |
482 db->dberrno = (status == 1) ? -1 : errno; | |
483 #else | |
484 db->dberrno = (status < 0) ? -1 : errno; | |
485 #endif /* DB_VERSION_MAJOR */ | |
486 | |
487 return 1; | |
488 } | |
489 | |
490 static void | |
491 berkdb_map (Lisp_Database *db, Lisp_Object func) | |
492 { | |
493 DBT keydatum, valdatum; | |
494 Lisp_Object key, val; | |
495 DB *dbp = db->db_handle; | |
496 int status; | |
497 | |
498 xzero (keydatum); | |
499 xzero (valdatum); | |
500 | |
501 #if DB_VERSION_MAJOR == 1 | |
502 for (status = dbp->seq (dbp, &keydatum, &valdatum, R_FIRST); | |
503 status == 0; | |
504 status = dbp->seq (dbp, &keydatum, &valdatum, R_NEXT)) | |
505 { | |
771 | 506 key = make_ext_string (keydatum.data, keydatum.size, |
507 db->coding_system); | |
508 val = make_ext_string (valdatum.data, valdatum.size, | |
509 db->coding_system); | |
428 | 510 call2 (func, key, val); |
511 } | |
512 #else | |
513 { | |
514 DBC *dbcp; | |
515 | |
516 #if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >=6 | |
517 status = dbp->cursor (dbp, NULL, &dbcp, 0); | |
518 #else | |
519 status = dbp->cursor (dbp, NULL, &dbcp); | |
440 | 520 #endif |
428 | 521 for (status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_FIRST); |
522 status == 0; | |
523 status = dbcp->c_get (dbcp, &keydatum, &valdatum, DB_NEXT)) | |
524 { | |
771 | 525 key = make_ext_string (keydatum.data, keydatum.size, |
526 db->coding_system); | |
527 val = make_ext_string (valdatum.data, valdatum.size, | |
528 db->coding_system); | |
428 | 529 call2 (func, key, val); |
530 } | |
531 dbcp->c_close (dbcp); | |
532 } | |
533 #endif /* DB_VERSION_MAJOR */ | |
534 } | |
535 | |
536 static void | |
537 berkdb_close (Lisp_Database *db) | |
538 { | |
539 if (db->db_handle) | |
540 { | |
541 #if DB_VERSION_MAJOR == 1 | |
542 db->db_handle->sync (db->db_handle, 0); | |
543 db->db_handle->close (db->db_handle); | |
544 #else | |
545 db->db_handle->sync (db->db_handle, 0); | |
546 db->db_handle->close (db->db_handle, 0); | |
547 #endif /* DB_VERSION_MAJOR */ | |
548 db->db_handle = NULL; | |
549 } | |
550 } | |
551 | |
552 static DB_FUNCS berk_func_block = | |
553 { | |
554 berkdb_subtype, | |
555 berkdb_type, | |
556 berkdb_get, | |
557 berkdb_put, | |
558 berkdb_remove, | |
559 berkdb_map, | |
560 berkdb_close, | |
561 berkdb_lasterr | |
562 }; | |
563 #endif /* HAVE_BERKELEY_DB */ | |
564 | |
565 DEFUN ("database-last-error", Fdatabase_last_error, 0, 1, 0, /* | |
566 Return the last error associated with DATABASE. | |
567 */ | |
568 (database)) | |
569 { | |
570 if (NILP (database)) | |
571 return lisp_strerror (errno); | |
572 | |
573 CHECK_DATABASE (database); | |
574 | |
575 return XDATABASE (database)->funcs->last_error (XDATABASE (database)); | |
576 } | |
577 | |
771 | 578 DEFUN ("open-database", Fopen_database, 1, 6, 0, /* |
428 | 579 Return a new database object opened on FILE. |
580 Optional arguments TYPE and SUBTYPE specify the database type. | |
581 Optional argument ACCESS specifies the access rights, which may be any | |
582 combination of 'r' 'w' and '+', for read, write, and creation flags. | |
583 Optional argument MODE gives the permissions to use when opening FILE, | |
584 and defaults to 0755. | |
771 | 585 Optional argument CODESYS specifies the coding system used to encode/decode |
586 data passed to/from the database, and defaults to the value of the | |
587 variable `database-coding-system'. | |
428 | 588 */ |
771 | 589 (file, type, subtype, access_, mode, codesys)) |
428 | 590 { |
591 /* This function can GC */ | |
592 int modemask; | |
593 int accessmask = 0; | |
594 Lisp_Database *db = NULL; | |
595 char *filename; | |
596 struct gcpro gcpro1, gcpro2; | |
597 | |
598 CHECK_STRING (file); | |
599 GCPRO2 (file, access_); | |
600 file = Fexpand_file_name (file, Qnil); | |
601 UNGCPRO; | |
602 | |
440 | 603 TO_EXTERNAL_FORMAT (LISP_STRING, file, |
604 C_STRING_ALLOCA, filename, | |
605 Qfile_name); | |
428 | 606 |
607 if (NILP (access_)) | |
608 { | |
609 accessmask = O_RDWR | O_CREAT; | |
610 } | |
611 else | |
612 { | |
613 char *acc; | |
614 CHECK_STRING (access_); | |
615 acc = (char *) XSTRING_DATA (access_); | |
616 | |
617 if (strchr (acc, '+')) | |
618 accessmask |= O_CREAT; | |
619 | |
620 { | |
621 char *rp = strchr (acc, 'r'); | |
622 char *wp = strchr (acc, 'w'); | |
623 if (rp && wp) accessmask |= O_RDWR; | |
624 else if (wp) accessmask |= O_WRONLY; | |
625 else accessmask |= O_RDONLY; | |
626 } | |
627 } | |
628 | |
629 if (NILP (mode)) | |
630 { | |
631 modemask = 0755; /* rwxr-xr-x */ | |
632 } | |
633 else | |
634 { | |
635 CHECK_INT (mode); | |
636 modemask = XINT (mode); | |
637 } | |
638 | |
771 | 639 if (NILP (codesys)) |
640 codesys = Vdatabase_coding_system; | |
641 | |
642 codesys = get_coding_system_for_text_file (Vdatabase_coding_system, 1); | |
643 | |
428 | 644 #ifdef HAVE_DBM |
645 if (NILP (type) || EQ (type, Qdbm)) | |
646 { | |
647 DBM *dbase = dbm_open (filename, accessmask, modemask); | |
648 if (!dbase) | |
649 return Qnil; | |
650 | |
651 db = allocate_database (); | |
652 db->dbm_handle = dbase; | |
653 db->funcs = &ndbm_func_block; | |
771 | 654 db->coding_system = codesys; |
428 | 655 goto db_done; |
656 } | |
657 #endif /* HAVE_DBM */ | |
658 | |
659 #ifdef HAVE_BERKELEY_DB | |
660 if (NILP (type) || EQ (type, Qberkeley_db)) | |
661 { | |
662 DBTYPE real_subtype; | |
663 DB *dbase; | |
664 #if DB_VERSION_MAJOR != 1 | |
665 int status; | |
666 #endif | |
667 | |
668 if (EQ (subtype, Qhash) || NILP (subtype)) | |
669 real_subtype = DB_HASH; | |
670 else if (EQ (subtype, Qbtree)) | |
671 real_subtype = DB_BTREE; | |
672 else if (EQ (subtype, Qrecno)) | |
673 real_subtype = DB_RECNO; | |
448 | 674 #if DB_VERSION_MAJOR > 2 |
675 else if (EQ (subtype, Qqueue)) | |
676 real_subtype = DB_QUEUE; | |
677 #endif | |
428 | 678 else |
563 | 679 invalid_constant ("Unsupported subtype", subtype); |
428 | 680 |
681 #if DB_VERSION_MAJOR == 1 | |
682 dbase = dbopen (filename, accessmask, modemask, real_subtype, NULL); | |
683 if (!dbase) | |
684 return Qnil; | |
685 #else | |
686 /* Berkeley DB Version 2 has only the accessmask DB_CREATE and DB_RDONLY, | |
687 other flags shouldn't be set */ | |
688 if (NILP (access_)) | |
689 accessmask = DB_CREATE; | |
690 else | |
691 { | |
692 char *acc; | |
693 CHECK_STRING (access_); | |
694 acc = (char *) XSTRING_DATA (access_); | |
695 accessmask = 0; | |
696 | |
697 if (strchr (acc, '+')) | |
698 accessmask |= DB_CREATE; | |
699 | |
700 if (strchr (acc, 'r') && !strchr (acc, 'w')) | |
701 accessmask |= DB_RDONLY; | |
702 } | |
448 | 703 #if DB_VERSION_MAJOR == 2 |
428 | 704 status = db_open (filename, real_subtype, accessmask, |
705 modemask, NULL , NULL, &dbase); | |
706 if (status) | |
707 return Qnil; | |
448 | 708 #else |
709 status = db_create (&dbase, NULL, 0); | |
710 if (status) | |
711 return Qnil; | |
1141 | 712 #if DB_VERSION_MAJOR < 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 1) |
448 | 713 status = dbase->open (dbase, filename, NULL, |
714 real_subtype, accessmask, modemask); | |
1141 | 715 #else /* DB_VERSION >= 4.1 */ |
716 status = dbase->open (dbase, NULL, filename, NULL, real_subtype, | |
717 accessmask | DB_AUTO_COMMIT, modemask); | |
718 #endif /* DB_VERSION < 4.1 */ | |
448 | 719 if (status) |
720 { | |
721 dbase->close (dbase, 0); | |
722 return Qnil; | |
723 } | |
724 #endif /* DB_VERSION_MAJOR > 2 */ | |
725 /* Normalize into system specific file modes. Only for printing */ | |
726 accessmask = accessmask & DB_RDONLY ? O_RDONLY : O_RDWR; | |
428 | 727 #endif /* DB_VERSION_MAJOR */ |
728 | |
729 db = allocate_database (); | |
730 db->db_handle = dbase; | |
731 db->funcs = &berk_func_block; | |
771 | 732 db->coding_system = codesys; |
428 | 733 goto db_done; |
734 } | |
735 #endif /* HAVE_BERKELEY_DB */ | |
736 | |
563 | 737 invalid_constant ("Unsupported database type", type); |
428 | 738 return Qnil; |
739 | |
740 db_done: | |
741 db->live_p = 1; | |
742 db->fname = file; | |
743 db->mode = modemask; | |
744 db->access_ = accessmask; | |
745 | |
793 | 746 return wrap_database (db); |
428 | 747 } |
748 | |
749 DEFUN ("put-database", Fput_database, 3, 4, 0, /* | |
750 Store KEY and VALUE in DATABASE. | |
751 If optional fourth arg REPLACE is non-nil, | |
752 replace any existing entry in the database. | |
753 */ | |
754 (key, value, database, replace)) | |
755 { | |
756 CHECK_LIVE_DATABASE (database); | |
757 CHECK_STRING (key); | |
758 CHECK_STRING (value); | |
759 { | |
760 Lisp_Database *db = XDATABASE (database); | |
761 int status = db->funcs->put (db, key, value, replace); | |
762 return status ? Qt : Qnil; | |
763 } | |
764 } | |
765 | |
766 DEFUN ("remove-database", Fremove_database, 2, 2, 0, /* | |
767 Remove KEY from DATABASE. | |
768 */ | |
769 (key, database)) | |
770 { | |
771 CHECK_LIVE_DATABASE (database); | |
772 CHECK_STRING (key); | |
773 { | |
774 Lisp_Database *db = XDATABASE (database); | |
775 int status = db->funcs->rem (db, key); | |
776 return status ? Qt : Qnil; | |
777 } | |
778 } | |
779 | |
780 DEFUN ("get-database", Fget_database, 2, 3, 0, /* | |
781 Return value for KEY in DATABASE. | |
782 If there is no corresponding value, return DEFAULT (defaults to nil). | |
783 */ | |
784 (key, database, default_)) | |
785 { | |
786 CHECK_LIVE_DATABASE (database); | |
787 CHECK_STRING (key); | |
788 { | |
789 Lisp_Database *db = XDATABASE (database); | |
790 Lisp_Object retval = db->funcs->get (db, key); | |
791 return NILP (retval) ? default_ : retval; | |
792 } | |
793 } | |
794 | |
795 DEFUN ("map-database", Fmapdatabase, 2, 2, 0, /* | |
796 Map FUNCTION over entries in DATABASE, calling it with two args, | |
797 each key and value in the database. | |
798 */ | |
799 (function, database)) | |
800 { | |
801 CHECK_LIVE_DATABASE (database); | |
802 | |
803 XDATABASE (database)->funcs->map (XDATABASE (database), function); | |
804 | |
805 return Qnil; | |
806 } | |
807 | |
808 void | |
809 syms_of_database (void) | |
810 { | |
442 | 811 INIT_LRECORD_IMPLEMENTATION (database); |
812 | |
563 | 813 DEFSYMBOL (Qdatabasep); |
428 | 814 #ifdef HAVE_DBM |
563 | 815 DEFSYMBOL (Qdbm); |
428 | 816 #endif |
817 #ifdef HAVE_BERKELEY_DB | |
563 | 818 DEFSYMBOL (Qberkeley_db); |
819 DEFSYMBOL (Qhash); | |
820 DEFSYMBOL (Qbtree); | |
821 DEFSYMBOL (Qrecno); | |
448 | 822 #if DB_VERSION_MAJOR > 2 |
563 | 823 DEFSYMBOL (Qqueue); |
448 | 824 #endif |
563 | 825 DEFSYMBOL (Qunknown); |
428 | 826 #endif |
827 | |
828 DEFSUBR (Fopen_database); | |
829 DEFSUBR (Fdatabasep); | |
830 DEFSUBR (Fmapdatabase); | |
831 DEFSUBR (Fput_database); | |
832 DEFSUBR (Fget_database); | |
833 DEFSUBR (Fremove_database); | |
834 DEFSUBR (Fdatabase_type); | |
835 DEFSUBR (Fdatabase_subtype); | |
836 DEFSUBR (Fdatabase_last_error); | |
837 DEFSUBR (Fdatabase_live_p); | |
838 DEFSUBR (Fdatabase_file_name); | |
839 DEFSUBR (Fclose_database); | |
840 } | |
841 | |
842 void | |
843 vars_of_database (void) | |
844 { | |
845 #ifdef HAVE_DBM | |
846 Fprovide (Qdbm); | |
847 #endif | |
848 #ifdef HAVE_BERKELEY_DB | |
849 Fprovide (Qberkeley_db); | |
850 #endif | |
851 | |
852 DEFVAR_LISP ("database-coding-system", &Vdatabase_coding_system /* | |
771 | 853 Default coding system used to convert data in database files. |
428 | 854 */ ); |
771 | 855 Vdatabase_coding_system = Qnative; |
428 | 856 } |