comparison src/extents.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 ffabf70273fe
children f3437b56874d
comparison
equal deleted inserted replaced
1203:5f2f8dcbfb3e 1204:e22b0213b713
243 { 243 {
244 int pos; 244 int pos;
245 struct gap_array_marker *next; 245 struct gap_array_marker *next;
246 } Gap_Array_Marker; 246 } Gap_Array_Marker;
247 247
248
248 /* Holds a "gap array", which is an array of elements with a gap located 249 /* Holds a "gap array", which is an array of elements with a gap located
249 in it. Insertions and deletions with a high degree of locality 250 in it. Insertions and deletions with a high degree of locality
250 are very fast, essentially in constant time. Array positions as 251 are very fast, essentially in constant time. Array positions as
251 used and returned in the gap array functions are independent of 252 used and returned in the gap array functions are independent of
252 the gap. */ 253 the gap. */
253 254
255 /* Layout of gap array:
256
257 <------ gap ------><---- gapsize ----><----- numels - gap ---->
258 <---------------------- numels + gapsize --------------------->
259
260 For marking purposes, we use two extra variables computed from
261 the others -- the offset to the data past the gap, plus the number
262 of elements in that data:
263
264 offset_past_gap = elsize * (gap + gapsize)
265 els_past_gap = numels - gap
266
267 #### The current layout will not cut it for dumping purposes. If we
268 need to dump one of these structures, we will have to rearrange things
269 so that the gap array data and other fields are in one single memory
270 block. Either this is a pointer off of struct gap_array, or it is
271 struct gap_array itself; in the latter case, the interface below has to
272 be modified so that functions that change the array pass in a ** rather
273 than a *, since the pointer may move.
274 */
275
276
254 typedef struct gap_array 277 typedef struct gap_array
255 { 278 {
256 char *array; 279 Elemcount gap;
257 int gap; 280 Elemcount gapsize;
258 int gapsize; 281 Elemcount numels;
259 int numels; 282 Bytecount elsize;
260 int elsize; 283 /* Redundant numbers computed from the others, for marking purposes */
284 Bytecount offset_past_gap;
285 Elemcount els_past_gap;
261 Gap_Array_Marker *markers; 286 Gap_Array_Marker *markers;
287 /* this is a stretchy array */
288 char array[1];
262 } Gap_Array; 289 } Gap_Array;
263 290
264 static Gap_Array_Marker *gap_array_marker_freelist; 291 static Gap_Array_Marker *gap_array_marker_freelist;
265 292
266 /* Convert a "memory position" (i.e. taking the gap into account) into 293 /* Convert a "memory position" (i.e. taking the gap into account) into
485 /* Adjust the gap array markers in the range (FROM, TO]. Parallel to 512 /* Adjust the gap array markers in the range (FROM, TO]. Parallel to
486 adjust_markers() in insdel.c. */ 513 adjust_markers() in insdel.c. */
487 514
488 static void 515 static void
489 gap_array_adjust_markers (Gap_Array *ga, Memxpos from, 516 gap_array_adjust_markers (Gap_Array *ga, Memxpos from,
490 Memxpos to, int amount) 517 Memxpos to, Elemcount amount)
491 { 518 {
492 Gap_Array_Marker *m; 519 Gap_Array_Marker *m;
493 520
494 for (m = ga->markers; m; m = m->next) 521 for (m = ga->markers; m; m = m->next)
495 m->pos = do_marker_adjustment (m->pos, from, to, amount); 522 m->pos = do_marker_adjustment (m->pos, from, to, amount);
496 } 523 }
497 524
525 static void
526 gap_array_recompute_derived_values (Gap_Array *ga)
527 {
528 ga->offset_past_gap = ga->elsize * (ga->gap + ga->gapsize);
529 ga->els_past_gap = ga->numels - ga->gap;
530 }
531
498 /* Move the gap to array position POS. Parallel to move_gap() in 532 /* Move the gap to array position POS. Parallel to move_gap() in
499 insdel.c but somewhat simplified. */ 533 insdel.c but somewhat simplified. */
500 534
501 static void 535 static void
502 gap_array_move_gap (Gap_Array *ga, int pos) 536 gap_array_move_gap (Gap_Array *ga, Elemcount pos)
503 { 537 {
504 int gap = ga->gap; 538 Elemcount gap = ga->gap;
505 int gapsize = ga->gapsize; 539 Elemcount gapsize = ga->gapsize;
506 540
507 assert (ga->array);
508 if (pos < gap) 541 if (pos < gap)
509 { 542 {
510 memmove (GAP_ARRAY_MEMEL_ADDR (ga, pos + gapsize), 543 memmove (GAP_ARRAY_MEMEL_ADDR (ga, pos + gapsize),
511 GAP_ARRAY_MEMEL_ADDR (ga, pos), 544 GAP_ARRAY_MEMEL_ADDR (ga, pos),
512 (gap - pos)*ga->elsize); 545 (gap - pos)*ga->elsize);
520 (pos - gap)*ga->elsize); 553 (pos - gap)*ga->elsize);
521 gap_array_adjust_markers (ga, (Memxpos) (gap + gapsize), 554 gap_array_adjust_markers (ga, (Memxpos) (gap + gapsize),
522 (Memxpos) (pos + gapsize), - gapsize); 555 (Memxpos) (pos + gapsize), - gapsize);
523 } 556 }
524 ga->gap = pos; 557 ga->gap = pos;
558
559 gap_array_recompute_derived_values (ga);
525 } 560 }
526 561
527 /* Make the gap INCREMENT characters longer. Parallel to make_gap() in 562 /* Make the gap INCREMENT characters longer. Parallel to make_gap() in
528 insdel.c. */ 563 insdel.c. The gap array may be moved, so assign the return value back
529 564 to the array pointer. */
530 static void 565
531 gap_array_make_gap (Gap_Array *ga, int increment) 566 static Gap_Array *
532 { 567 gap_array_make_gap (Gap_Array *ga, Elemcount increment)
533 char *ptr = ga->array; 568 {
534 int real_gap_loc; 569 Elemcount real_gap_loc;
535 int old_gap_size; 570 Elemcount old_gap_size;
536 571
537 /* If we have to get more space, get enough to last a while. We use 572 /* If we have to get more space, get enough to last a while. We use
538 a geometric progression that saves on realloc space. */ 573 a geometric progression that saves on realloc space. */
539 increment += 100 + ga->numels / 8; 574 increment += 100 + ga->numels / 8;
540 575
541 ptr = (char *) xrealloc (ptr, 576 ga = (Gap_Array *) xrealloc (ga,
542 (ga->numels + ga->gapsize + increment)*ga->elsize); 577 offsetof (Gap_Array, array) +
543 if (ptr == 0) 578 (ga->numels + ga->gapsize + increment) *
579 ga->elsize);
580 if (ga == 0)
544 memory_full (); 581 memory_full ();
545 ga->array = ptr;
546 582
547 real_gap_loc = ga->gap; 583 real_gap_loc = ga->gap;
548 old_gap_size = ga->gapsize; 584 old_gap_size = ga->gapsize;
549 585
550 /* Call the newly allocated space a gap at the end of the whole space. */ 586 /* Call the newly allocated space a gap at the end of the whole space. */
556 gap_array_move_gap (ga, real_gap_loc + old_gap_size); 592 gap_array_move_gap (ga, real_gap_loc + old_gap_size);
557 593
558 /* Now combine the two into one large gap. */ 594 /* Now combine the two into one large gap. */
559 ga->gapsize += old_gap_size; 595 ga->gapsize += old_gap_size;
560 ga->gap = real_gap_loc; 596 ga->gap = real_gap_loc;
597
598 gap_array_recompute_derived_values (ga);
599
600 return ga;
561 } 601 }
562 602
563 /* ------------------------------- */ 603 /* ------------------------------- */
564 /* external functions */ 604 /* external functions */
565 /* ------------------------------- */ 605 /* ------------------------------- */
566 606
567 /* Insert NUMELS elements (pointed to by ELPTR) into the specified 607 /* Insert NUMELS elements (pointed to by ELPTR) into the specified
568 gap array at POS. */ 608 gap array at POS. The gap array may be moved, so assign the
569 609 return value back to the array pointer. */
570 static void 610
571 gap_array_insert_els (Gap_Array *ga, int pos, void *elptr, int numels) 611 static Gap_Array *
612 gap_array_insert_els (Gap_Array *ga, Elemcount pos, void *elptr,
613 Elemcount numels)
572 { 614 {
573 assert (pos >= 0 && pos <= ga->numels); 615 assert (pos >= 0 && pos <= ga->numels);
574 if (ga->gapsize < numels) 616 if (ga->gapsize < numels)
575 gap_array_make_gap (ga, numels - ga->gapsize); 617 ga = gap_array_make_gap (ga, numels - ga->gapsize);
576 if (pos != ga->gap) 618 if (pos != ga->gap)
577 gap_array_move_gap (ga, pos); 619 gap_array_move_gap (ga, pos);
578 620
579 memcpy (GAP_ARRAY_MEMEL_ADDR (ga, ga->gap), (char *) elptr, 621 memcpy (GAP_ARRAY_MEMEL_ADDR (ga, ga->gap), (char *) elptr,
580 numels*ga->elsize); 622 numels*ga->elsize);
581 ga->gapsize -= numels; 623 ga->gapsize -= numels;
582 ga->gap += numels; 624 ga->gap += numels;
583 ga->numels += numels; 625 ga->numels += numels;
626 gap_array_recompute_derived_values (ga);
584 /* This is the equivalent of insert-before-markers. 627 /* This is the equivalent of insert-before-markers.
585 628
586 #### Should only happen if marker is "moves forward at insert" type. 629 #### Should only happen if marker is "moves forward at insert" type.
587 */ 630 */
588 631
589 gap_array_adjust_markers (ga, pos - 1, pos, numels); 632 gap_array_adjust_markers (ga, pos - 1, pos, numels);
633 return ga;
590 } 634 }
591 635
592 /* Delete NUMELS elements from the specified gap array, starting at FROM. */ 636 /* Delete NUMELS elements from the specified gap array, starting at FROM. */
593 637
594 static void 638 static void
595 gap_array_delete_els (Gap_Array *ga, int from, int numdel) 639 gap_array_delete_els (Gap_Array *ga, Elemcount from, Elemcount numdel)
596 { 640 {
597 int to = from + numdel; 641 Elemcount to = from + numdel;
598 int gapsize = ga->gapsize; 642 Elemcount gapsize = ga->gapsize;
599 643
600 assert (from >= 0); 644 assert (from >= 0);
601 assert (numdel >= 0); 645 assert (numdel >= 0);
602 assert (to <= ga->numels); 646 assert (to <= ga->numels);
603 647
613 - numdel - gapsize); 657 - numdel - gapsize);
614 658
615 ga->gapsize += numdel; 659 ga->gapsize += numdel;
616 ga->numels -= numdel; 660 ga->numels -= numdel;
617 ga->gap = from; 661 ga->gap = from;
662 gap_array_recompute_derived_values (ga);
618 } 663 }
619 664
620 static Gap_Array_Marker * 665 static Gap_Array_Marker *
621 gap_array_make_marker (Gap_Array *ga, int pos) 666 gap_array_make_marker (Gap_Array *ga, Elemcount pos)
622 { 667 {
623 Gap_Array_Marker *m; 668 Gap_Array_Marker *m;
624 669
625 assert (pos >= 0 && pos <= ga->numels); 670 assert (pos >= 0 && pos <= ga->numels);
626 if (gap_array_marker_freelist) 671 if (gap_array_marker_freelist)
648 if (prev) 693 if (prev)
649 prev->next = p->next; 694 prev->next = p->next;
650 else 695 else
651 ga->markers = p->next; 696 ga->markers = p->next;
652 m->next = gap_array_marker_freelist; 697 m->next = gap_array_marker_freelist;
653 m->pos = 0xDEADBEEF; /* -559038737 as an int */ 698 m->pos = 0xDEADBEEF; /* -559038737 base 10 */
654 gap_array_marker_freelist = m; 699 gap_array_marker_freelist = m;
655 } 700 }
656 701
657 static void 702 static void
658 gap_array_delete_all_markers (Gap_Array *ga) 703 gap_array_delete_all_markers (Gap_Array *ga)
667 gap_array_marker_freelist = p; 712 gap_array_marker_freelist = p;
668 } 713 }
669 } 714 }
670 715
671 static void 716 static void
672 gap_array_move_marker (Gap_Array *ga, Gap_Array_Marker *m, int pos) 717 gap_array_move_marker (Gap_Array *ga, Gap_Array_Marker *m, Elemcount pos)
673 { 718 {
674 assert (pos >= 0 && pos <= ga->numels); 719 assert (pos >= 0 && pos <= ga->numels);
675 m->pos = GAP_ARRAY_ARRAY_TO_MEMORY_POS (ga, pos); 720 m->pos = GAP_ARRAY_ARRAY_TO_MEMORY_POS (ga, pos);
676 } 721 }
677 722
678 #define gap_array_marker_pos(ga, m) \ 723 #define gap_array_marker_pos(ga, m) \
679 GAP_ARRAY_MEMORY_TO_ARRAY_POS (ga, (m)->pos) 724 GAP_ARRAY_MEMORY_TO_ARRAY_POS (ga, (m)->pos)
680 725
681 static Gap_Array * 726 static Gap_Array *
682 make_gap_array (int elsize) 727 make_gap_array (Elemcount elsize)
683 { 728 {
684 Gap_Array *ga = xnew_and_zero (Gap_Array); 729 Gap_Array *ga = xnew_and_zero (Gap_Array);
685 ga->elsize = elsize; 730 ga->elsize = elsize;
686 return ga; 731 return ga;
687 } 732 }
688 733
689 static void 734 static void
690 free_gap_array (Gap_Array *ga) 735 free_gap_array (Gap_Array *ga)
691 { 736 {
692 if (ga->array)
693 xfree (ga->array);
694 gap_array_delete_all_markers (ga); 737 gap_array_delete_all_markers (ga);
695 xfree (ga); 738 xfree (ga);
696 } 739 }
697 740
698 741
711 integers (this should be generalized to handle integers and linked 754 integers (this should be generalized to handle integers and linked
712 list equally well). 755 list equally well).
713 */ 756 */
714 757
715 /* Number of elements in an extent list */ 758 /* Number of elements in an extent list */
716 #define extent_list_num_els(el) GAP_ARRAY_NUM_ELS(el->start) 759 #define extent_list_num_els(el) GAP_ARRAY_NUM_ELS (el->start)
717 760
718 /* Return the position at which EXTENT is located in the specified extent 761 /* Return the position at which EXTENT is located in the specified extent
719 list (in the display order if ENDP is 0, in the e-order otherwise). 762 list (in the display order if ENDP is 0, in the e-order otherwise).
720 If the extent is not found, the position where the extent would 763 If the extent is not found, the position where the extent would
721 be inserted is returned. If ENDP is 0, the insertion would go after 764 be inserted is returned. If ENDP is 0, the insertion would go after
813 { 856 {
814 int pos, foundp; 857 int pos, foundp;
815 858
816 pos = extent_list_locate (el, extent, 0, &foundp); 859 pos = extent_list_locate (el, extent, 0, &foundp);
817 assert (!foundp); 860 assert (!foundp);
818 gap_array_insert_els (el->start, pos, &extent, 1); 861 el->start = gap_array_insert_els (el->start, pos, &extent, 1);
819 pos = extent_list_locate (el, extent, 1, &foundp); 862 pos = extent_list_locate (el, extent, 1, &foundp);
820 assert (!foundp); 863 assert (!foundp);
821 gap_array_insert_els (el->end, pos, &extent, 1); 864 el->end = gap_array_insert_els (el->end, pos, &extent, 1);
822 } 865 }
823 866
824 /* Delete an extent from an extent list. */ 867 /* Delete an extent from an extent list. */
825 868
826 static void 869 static void
907 950
908 /************************************************************************/ 951 /************************************************************************/
909 /* Auxiliary extent structure */ 952 /* Auxiliary extent structure */
910 /************************************************************************/ 953 /************************************************************************/
911 954
912 #ifdef USE_KKCC 955 static const struct memory_description extent_auxiliary_description[] ={
913 static const struct lrecord_description extent_auxiliary_description[] ={
914 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, begin_glyph) }, 956 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, begin_glyph) },
915 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, end_glyph) }, 957 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, end_glyph) },
916 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, parent) }, 958 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, parent) },
917 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, children) }, 959 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, children) },
918 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, invisible) }, 960 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, invisible) },
921 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, initial_redisplay_function) }, 963 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, initial_redisplay_function) },
922 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, before_change_functions) }, 964 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, before_change_functions) },
923 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, after_change_functions) }, 965 { XD_LISP_OBJECT, offsetof (struct extent_auxiliary, after_change_functions) },
924 { XD_END } 966 { XD_END }
925 }; 967 };
926 #endif /* USE_KKCC */
927 static Lisp_Object 968 static Lisp_Object
928 mark_extent_auxiliary (Lisp_Object obj) 969 mark_extent_auxiliary (Lisp_Object obj)
929 { 970 {
930 struct extent_auxiliary *data = XEXTENT_AUXILIARY (obj); 971 struct extent_auxiliary *data = XEXTENT_AUXILIARY (obj);
931 mark_object (data->begin_glyph); 972 mark_object (data->begin_glyph);
938 mark_object (data->before_change_functions); 979 mark_object (data->before_change_functions);
939 mark_object (data->after_change_functions); 980 mark_object (data->after_change_functions);
940 return data->parent; 981 return data->parent;
941 } 982 }
942 983
943 #ifdef USE_KKCC
944 DEFINE_LRECORD_IMPLEMENTATION ("extent-auxiliary", extent_auxiliary, 984 DEFINE_LRECORD_IMPLEMENTATION ("extent-auxiliary", extent_auxiliary,
945 0, /*dumpable-flag*/ 985 0, /*dumpable-flag*/
946 mark_extent_auxiliary, internal_object_printer, 986 mark_extent_auxiliary, internal_object_printer,
947 0, 0, 0, extent_auxiliary_description, struct extent_auxiliary); 987 0, 0, 0, extent_auxiliary_description,
948 #else /* not USE_KKCC */ 988 struct extent_auxiliary);
949 DEFINE_LRECORD_IMPLEMENTATION ("extent-auxiliary", extent_auxiliary,
950 mark_extent_auxiliary, internal_object_printer,
951 0, 0, 0, 0, struct extent_auxiliary);
952 #endif /* not USE_KKCC */
953 void 989 void
954 allocate_extent_auxiliary (EXTENT ext) 990 allocate_extent_auxiliary (EXTENT ext)
955 { 991 {
956 Lisp_Object extent_aux; 992 Lisp_Object extent_aux;
957 struct extent_auxiliary *data = 993 struct extent_auxiliary *data =
991 1027
992 static struct stack_of_extents *allocate_soe (void); 1028 static struct stack_of_extents *allocate_soe (void);
993 static void free_soe (struct stack_of_extents *soe); 1029 static void free_soe (struct stack_of_extents *soe);
994 static void soe_invalidate (Lisp_Object obj); 1030 static void soe_invalidate (Lisp_Object obj);
995 1031
996 #ifdef USE_KKCC 1032 extern const struct sized_memory_description gap_array_marker_description;
997 static const struct struct_description extent_list_description = { 1033
998 }; 1034 static const struct memory_description gap_array_marker_description_1[] = {
999 1035 { XD_STRUCT_PTR, offsetof (Gap_Array_Marker, next), 1,
1000 static const struct lrecord_description extent_info_description [] = { 1036 &gap_array_marker_description },
1001 { XD_STRUCT_PTR, offsetof (struct extent_info, extents),
1002 XD_INDIRECT (0, 0), &extent_list_description },
1003 { XD_END } 1037 { XD_END }
1004 }; 1038 };
1005 #endif /* USE_KKCC */ 1039
1040 const struct sized_memory_description gap_array_marker_description = {
1041 sizeof (Gap_Array_Marker),
1042 gap_array_marker_description_1
1043 };
1044
1045 static const struct memory_description lispobj_gap_array_description_1[] = {
1046 { XD_INT, offsetof (Gap_Array, gap) },
1047 { XD_INT, offsetof (Gap_Array, offset_past_gap) },
1048 { XD_INT, offsetof (Gap_Array, els_past_gap) },
1049 { XD_STRUCT_PTR, offsetof (Gap_Array, markers), 1,
1050 &gap_array_marker_description, XD_FLAG_NO_KKCC },
1051 { XD_STRUCT_ARRAY, offsetof (Gap_Array, array), XD_INDIRECT (0, 0),
1052 &lisp_object_description },
1053 { XD_STRUCT_ARRAY, XD_INDIRECT (1, offsetof (Gap_Array, array)),
1054 XD_INDIRECT (2, 0), &lisp_object_description },
1055 { XD_END }
1056 };
1057
1058 static const struct sized_memory_description lispobj_gap_array_description = {
1059 sizeof (Gap_Array),
1060 lispobj_gap_array_description_1
1061 };
1062
1063 extern const struct sized_memory_description extent_list_marker_description;
1064
1065 static const struct memory_description extent_list_marker_description_1[] = {
1066 { XD_STRUCT_PTR, offsetof (Extent_List_Marker, m), 1,
1067 &gap_array_marker_description },
1068 { XD_STRUCT_PTR, offsetof (Extent_List_Marker, next), 1,
1069 &extent_list_marker_description },
1070 { XD_END }
1071 };
1072
1073 const struct sized_memory_description extent_list_marker_description = {
1074 sizeof (Extent_List_Marker),
1075 extent_list_marker_description_1
1076 };
1077
1078 static const struct memory_description extent_list_description_1[] = {
1079 { XD_STRUCT_PTR, offsetof (Extent_List, start), 1, &lispobj_gap_array_description },
1080 { XD_STRUCT_PTR, offsetof (Extent_List, end), 1, &lispobj_gap_array_description, XD_FLAG_NO_KKCC },
1081 { XD_STRUCT_PTR, offsetof (Extent_List, markers), 1, &extent_list_marker_description, XD_FLAG_NO_KKCC },
1082 { XD_END }
1083 };
1084
1085 static const struct sized_memory_description extent_list_description = {
1086 sizeof (Extent_List),
1087 extent_list_description_1
1088 };
1089
1090 static const struct memory_description stack_of_extents_description_1[] = {
1091 { XD_STRUCT_PTR, offsetof (Stack_Of_Extents, extents), 1, &extent_list_description },
1092 { XD_END }
1093 };
1094
1095 static const struct sized_memory_description stack_of_extents_description = {
1096 sizeof (Stack_Of_Extents),
1097 stack_of_extents_description_1
1098 };
1099
1100 static const struct memory_description extent_info_description [] = {
1101 { XD_STRUCT_PTR, offsetof (struct extent_info, extents), 1,
1102 &extent_list_description },
1103 { XD_STRUCT_PTR, offsetof (struct extent_info, soe), 1,
1104 &stack_of_extents_description, XD_FLAG_NO_KKCC },
1105 { XD_END }
1106 };
1006 1107
1007 static Lisp_Object 1108 static Lisp_Object
1008 mark_extent_info (Lisp_Object obj) 1109 mark_extent_info (Lisp_Object obj)
1009 { 1110 {
1010 struct extent_info *data = (struct extent_info *) XEXTENT_INFO (obj); 1111 struct extent_info *data = (struct extent_info *) XEXTENT_INFO (obj);
1052 free_extent_list (data->extents); 1153 free_extent_list (data->extents);
1053 data->extents = 0; 1154 data->extents = 0;
1054 } 1155 }
1055 } 1156 }
1056 1157
1057 #ifdef USE_KKCC
1058 DEFINE_LRECORD_IMPLEMENTATION ("extent-info", extent_info, 1158 DEFINE_LRECORD_IMPLEMENTATION ("extent-info", extent_info,
1059 0, /*dumpable-flag*/ 1159 0, /*dumpable-flag*/
1060 mark_extent_info, internal_object_printer, 1160 mark_extent_info, internal_object_printer,
1061 finalize_extent_info, 0, 0, 1161 finalize_extent_info, 0, 0,
1062 0 /*extent_info_description*/, 1162 extent_info_description,
1063 struct extent_info); 1163 struct extent_info);
1064 #else /* not USE_KKCC */
1065 DEFINE_LRECORD_IMPLEMENTATION ("extent-info", extent_info,
1066 mark_extent_info, internal_object_printer,
1067 finalize_extent_info, 0, 0, 0,
1068 struct extent_info);
1069 #endif /* not USE_KKCC */
1070 1164
1071 static Lisp_Object 1165 static Lisp_Object
1072 allocate_extent_info (void) 1166 allocate_extent_info (void)
1073 { 1167 {
1074 Lisp_Object extent_info; 1168 Lisp_Object extent_info;
3178 Just hash the most common ones. */ 3272 Just hash the most common ones. */
3179 return HASH3 (extent_start (e), extent_end (e), 3273 return HASH3 (extent_start (e), extent_end (e),
3180 internal_hash (extent_object (e), depth + 1)); 3274 internal_hash (extent_object (e), depth + 1));
3181 } 3275 }
3182 3276
3183 static const struct lrecord_description extent_description[] = { 3277 static const struct memory_description extent_description[] = {
3184 { XD_LISP_OBJECT, offsetof (struct extent, object) }, 3278 { XD_LISP_OBJECT, offsetof (struct extent, object) },
3185 { XD_LISP_OBJECT, offsetof (struct extent, flags.face) }, 3279 { XD_LISP_OBJECT, offsetof (struct extent, flags.face) },
3186 { XD_LISP_OBJECT, offsetof (struct extent, plist) }, 3280 { XD_LISP_OBJECT, offsetof (struct extent, plist) },
3187 { XD_END } 3281 { XD_END }
3188 }; 3282 };
3216 extent_plist (Lisp_Object obj) 3310 extent_plist (Lisp_Object obj)
3217 { 3311 {
3218 return Fextent_properties (obj); 3312 return Fextent_properties (obj);
3219 } 3313 }
3220 3314
3221 #ifdef USE_KKCC
3222 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS ("extent", extent, 3315 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS ("extent", extent,
3223 1, /*dumpable-flag*/ 3316 1, /*dumpable-flag*/
3224 mark_extent, 3317 mark_extent,
3225 print_extent, 3318 print_extent,
3226 /* NOTE: If you declare a 3319 /* NOTE: If you declare a
3231 extent_equal, extent_hash, 3324 extent_equal, extent_hash,
3232 extent_description, 3325 extent_description,
3233 extent_getprop, extent_putprop, 3326 extent_getprop, extent_putprop,
3234 extent_remprop, extent_plist, 3327 extent_remprop, extent_plist,
3235 struct extent); 3328 struct extent);
3236 #else /* not USE_KKCC */
3237 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS ("extent", extent,
3238 mark_extent,
3239 print_extent,
3240 /* NOTE: If you declare a
3241 finalization method here,
3242 it will NOT be called.
3243 Shaft city. */
3244 0,
3245 extent_equal, extent_hash,
3246 extent_description,
3247 extent_getprop, extent_putprop,
3248 extent_remprop, extent_plist,
3249 struct extent);
3250 #endif /* not USE_KKCC */
3251 3329
3252 /************************************************************************/ 3330 /************************************************************************/
3253 /* basic extent accessors */ 3331 /* basic extent accessors */
3254 /************************************************************************/ 3332 /************************************************************************/
3255 3333
4396 if (EQ (at_flag, Qafter)) return EXTENT_AT_AFTER; 4474 if (EQ (at_flag, Qafter)) return EXTENT_AT_AFTER;
4397 if (EQ (at_flag, Qbefore)) return EXTENT_AT_BEFORE; 4475 if (EQ (at_flag, Qbefore)) return EXTENT_AT_BEFORE;
4398 if (EQ (at_flag, Qat)) return EXTENT_AT_AT; 4476 if (EQ (at_flag, Qat)) return EXTENT_AT_AT;
4399 4477
4400 invalid_constant ("Invalid AT-FLAG in `extent-at'", at_flag); 4478 invalid_constant ("Invalid AT-FLAG in `extent-at'", at_flag);
4401 RETURN_NOT_REACHED (EXTENT_AT_AFTER) 4479 RETURN_NOT_REACHED (EXTENT_AT_AFTER);
4402 } 4480 }
4403 4481
4404 static int 4482 static int
4405 extent_at_mapper (EXTENT e, void *arg) 4483 extent_at_mapper (EXTENT e, void *arg)
4406 { 4484 {
4638 #endif 4716 #endif
4639 4717
4640 while (1) 4718 while (1)
4641 Fsignal (Qbuffer_read_only, (list1 (closure->object))); 4719 Fsignal (Qbuffer_read_only, (list1 (closure->object)));
4642 4720
4643 RETURN_NOT_REACHED(0) 4721 RETURN_NOT_REACHED(0);
4644 } 4722 }
4645 4723
4646 /* Value of Vinhibit_read_only is precomputed and passed in for 4724 /* Value of Vinhibit_read_only is precomputed and passed in for
4647 efficiency */ 4725 efficiency */
4648 4726
5217 if (EQ (layout_obj, Qinside_margin)) return GL_INSIDE_MARGIN; 5295 if (EQ (layout_obj, Qinside_margin)) return GL_INSIDE_MARGIN;
5218 if (EQ (layout_obj, Qwhitespace)) return GL_WHITESPACE; 5296 if (EQ (layout_obj, Qwhitespace)) return GL_WHITESPACE;
5219 if (EQ (layout_obj, Qtext)) return GL_TEXT; 5297 if (EQ (layout_obj, Qtext)) return GL_TEXT;
5220 5298
5221 invalid_constant ("Unknown glyph layout type", layout_obj); 5299 invalid_constant ("Unknown glyph layout type", layout_obj);
5222 RETURN_NOT_REACHED (GL_TEXT) 5300 RETURN_NOT_REACHED (GL_TEXT);
5223 } 5301 }
5224 5302
5225 static Lisp_Object 5303 static Lisp_Object
5226 set_extent_glyph_1 (Lisp_Object extent_obj, Lisp_Object glyph, int endp, 5304 set_extent_glyph_1 (Lisp_Object extent_obj, Lisp_Object glyph, int endp,
5227 Lisp_Object layout_obj) 5305 Lisp_Object layout_obj)
7228 DEFSUBR (Fdelete_extent); 7306 DEFSUBR (Fdelete_extent);
7229 DEFSUBR (Fdetach_extent); 7307 DEFSUBR (Fdetach_extent);
7230 DEFSUBR (Fset_extent_endpoints); 7308 DEFSUBR (Fset_extent_endpoints);
7231 DEFSUBR (Fnext_extent); 7309 DEFSUBR (Fnext_extent);
7232 DEFSUBR (Fprevious_extent); 7310 DEFSUBR (Fprevious_extent);
7233 #if DEBUG_XEMACS 7311 #ifdef DEBUG_XEMACS
7234 DEFSUBR (Fnext_e_extent); 7312 DEFSUBR (Fnext_e_extent);
7235 DEFSUBR (Fprevious_e_extent); 7313 DEFSUBR (Fprevious_e_extent);
7236 #endif 7314 #endif
7237 DEFSUBR (Fnext_extent_change); 7315 DEFSUBR (Fnext_extent_change);
7238 DEFSUBR (Fprevious_extent_change); 7316 DEFSUBR (Fprevious_extent_change);