mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-10 05:30:45 -08:00
* globals.h: New file. * xterm.h (Vx_pixel_size_width_font_regexp): Remove declaration. * window.h (Vinitial_window_system, Vminibuf_scroll_window) (Vwindow_system_version): Remove declaration. * w32term.h (Vw32_enable_palette) (Vx_pixel_size_width_font_regexp): Remove declaration. * w32menu.c (Voverriding_local_map) (Voverriding_local_map_menu_flag): Remove declaration. * w32inevt.c (Vw32_alt_is_meta, Vw32_apps_modifier) (Vw32_capslock_is_shiftlock, Vw32_enable_caps_lock) (Vw32_enable_num_lock, Vw32_lwindow_modifier) (Vw32_pass_lwindow_to_system, Vw32_pass_rwindow_to_system) (Vw32_phantom_key_code, Vw32_recognize_altgr) (Vw32_rwindow_modifier, Vw32_scroll_lock_modifier) (w32_use_full_screen_buffer): Remove declaration. * w32.c (Vsystem_configuration, Vw32_downcase_file_names) (Vw32_generate_fake_inodes, Vw32_get_true_file_attributes) (w32_num_mouse_buttons, w32_pipe_read_delay): Remove declaration. * termopts.h (Vtruncate_partial_width_windows, inverse_video) (no_redraw_on_reenter, visible_bell): Remove declaration. * sysdep.c (Vsystem_name): Remove declaration. * syntax.h (parse_sexp_lookup_properties): Remove declaration. * menu.h (Vmenu_updating_frame): Remove declaration. * macros.h (Vexecuting_kbd_macro, executing_kbd_macro_index): Remove declaration. * lisp.h (Vafter_init_time, Vafter_load_alist) (Vauto_save_list_file_name, Vbefore_init_time, Vcommand_history) (Vcompletion_regexp_list, Vcurrent_load_list) (Vcurrent_prefix_arg, Vdata_directory, Vdebug_on_error) (Vdoc_directory, Vdoc_file_name, Vdynamic_library_alist) (Vexec_directory, Vexec_path, Vexec_suffixes) (Vface_font_rescale_alist, Vface_ignored_fonts, Vfeatures) (Vhelp_form, Vhistory_length, Vinhibit_field_text_motion) (Vinhibit_quit, Vinhibit_read_only, Vinhibit_redisplay) (Vinstallation_directory, Vinvocation_directory) (Vinvocation_name, Vload_file_rep_suffixes, Vload_history) (Vload_suffixes, Vmark_even_if_inactive, Vmemory_full) (Vmessage_log_max, Vobarray, Vprint_length, Vprint_level) (Vpurify_flag, Vquit_flag, Vsaved_region_selection) (Vscalable_fonts_allowed, Vselect_active_regions) (Vshell_file_name, Vstandard_input, Vstandard_output) (Vsystem_name, Vtemporary_file_directory, Vthrow_on_input) (Vtop_level, Vtty_erase_char, Vundo_outer_limit) (Vuser_login_name, Vwindow_scroll_functions) (Vwindow_system_version, Vx_no_window_manager) (Vx_resource_class, Vx_resource_name, baud_rate) (completion_ignore_case, debug_on_next_call, gc_cons_threshold) (history_delete_duplicates, inhibit_x_resources) (last_nonmenu_event, load_in_progress, max_specpdl_size) (minibuffer_auto_raise, print_escape_newlines, scroll_margin) (use_dialog_box, use_file_dialog): Remove declaration. Include globals.h. * keymap.h (Voverriding_local_map) (Voverriding_local_map_menu_flag, meta_prefix_char): Remove declaration. * keyboard.h (Vdouble_click_time, Vfunction_key_map) (Vinput_method_function, Vkey_translation_map) (Vlucid_menu_bar_dirty_flag, Vthis_original_command) (do_mouse_tracking, extra_keyboard_modifiers) (num_nonmacro_input_events): Remove declaration. * intervals.h (Vchar_property_alias_alist) (Vdefault_text_properties, Vinhibit_point_motion_hooks) (Vtext_property_default_nonsticky): Remove declaration. * gtkutil.h (x_gtk_file_dialog_help_text) (x_gtk_show_hidden_files, x_gtk_use_old_file_dialog) (x_gtk_whole_detached_tool_bar): Remove declaration. * frame.h (Vdefault_frame_alist, Vframe_alpha_lower_limit) (Vmenu_bar_mode, Vmouse_highlight, Vterminal_frame) (Vtool_bar_mode, Vx_resource_class, Vx_resource_name) (focus_follows_mouse): Remove declaration. * fontset.h (Valternate_fontname_alist, Vfontset_alias_alist) (Vignore_relative_composition, Votf_script_alist) (Vuse_default_ascent, Vvertical_centering_font_regexp): Remove declaration. * font.h (Vfont_log): Remove declaration. * dosfns.h (Vdos_display_scancodes, Vdos_version) (Vdos_windows_version, dos_codepage, dos_country_code) (dos_decimal_point, dos_hyper_key, dos_keyboard_layout) (dos_keypad_mode, dos_super_key, dos_timezone_offset): Remove declaration. * disptab.h (Vglyph_table, Vstandard_display_table): Remove declaration. * dispextern.h (Vface_remapping_alist, Vglyphless_char_display) (Vmouse_autoselect_window, Voverflow_newline_into_fringe) (Vshow_trailing_whitespace, Vtool_bar_button_margin) (Vtool_bar_style, cursor_in_echo_area, display_hourglass_p) (inverse_video, mode_line_in_non_selected_windows) (tool_bar_button_relief, tool_bar_max_label_size) (underline_minimum_offset) (unibyte_display_via_language_environment, x_stretch_cursor_p): Remove declaration. * composite.h (Vauto_composition_function) (Vcomposition_function_table): Remove declaration. * commands.h (Vexecuting_kbd_macro) (Vminibuffer_local_completion_map) (Vminibuffer_local_filename_completion_map) (Vminibuffer_local_filename_must_match_map) (Vminibuffer_local_map, Vminibuffer_local_must_match_map) (Vminibuffer_local_ns_map, Vthis_command) (Vunread_command_events, cursor_in_echo_area) (last_command_event, last_nonmenu_event, unread_command_char): Remove declaration. * coding.h (Vcoding_system_for_read, Vcoding_system_for_write) (Vdefault_file_name_coding_system) (Vdefault_process_coding_system, Vfile_name_coding_system) (Vlast_coding_system_used, Vlocale_coding_system) (Vselect_safe_coding_system_function) (Vtranslation_table_for_input, coding_system_require_warning) (eol_mnemonic_dos, eol_mnemonic_mac, eol_mnemonic_undecided) (eol_mnemonic_unix, inherit_process_coding_system): Remove declaration. * charset.h (Vcharset_list, Vcurrent_iso639_language): Remove declaration. * character.h (Vauto_fill_chars, Vchar_direction_table) (Vchar_script_table, Vchar_width_table, Vprintable_chars) (Vscript_representative_chars, Vtranslation_table_vector) (Vunicode_category_table): Remove declaration. * ccl.h (Vfont_ccl_encoder_alist): Remove declaration. * buffer.h (Vafter_change_functions, Vbefore_change_functions) (Vdeactivate_mark, Vfirst_change_hook, Vtransient_mark_mode) (inhibit_modification_hooks): Remove declaration. * xterm.c (syms_of_xterm): Update. (Vx_alt_keysym, Vx_hyper_keysym, Vx_keysym_table) (Vx_meta_keysym, Vx_super_keysym, Vx_toolkit_scroll_bars) (x_mouse_click_focus_ignore_position) (x_underline_at_descent_line) (x_use_underline_position_properties): Remove. * xsmfns.c (syms_of_xsmfns): Update. (Vx_session_id, Vx_session_previous_id): Remove. * xsettings.c (syms_of_xsettings): Update. (Vxft_settings, use_system_font): Remove. * xselect.c (syms_of_xselect): Update. (Vselection_converter_alist, Vx_lost_selection_functions) (Vx_sent_selection_functions, x_selection_timeout): Remove. * xfns.c (syms_of_xfns): Update. (Vgtk_version_string, Vmotif_version_string) (Vx_cursor_fore_pixel, Vx_hourglass_pointer_shape) (Vx_max_tooltip_size, Vx_mode_pointer_shape) (Vx_no_window_manager, Vx_nontext_pointer_shape) (Vx_pixel_size_width_font_regexp, Vx_pointer_shape) (Vx_sensitive_text_pointer_shape) (Vx_window_horizontal_drag_shape, x_gtk_file_dialog_help_text) (x_gtk_show_hidden_files, x_gtk_use_old_file_dialog) (x_gtk_use_system_tooltips, x_gtk_whole_detached_tool_bar): Remove. * xfaces.c (syms_of_xfaces): Update. (Vface_default_stipple, Vface_font_rescale_alist) (Vface_ignored_fonts, Vface_new_frame_defaults) (Vface_remapping_alist, Vfont_list_limit) (Vscalable_fonts_allowed, Vtty_defined_color_alist): Remove. * xdisp.c (syms_of_xdisp): Update. (Vauto_resize_tool_bars, Vblink_cursor_alist) (Vdisplay_pixels_per_inch, Vfontification_functions) (Vframe_title_format, Vglobal_mode_string) (Vglyphless_char_display, Vhourglass_delay, Vhscroll_step) (Vicon_title_format, Vinhibit_redisplay) (Vline_number_display_limit, Vline_prefix) (Vmax_mini_window_height, Vmenu_bar_update_hook) (Vmenu_updating_frame, Vmessage_log_max) (Vmouse_autoselect_window, Vnobreak_char_display) (Voverlay_arrow_position, Voverlay_arrow_string) (Voverlay_arrow_variable_list, Vredisplay_end_trigger_functions) (Vresize_mini_windows, Vshow_trailing_whitespace) (Vtool_bar_border, Vtool_bar_button_margin, Vtool_bar_style) (Vtruncate_partial_width_windows, Vvoid_text_area_pointer) (Vwindow_scroll_functions, Vwindow_size_change_functions) (Vwindow_text_change_functions, Vwrap_prefix) (auto_raise_tool_bar_buttons_p, automatic_hscrolling_p) (debug_end_pos, display_hourglass_p, emacs_scroll_step) (highlight_nonselected_windows, hscroll_margin) (inhibit_eval_during_redisplay, inhibit_free_realized_faces) (inhibit_menubar_update, inhibit_try_cursor_movement) (inhibit_try_window_id, inhibit_try_window_reusing) (line_number_display_limit_width) (make_cursor_line_fully_visible_p, message_truncate_lines) (mode_line_inverse_video, multiple_frames, overline_margin) (scroll_conservatively, scroll_margin, tool_bar_button_relief) (tool_bar_max_label_size, underline_minimum_offset) (unibyte_display_via_language_environment, x_stretch_cursor_p): Remove. * window.c (syms_of_window): Update. (Vminibuf_scroll_window, Vother_window_scroll_buffer) (Vrecenter_redisplay, Vscroll_preserve_screen_position) (Vtemp_buffer_show_function, Vwindow_configuration_change_hook) (Vwindow_point_insertion_type, auto_window_vscroll_p) (mode_line_in_non_selected_windows, next_screen_context_lines) (window_min_height, window_min_width): Remove. (scroll_margin): Remove declaration. * w32term.c (syms_of_w32term): Update. (Vw32_capslock_is_shiftlock, Vw32_grab_focus_on_raise) (Vw32_recognize_altgr, Vw32_swap_mouse_buttons) (Vx_toolkit_scroll_bars, w32_num_mouse_buttons) (w32_use_visible_system_caret, x_underline_at_descent_line) (x_use_underline_position_properties): Remove. (Vcommand_line_args, Vsystem_name, extra_keyboard_modifiers): Remove declaration. * w32select.c (syms_of_w32select): Update. (Vnext_selection_coding_system, Vselection_coding_system): Remove. * w32proc.c (syms_of_ntproc): Update. (Vw32_downcase_file_names, Vw32_generate_fake_inodes) (Vw32_get_true_file_attributes, Vw32_quote_process_args) (Vw32_start_process_inherit_error_mode) (Vw32_start_process_share_console) (Vw32_start_process_show_window, w32_pipe_read_delay): Remove. (Vsystem_name): Remove declaration. * w32font.c (syms_of_w32font): Update. (Vw32_charset_info_alist): Remove. * w32fns.c (globals_of_w32fns, syms_of_w32fns): Update. (Vw32_alt_is_meta, Vw32_apps_modifier, Vw32_bdf_filename_alist) (Vw32_color_map, Vw32_enable_caps_lock, Vw32_enable_num_lock) (Vw32_enable_palette, Vw32_lwindow_modifier) (Vw32_pass_alt_to_system, Vw32_pass_lwindow_to_system) (Vw32_pass_rwindow_to_system, Vw32_phantom_key_code) (Vw32_rwindow_modifier, Vw32_scroll_lock_modifier) (Vx_cursor_fore_pixel, Vx_hourglass_pointer_shape) (Vx_max_tooltip_size, Vx_mode_pointer_shape) (Vx_no_window_manager, Vx_nontext_pointer_shape) (Vx_pixel_size_width_font_regexp, Vx_pointer_shape) (Vx_sensitive_text_pointer_shape) (Vx_window_horizontal_drag_shape, w32_ansi_code_page) (w32_enable_synthesized_fonts, w32_mouse_button_tolerance) (w32_mouse_move_interval) (w32_pass_extra_mouse_buttons_to_system) (w32_pass_multimedia_buttons_to_system, w32_quit_key) (w32_strict_fontnames, w32_strict_painting): Remove. (Vhourglass_delay, Vmenu_bar_mode, Vtool_bar_mode) (Vw32_recognize_altgr, Vwindow_system_version) (w32_num_mouse_buttons, w32_use_visible_system_caret): Remove declaration. * w32console.c (syms_of_ntterm): Update. (w32_use_full_screen_buffer): Remove. (Vtty_defined_color_alist): Remove declaration. * w16select.c (syms_of_win16select): Update. (Vnext_selection_coding_system, Vselection_coding_system): Remove. * undo.c (syms_of_undo): Update. (Vundo_outer_limit, Vundo_outer_limit_function) (undo_inhibit_record_point, undo_limit, undo_strong_limit): Remove. * textprop.c (syms_of_textprop): Update. (Vchar_property_alias_alist, Vdefault_text_properties) (Vinhibit_point_motion_hooks, Vtext_property_default_nonsticky): Remove. * terminal.c (syms_of_terminal): Update. (Vdelete_terminal_functions, Vring_bell_function): Remove. * term.c (syms_of_term): Update. (Vresume_tty_functions, Vsuspend_tty_functions) (no_redraw_on_reenter, system_uses_terminfo, visible_cursor): Remove. * syntax.c (syms_of_syntax): Update. (Vfind_word_boundary_function_table, multibyte_syntax_as_symbol) (open_paren_in_column_0_is_defun_start) (parse_sexp_ignore_comments, parse_sexp_lookup_properties) (words_include_escapes): Remove. * search.c (syms_of_search): Update. (Vinhibit_changing_match_data, Vsearch_spaces_regexp): Remove. * process.c (syms_of_process): Update. (Vprocess_adaptive_read_buffering, Vprocess_connection_type) (delete_exited_processes): Remove. * print.c (syms_of_print): Update. (Vfloat_output_format, Vprint_charset_text_property) (Vprint_circle, Vprint_continuous_numbering, Vprint_gensym) (Vprint_length, Vprint_level, Vprint_number_table) (Vstandard_output, print_escape_multibyte) (print_escape_newlines, print_escape_nonascii, print_quoted): Remove. * msdos.c (syms_of_msdos): Update. (Vdos_unsupported_char_glyph): Remove. (unibyte_display_via_language_environment): Remove declaration. * minibuf.c (syms_of_minibuf): Update. (Vcompletion_regexp_list, Vhistory_add_new_input) (Vhistory_length, Vminibuffer_completing_file_name) (Vminibuffer_completion_confirm) (Vminibuffer_completion_predicate, Vminibuffer_completion_table) (Vminibuffer_exit_hook, Vminibuffer_help_form) (Vminibuffer_history_position, Vminibuffer_history_variable) (Vminibuffer_prompt_properties, Vminibuffer_setup_hook) (Vread_buffer_function, Vread_expression_map) (completion_ignore_case, enable_recursive_minibuffers) (history_delete_duplicates, minibuffer_allow_text_properties) (minibuffer_auto_raise, read_buffer_completion_ignore_case): Remove. * marker.c (syms_of_marker): Update. (byte_debug_flag): Remove. * macros.c (syms_of_macros): Update. (Vexecuting_kbd_macro, executing_kbd_macro_index): Remove. * lread.c (syms_of_lread): Update. (Vafter_load_alist, Vbyte_boolean_vars) (Vbytecomp_version_regexp, Vcurrent_load_list) (Veval_buffer_list, Vload_file_name, Vload_file_rep_suffixes) (Vload_history, Vload_path, Vload_read_function) (Vload_source_file_function, Vload_suffixes, Vobarray) (Vold_style_backquotes, Vpreloaded_file_list, Vread_circle) (Vread_symbol_positions_list, Vread_with_symbol_positions) (Vsource_directory, Vstandard_input, Vuser_init_file, Vvalues) (force_load_messages, load_convert_to_unibyte) (load_dangerous_libraries, load_force_doc_strings) (load_in_progress): Remove. * keymap.c (syms_of_keymap): Update. (Vdefine_key_rebound_commands, Vemulation_mode_map_alists) (Vminibuffer_local_completion_map) (Vminibuffer_local_filename_completion_map) (Vminibuffer_local_filename_must_match_map) (Vminibuffer_local_map, Vminibuffer_local_must_match_map) (Vminibuffer_local_ns_map, Vminor_mode_map_alist) (Vminor_mode_overriding_map_alist, Vwhere_is_preferred_modifier): Remove. * keyboard.c (syms_of_keyboard): Update. (Vauto_save_timeout, Vcommand_error_function) (Vcommand_hook_internal, Vdeactivate_mark) (Vdeferred_action_function, Vdeferred_action_list) (Vdisable_point_adjustment, Vdouble_click_time) (Vecho_keystrokes, Venable_disabled_menus_and_buttons) (Vfunction_key_map, Vglobal_disable_point_adjustment) (Vhelp_char, Vhelp_event_list, Vhelp_form) (Vinput_method_function, Vinput_method_previous_message) (Vkey_translation_map, Vlast_event_frame) (Vlucid_menu_bar_dirty_flag, Vmenu_bar_final_items) (Vminibuffer_message_timeout, Voverriding_local_map) (Voverriding_local_map_menu_flag, Vpost_command_hook) (Vpre_command_hook, Vprefix_help_command) (Vsaved_region_selection, Vselect_active_regions) (Vshow_help_function, Vspecial_event_map, Vsuggest_key_bindings) (Vthis_command, Vthis_command_keys_shift_translated) (Vthis_original_command, Vthrow_on_input, Vtimer_idle_list) (Vtimer_list, Vtool_bar_separator_image_expression, Vtop_level) (Vtty_erase_char, Vunread_command_events) (Vunread_input_method_events, Vunread_post_input_method_events) (auto_save_interval, cannot_suspend, do_mouse_tracking) (double_click_fuzz, extra_keyboard_modifiers) (inhibit_local_menu_bar_menus, last_command_event) (last_input_event, last_nonmenu_event, menu_prompt_more_char) (menu_prompting, meta_prefix_char, num_input_keys) (num_nonmacro_input_events, polling_period, unread_command_char): Remove. * insdel.c (syms_of_insdel): Update. (Vcombine_after_change_calls, check_markers_debug_flag): Remove. * indent.c (syms_of_indent): Update. (indent_tabs_mode): Remove. * image.c (syms_of_image): Update. (Vimage_cache_eviction_delay, Vimage_types) (Vimagemagick_render_type, Vmax_image_size, Vx_bitmap_file_path) (cross_disabled_images): Remove. * fringe.c (syms_of_fringe): Update. (Vfringe_bitmaps, Voverflow_newline_into_fringe): Remove. * frame.c (syms_of_frame): Update. (Vdefault_frame_alist, Vdefault_frame_scroll_bars) (Vdelete_frame_functions, Vframe_alpha_lower_limit) (Vmake_pointer_invisible, Vmenu_bar_mode, Vmouse_highlight) (Vmouse_position_function, Vterminal_frame, Vtool_bar_mode) (Vx_resource_class, Vx_resource_name, focus_follows_mouse): Remove. * fontset.c (syms_of_fontset): Update. (Valternate_fontname_alist, Vfont_encoding_charset_alist) (Vfontset_alias_alist, Vignore_relative_composition) (Votf_script_alist, Vuse_default_ascent) (Vvertical_centering_font_regexp): Remove. * font.c (syms_of_font): Update. (Vfont_encoding_alist, Vfont_log, Vfont_slant_table) (Vfont_weight_table, Vfont_width_table): Remove. * fns.c (syms_of_fns): Update. (Vfeatures, use_dialog_box, use_file_dialog): Remove. * filelock.c (syms_of_filelock): Update. (Vtemporary_file_directory): Remove. * fileio.c (syms_of_fileio): Update. (Vafter_insert_file_functions, Vauto_save_include_big_deletions) (Vauto_save_list_file_name, Vauto_save_visited_file_name) (Vdefault_file_name_coding_system, Vfile_name_coding_system) (Vfile_name_handler_alist, Vinhibit_file_name_handlers) (Vinhibit_file_name_operation, Vset_auto_coding_function) (Vwrite_region_annotate_functions) (Vwrite_region_annotations_so_far) (Vwrite_region_post_annotation_function) (delete_by_moving_to_trash, write_region_inhibit_fsync): Remove. (Vw32_get_true_file_attributes): Remove declaration. * eval.c (syms_of_eval): Update. (Vdebug_ignored_errors, Vdebug_on_error, Vdebug_on_signal) (Vdebugger, Vinhibit_quit, Vmacro_declaration_function) (Vquit_flag, Vsignal_hook_function, Vstack_trace_on_error) (debug_on_next_call, debug_on_quit, debugger_may_continue) (max_lisp_eval_depth, max_specpdl_size): Remove. * emacs.c (syms_of_emacs): Update. (Vafter_init_time, Vbefore_init_time, Vcommand_line_args) (Vdynamic_library_alist, Vemacs_copyright, Vemacs_version) (Vinstallation_directory, Vinvocation_directory) (Vinvocation_name, Vkill_emacs_hook, Vpath_separator) (Vprevious_system_messages_locale, Vprevious_system_time_locale) (Vsystem_configuration, Vsystem_configuration_options) (Vsystem_messages_locale, Vsystem_time_locale, Vsystem_type) (inhibit_x_resources, noninteractive1): Remove. * editfns.c (syms_of_editfns): Update. (Vbuffer_access_fontified_property) (Vbuffer_access_fontify_functions, Vinhibit_field_text_motion) (Voperating_system_release, Vsystem_name, Vuser_full_name) (Vuser_login_name, Vuser_real_login_name): Remove. * dosfns.c (syms_of_dosfns): Update. (Vdos_display_scancodes, Vdos_version, Vdos_windows_version) (dos_codepage, dos_country_code, dos_decimal_point) (dos_hyper_key, dos_keyboard_layout, dos_keypad_mode) (dos_super_key, dos_timezone_offset): Remove. * doc.c (syms_of_doc): Update. (Vbuild_files, Vdoc_file_name): Remove. * dispnew.c (syms_of_display): Update. (Vglyph_table, Vinitial_window_system) (Vredisplay_preemption_period, Vstandard_display_table) (Vwindow_system_version, baud_rate, cursor_in_echo_area) (inverse_video, redisplay_dont_pause, visible_bell): Remove. * dired.c (syms_of_dired): Update. (Vcompletion_ignored_extensions): Remove. (Vw32_get_true_file_attributes): Remove declaration. * dbusbind.c (syms_of_dbusbind): Update. (Vdbus_debug, Vdbus_registered_buses) (Vdbus_registered_objects_table): Remove. * data.c (syms_of_data): Update. (Vmost_negative_fixnum, Vmost_positive_fixnum): Remove. * composite.c (syms_of_composite): Update. (Vauto_composition_function, Vauto_composition_mode) (Vcompose_chars_after_function, Vcomposition_function_table): Remove. * coding.c (syms_of_coding): Update. (Vcharset_revision_table, Vcoding_category_list) (Vcoding_system_alist, Vcoding_system_for_read) (Vcoding_system_for_write, Vcoding_system_list) (Vdefault_process_coding_system, Venable_character_translation) (Vfile_coding_system_alist, Vlast_code_conversion_error) (Vlast_coding_system_used, Vlatin_extra_code_table) (Vlocale_coding_system, Vnetwork_coding_system_alist) (Vprocess_coding_system_alist) (Vselect_safe_coding_system_function) (Vstandard_translation_table_for_decode) (Vstandard_translation_table_for_encode) (Vtranslation_table_for_input, coding_system_require_warning) (eol_mnemonic_dos, eol_mnemonic_mac, eol_mnemonic_undecided) (eol_mnemonic_unix, inherit_process_coding_system) (inhibit_eol_conversion, inhibit_iso_escape_detection) (inhibit_null_byte_detection): Remove. * cmds.c (syms_of_cmds): Update. (Vpost_self_insert_hook): Remove. * charset.c (syms_of_charset): Update. (Vcharset_list, Vcharset_map_path, Vcurrent_iso639_language) (inhibit_load_charset_map): Remove. * character.c (syms_of_character): Update. (Vauto_fill_chars, Vchar_direction_table, Vchar_script_table) (Vchar_width_table, Vprintable_chars) (Vscript_representative_chars, Vtranslation_table_vector) (Vunicode_category_table): Remove. * ccl.c (syms_of_ccl): Update. (Vcode_conversion_map_vector, Vfont_ccl_encoder_alist) (Vtranslation_hash_table_vector): Remove. * category.c (syms_of_category): Update. (Vword_combining_categories, Vword_separating_categories): Remove. * callproc.c (syms_of_callproc): Update. (Vconfigure_info_directory, Vdata_directory, Vdoc_directory) (Vexec_directory, Vexec_path, Vexec_suffixes) (Vinitial_environment, Vprocess_environment) (Vshared_game_score_directory, Vshell_file_name): Remove. * callint.c (syms_of_callint): Update. (Vcommand_debug_status, Vcommand_history, Vcurrent_prefix_arg) (Vmark_even_if_inactive, Vmouse_leave_buffer_hook): Remove. * bytecode.c (syms_of_bytecode): Update. (Vbyte_code_meter, byte_metering_on): Remove. * buffer.c (syms_of_buffer): Update. (Vafter_change_functions, Vbefore_change_functions) (Vchange_major_mode_hook, Vfirst_change_hook) (Vinhibit_read_only, Vkill_buffer_query_functions) (Vtransient_mark_mode, inhibit_modification_hooks): Remove. * alloc.c (syms_of_alloc): Update. (Vgc_cons_percentage, Vgc_elapsed, Vmemory_full) (Vmemory_signal_data, Vpost_gc_hook, Vpurify_flag) (cons_cells_consed, floats_consed, garbage_collection_messages) (gc_cons_threshold, gcs_done, intervals_consed) (misc_objects_consed, pure_bytes_used, string_chars_consed) (strings_consed, symbols_consed, vector_cells_consed): Remove. * lisp.h (DEFVAR_LISP, DEFVAR_LISP_NOPRO, DEFVAR_BOOL) (DEFVAR_INT): Assume global is in `globals'. * alloc.c (globals): Define.
1103 lines
34 KiB
C
1103 lines
34 KiB
C
/* Lisp functions for making directory listings.
|
||
Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001, 2002, 2003,
|
||
2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||
|
||
This file is part of GNU Emacs.
|
||
|
||
GNU Emacs is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
GNU Emacs is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||
|
||
|
||
#include <config.h>
|
||
|
||
#include <stdio.h>
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <setjmp.h>
|
||
|
||
#ifdef HAVE_PWD_H
|
||
#include <pwd.h>
|
||
#endif
|
||
#include <grp.h>
|
||
|
||
#include <errno.h>
|
||
#include <unistd.h>
|
||
|
||
/* The d_nameln member of a struct dirent includes the '\0' character
|
||
on some systems, but not on others. What's worse, you can't tell
|
||
at compile-time which one it will be, since it really depends on
|
||
the sort of system providing the filesystem you're reading from,
|
||
not the system you are running on. Paul Eggert
|
||
<eggert@bi.twinsun.com> says this occurs when Emacs is running on a
|
||
SunOS 4.1.2 host, reading a directory that is remote-mounted from a
|
||
Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
|
||
|
||
Since applying strlen to the name always works, we'll just do that. */
|
||
#define NAMLEN(p) strlen (p->d_name)
|
||
|
||
#ifdef HAVE_DIRENT_H
|
||
|
||
#include <dirent.h>
|
||
#define DIRENTRY struct dirent
|
||
|
||
#else /* not HAVE_DIRENT_H */
|
||
|
||
#include <sys/dir.h>
|
||
#include <sys/stat.h>
|
||
|
||
#define DIRENTRY struct direct
|
||
|
||
extern DIR *opendir (char *);
|
||
extern struct direct *readdir (DIR *);
|
||
|
||
#endif /* HAVE_DIRENT_H */
|
||
|
||
#ifdef MSDOS
|
||
#define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
|
||
#else
|
||
#define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
|
||
#endif
|
||
|
||
#include "lisp.h"
|
||
#include "systime.h"
|
||
#include "buffer.h"
|
||
#include "commands.h"
|
||
#include "character.h"
|
||
#include "charset.h"
|
||
#include "coding.h"
|
||
#include "regex.h"
|
||
#include "blockinput.h"
|
||
|
||
/* Returns a search buffer, with a fastmap allocated and ready to go. */
|
||
extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
|
||
struct re_registers *,
|
||
Lisp_Object, int, int);
|
||
|
||
/* From filemode.c. Can't go in Lisp.h because of `stat'. */
|
||
extern void filemodestring (struct stat *, char *);
|
||
|
||
/* if system does not have symbolic links, it does not have lstat.
|
||
In that case, use ordinary stat instead. */
|
||
|
||
#ifndef S_IFLNK
|
||
#define lstat stat
|
||
#endif
|
||
|
||
Lisp_Object Qdirectory_files;
|
||
Lisp_Object Qdirectory_files_and_attributes;
|
||
Lisp_Object Qfile_name_completion;
|
||
Lisp_Object Qfile_name_all_completions;
|
||
Lisp_Object Qfile_attributes;
|
||
Lisp_Object Qfile_attributes_lessp;
|
||
|
||
static int scmp (const unsigned char *, const unsigned char *, int);
|
||
|
||
#ifdef WINDOWSNT
|
||
Lisp_Object
|
||
directory_files_internal_w32_unwind (Lisp_Object arg)
|
||
{
|
||
Vw32_get_true_file_attributes = arg;
|
||
return Qnil;
|
||
}
|
||
#endif
|
||
|
||
Lisp_Object
|
||
directory_files_internal_unwind (Lisp_Object dh)
|
||
{
|
||
DIR *d = (DIR *) XSAVE_VALUE (dh)->pointer;
|
||
BLOCK_INPUT;
|
||
closedir (d);
|
||
UNBLOCK_INPUT;
|
||
return Qnil;
|
||
}
|
||
|
||
/* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
|
||
When ATTRS is zero, return a list of directory filenames; when
|
||
non-zero, return a list of directory filenames and their attributes.
|
||
In the latter case, ID_FORMAT is passed to Ffile_attributes. */
|
||
|
||
Lisp_Object
|
||
directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, int attrs, Lisp_Object id_format)
|
||
{
|
||
DIR *d;
|
||
int directory_nbytes;
|
||
Lisp_Object list, dirfilename, encoded_directory;
|
||
struct re_pattern_buffer *bufp = NULL;
|
||
int needsep = 0;
|
||
int count = SPECPDL_INDEX ();
|
||
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
|
||
DIRENTRY *dp;
|
||
#ifdef WINDOWSNT
|
||
Lisp_Object w32_save = Qnil;
|
||
#endif
|
||
|
||
/* Because of file name handlers, these functions might call
|
||
Ffuncall, and cause a GC. */
|
||
list = encoded_directory = dirfilename = Qnil;
|
||
GCPRO5 (match, directory, list, dirfilename, encoded_directory);
|
||
dirfilename = Fdirectory_file_name (directory);
|
||
|
||
if (!NILP (match))
|
||
{
|
||
CHECK_STRING (match);
|
||
|
||
/* MATCH might be a flawed regular expression. Rather than
|
||
catching and signaling our own errors, we just call
|
||
compile_pattern to do the work for us. */
|
||
/* Pass 1 for the MULTIBYTE arg
|
||
because we do make multibyte strings if the contents warrant. */
|
||
# ifdef WINDOWSNT
|
||
/* Windows users want case-insensitive wildcards. */
|
||
bufp = compile_pattern (match, 0,
|
||
buffer_defaults.case_canon_table, 0, 1);
|
||
# else /* !WINDOWSNT */
|
||
bufp = compile_pattern (match, 0, Qnil, 0, 1);
|
||
# endif /* !WINDOWSNT */
|
||
}
|
||
|
||
/* Note: ENCODE_FILE and DECODE_FILE can GC because they can run
|
||
run_pre_post_conversion_on_str which calls Lisp directly and
|
||
indirectly. */
|
||
if (STRING_MULTIBYTE (dirfilename))
|
||
dirfilename = ENCODE_FILE (dirfilename);
|
||
encoded_directory = (STRING_MULTIBYTE (directory)
|
||
? ENCODE_FILE (directory) : directory);
|
||
|
||
/* Now *bufp is the compiled form of MATCH; don't call anything
|
||
which might compile a new regexp until we're done with the loop! */
|
||
|
||
BLOCK_INPUT;
|
||
d = opendir (SDATA (dirfilename));
|
||
UNBLOCK_INPUT;
|
||
if (d == NULL)
|
||
report_file_error ("Opening directory", Fcons (directory, Qnil));
|
||
|
||
/* Unfortunately, we can now invoke expand-file-name and
|
||
file-attributes on filenames, both of which can throw, so we must
|
||
do a proper unwind-protect. */
|
||
record_unwind_protect (directory_files_internal_unwind,
|
||
make_save_value (d, 0));
|
||
|
||
#ifdef WINDOWSNT
|
||
if (attrs)
|
||
{
|
||
extern int is_slow_fs (const char *);
|
||
|
||
/* Do this only once to avoid doing it (in w32.c:stat) for each
|
||
file in the directory, when we call Ffile_attributes below. */
|
||
record_unwind_protect (directory_files_internal_w32_unwind,
|
||
Vw32_get_true_file_attributes);
|
||
w32_save = Vw32_get_true_file_attributes;
|
||
if (EQ (Vw32_get_true_file_attributes, Qlocal))
|
||
{
|
||
/* w32.c:stat will notice these bindings and avoid calling
|
||
GetDriveType for each file. */
|
||
if (is_slow_fs (SDATA (dirfilename)))
|
||
Vw32_get_true_file_attributes = Qnil;
|
||
else
|
||
Vw32_get_true_file_attributes = Qt;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
directory_nbytes = SBYTES (directory);
|
||
re_match_object = Qt;
|
||
|
||
/* Decide whether we need to add a directory separator. */
|
||
if (directory_nbytes == 0
|
||
|| !IS_ANY_SEP (SREF (directory, directory_nbytes - 1)))
|
||
needsep = 1;
|
||
|
||
/* Loop reading blocks until EOF or error. */
|
||
for (;;)
|
||
{
|
||
errno = 0;
|
||
dp = readdir (d);
|
||
|
||
if (dp == NULL && (0
|
||
#ifdef EAGAIN
|
||
|| errno == EAGAIN
|
||
#endif
|
||
#ifdef EINTR
|
||
|| errno == EINTR
|
||
#endif
|
||
))
|
||
{ QUIT; continue; }
|
||
|
||
if (dp == NULL)
|
||
break;
|
||
|
||
if (DIRENTRY_NONEMPTY (dp))
|
||
{
|
||
int len;
|
||
int wanted = 0;
|
||
Lisp_Object name, finalname;
|
||
struct gcpro gcpro1, gcpro2;
|
||
|
||
len = NAMLEN (dp);
|
||
name = finalname = make_unibyte_string (dp->d_name, len);
|
||
GCPRO2 (finalname, name);
|
||
|
||
/* Note: DECODE_FILE can GC; it should protect its argument,
|
||
though. */
|
||
name = DECODE_FILE (name);
|
||
len = SBYTES (name);
|
||
|
||
/* Now that we have unwind_protect in place, we might as well
|
||
allow matching to be interrupted. */
|
||
immediate_quit = 1;
|
||
QUIT;
|
||
|
||
if (NILP (match)
|
||
|| (0 <= re_search (bufp, SDATA (name), len, 0, len, 0)))
|
||
wanted = 1;
|
||
|
||
immediate_quit = 0;
|
||
|
||
if (wanted)
|
||
{
|
||
if (!NILP (full))
|
||
{
|
||
Lisp_Object fullname;
|
||
int nbytes = len + directory_nbytes + needsep;
|
||
int nchars;
|
||
|
||
fullname = make_uninit_multibyte_string (nbytes, nbytes);
|
||
memcpy (SDATA (fullname), SDATA (directory),
|
||
directory_nbytes);
|
||
|
||
if (needsep)
|
||
SSET (fullname, directory_nbytes, DIRECTORY_SEP);
|
||
|
||
memcpy (SDATA (fullname) + directory_nbytes + needsep,
|
||
SDATA (name), len);
|
||
|
||
nchars = chars_in_text (SDATA (fullname), nbytes);
|
||
|
||
/* Some bug somewhere. */
|
||
if (nchars > nbytes)
|
||
abort ();
|
||
|
||
STRING_SET_CHARS (fullname, nchars);
|
||
if (nchars == nbytes)
|
||
STRING_SET_UNIBYTE (fullname);
|
||
|
||
finalname = fullname;
|
||
}
|
||
else
|
||
finalname = name;
|
||
|
||
if (attrs)
|
||
{
|
||
/* Construct an expanded filename for the directory entry.
|
||
Use the decoded names for input to Ffile_attributes. */
|
||
Lisp_Object decoded_fullname, fileattrs;
|
||
struct gcpro gcpro1, gcpro2;
|
||
|
||
decoded_fullname = fileattrs = Qnil;
|
||
GCPRO2 (decoded_fullname, fileattrs);
|
||
|
||
/* Both Fexpand_file_name and Ffile_attributes can GC. */
|
||
decoded_fullname = Fexpand_file_name (name, directory);
|
||
fileattrs = Ffile_attributes (decoded_fullname, id_format);
|
||
|
||
list = Fcons (Fcons (finalname, fileattrs), list);
|
||
UNGCPRO;
|
||
}
|
||
else
|
||
list = Fcons (finalname, list);
|
||
}
|
||
|
||
UNGCPRO;
|
||
}
|
||
}
|
||
|
||
BLOCK_INPUT;
|
||
closedir (d);
|
||
UNBLOCK_INPUT;
|
||
#ifdef WINDOWSNT
|
||
if (attrs)
|
||
Vw32_get_true_file_attributes = w32_save;
|
||
#endif
|
||
|
||
/* Discard the unwind protect. */
|
||
specpdl_ptr = specpdl + count;
|
||
|
||
if (NILP (nosort))
|
||
list = Fsort (Fnreverse (list),
|
||
attrs ? Qfile_attributes_lessp : Qstring_lessp);
|
||
|
||
RETURN_UNGCPRO (list);
|
||
}
|
||
|
||
|
||
DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
|
||
doc: /* Return a list of names of files in DIRECTORY.
|
||
There are three optional arguments:
|
||
If FULL is non-nil, return absolute file names. Otherwise return names
|
||
that are relative to the specified directory.
|
||
If MATCH is non-nil, mention only file names that match the regexp MATCH.
|
||
If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
|
||
Otherwise, the list returned is sorted with `string-lessp'.
|
||
NOSORT is useful if you plan to sort the result yourself. */)
|
||
(Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort)
|
||
{
|
||
Lisp_Object handler;
|
||
directory = Fexpand_file_name (directory, Qnil);
|
||
|
||
/* If the file name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (directory, Qdirectory_files);
|
||
if (!NILP (handler))
|
||
return call5 (handler, Qdirectory_files, directory,
|
||
full, match, nosort);
|
||
|
||
return directory_files_internal (directory, full, match, nosort, 0, Qnil);
|
||
}
|
||
|
||
DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
|
||
Sdirectory_files_and_attributes, 1, 5, 0,
|
||
doc: /* Return a list of names of files and their attributes in DIRECTORY.
|
||
There are four optional arguments:
|
||
If FULL is non-nil, return absolute file names. Otherwise return names
|
||
that are relative to the specified directory.
|
||
If MATCH is non-nil, mention only file names that match the regexp MATCH.
|
||
If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
|
||
NOSORT is useful if you plan to sort the result yourself.
|
||
ID-FORMAT specifies the preferred format of attributes uid and gid, see
|
||
`file-attributes' for further documentation.
|
||
On MS-Windows, performance depends on `w32-get-true-file-attributes',
|
||
which see. */)
|
||
(Lisp_Object directory, Lisp_Object full, Lisp_Object match, Lisp_Object nosort, Lisp_Object id_format)
|
||
{
|
||
Lisp_Object handler;
|
||
directory = Fexpand_file_name (directory, Qnil);
|
||
|
||
/* If the file name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
|
||
if (!NILP (handler))
|
||
return call6 (handler, Qdirectory_files_and_attributes,
|
||
directory, full, match, nosort, id_format);
|
||
|
||
return directory_files_internal (directory, full, match, nosort, 1, id_format);
|
||
}
|
||
|
||
|
||
Lisp_Object file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate);
|
||
|
||
DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
|
||
2, 3, 0,
|
||
doc: /* Complete file name FILE in directory DIRECTORY.
|
||
Returns the longest string
|
||
common to all file names in DIRECTORY that start with FILE.
|
||
If there is only one and FILE matches it exactly, returns t.
|
||
Returns nil if DIRECTORY contains no name starting with FILE.
|
||
|
||
If PREDICATE is non-nil, call PREDICATE with each possible
|
||
completion (in absolute form) and ignore it if PREDICATE returns nil.
|
||
|
||
This function ignores some of the possible completions as
|
||
determined by the variable `completion-ignored-extensions', which see. */)
|
||
(Lisp_Object file, Lisp_Object directory, Lisp_Object predicate)
|
||
{
|
||
Lisp_Object handler;
|
||
|
||
/* If the directory name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (directory, Qfile_name_completion);
|
||
if (!NILP (handler))
|
||
return call4 (handler, Qfile_name_completion, file, directory, predicate);
|
||
|
||
/* If the file name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (file, Qfile_name_completion);
|
||
if (!NILP (handler))
|
||
return call4 (handler, Qfile_name_completion, file, directory, predicate);
|
||
|
||
return file_name_completion (file, directory, 0, 0, predicate);
|
||
}
|
||
|
||
DEFUN ("file-name-all-completions", Ffile_name_all_completions,
|
||
Sfile_name_all_completions, 2, 2, 0,
|
||
doc: /* Return a list of all completions of file name FILE in directory DIRECTORY.
|
||
These are all file names in directory DIRECTORY which begin with FILE. */)
|
||
(Lisp_Object file, Lisp_Object directory)
|
||
{
|
||
Lisp_Object handler;
|
||
|
||
/* If the directory name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
|
||
if (!NILP (handler))
|
||
return call3 (handler, Qfile_name_all_completions, file, directory);
|
||
|
||
/* If the file name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
|
||
if (!NILP (handler))
|
||
return call3 (handler, Qfile_name_all_completions, file, directory);
|
||
|
||
return file_name_completion (file, directory, 1, 0, Qnil);
|
||
}
|
||
|
||
static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
|
||
Lisp_Object Qdefault_directory;
|
||
|
||
Lisp_Object
|
||
file_name_completion (Lisp_Object file, Lisp_Object dirname, int all_flag, int ver_flag, Lisp_Object predicate)
|
||
{
|
||
DIR *d;
|
||
int bestmatchsize = 0;
|
||
int matchcount = 0;
|
||
/* If ALL_FLAG is 1, BESTMATCH is the list of all matches, decoded.
|
||
If ALL_FLAG is 0, BESTMATCH is either nil
|
||
or the best match so far, not decoded. */
|
||
Lisp_Object bestmatch, tem, elt, name;
|
||
Lisp_Object encoded_file;
|
||
Lisp_Object encoded_dir;
|
||
struct stat st;
|
||
int directoryp;
|
||
/* If includeall is zero, exclude files in completion-ignored-extensions as
|
||
well as "." and "..". Until shown otherwise, assume we can't exclude
|
||
anything. */
|
||
int includeall = 1;
|
||
int count = SPECPDL_INDEX ();
|
||
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
|
||
|
||
elt = Qnil;
|
||
|
||
CHECK_STRING (file);
|
||
|
||
#ifdef FILE_SYSTEM_CASE
|
||
file = FILE_SYSTEM_CASE (file);
|
||
#endif
|
||
bestmatch = Qnil;
|
||
encoded_file = encoded_dir = Qnil;
|
||
GCPRO5 (file, dirname, bestmatch, encoded_file, encoded_dir);
|
||
dirname = Fexpand_file_name (dirname, Qnil);
|
||
specbind (Qdefault_directory, dirname);
|
||
|
||
/* Do completion on the encoded file name
|
||
because the other names in the directory are (we presume)
|
||
encoded likewise. We decode the completed string at the end. */
|
||
/* Actually, this is not quite true any more: we do most of the completion
|
||
work with decoded file names, but we still do some filtering based
|
||
on the encoded file name. */
|
||
encoded_file = STRING_MULTIBYTE (file) ? ENCODE_FILE (file) : file;
|
||
|
||
encoded_dir = ENCODE_FILE (dirname);
|
||
|
||
BLOCK_INPUT;
|
||
d = opendir (SDATA (Fdirectory_file_name (encoded_dir)));
|
||
UNBLOCK_INPUT;
|
||
if (!d)
|
||
report_file_error ("Opening directory", Fcons (dirname, Qnil));
|
||
|
||
record_unwind_protect (directory_files_internal_unwind,
|
||
make_save_value (d, 0));
|
||
|
||
/* Loop reading blocks */
|
||
/* (att3b compiler bug requires do a null comparison this way) */
|
||
while (1)
|
||
{
|
||
DIRENTRY *dp;
|
||
int len;
|
||
int canexclude = 0;
|
||
|
||
errno = 0;
|
||
dp = readdir (d);
|
||
if (dp == NULL && (0
|
||
# ifdef EAGAIN
|
||
|| errno == EAGAIN
|
||
# endif
|
||
# ifdef EINTR
|
||
|| errno == EINTR
|
||
# endif
|
||
))
|
||
{ QUIT; continue; }
|
||
|
||
if (!dp) break;
|
||
|
||
len = NAMLEN (dp);
|
||
|
||
QUIT;
|
||
if (! DIRENTRY_NONEMPTY (dp)
|
||
|| len < SCHARS (encoded_file)
|
||
|| 0 <= scmp (dp->d_name, SDATA (encoded_file),
|
||
SCHARS (encoded_file)))
|
||
continue;
|
||
|
||
if (file_name_completion_stat (encoded_dir, dp, &st) < 0)
|
||
continue;
|
||
|
||
directoryp = ((st.st_mode & S_IFMT) == S_IFDIR);
|
||
tem = Qnil;
|
||
/* If all_flag is set, always include all.
|
||
It would not actually be helpful to the user to ignore any possible
|
||
completions when making a list of them. */
|
||
if (!all_flag)
|
||
{
|
||
int skip;
|
||
|
||
#if 0 /* FIXME: The `scmp' call compares an encoded and a decoded string. */
|
||
/* If this entry matches the current bestmatch, the only
|
||
thing it can do is increase matchcount, so don't bother
|
||
investigating it any further. */
|
||
if (!completion_ignore_case
|
||
/* The return result depends on whether it's the sole match. */
|
||
&& matchcount > 1
|
||
&& !includeall /* This match may allow includeall to 0. */
|
||
&& len >= bestmatchsize
|
||
&& 0 > scmp (dp->d_name, SDATA (bestmatch), bestmatchsize))
|
||
continue;
|
||
#endif
|
||
|
||
if (directoryp)
|
||
{
|
||
#ifndef TRIVIAL_DIRECTORY_ENTRY
|
||
#define TRIVIAL_DIRECTORY_ENTRY(n) (!strcmp (n, ".") || !strcmp (n, ".."))
|
||
#endif
|
||
/* "." and ".." are never interesting as completions, and are
|
||
actually in the way in a directory with only one file. */
|
||
if (TRIVIAL_DIRECTORY_ENTRY (dp->d_name))
|
||
canexclude = 1;
|
||
else if (len > SCHARS (encoded_file))
|
||
/* Ignore directories if they match an element of
|
||
completion-ignored-extensions which ends in a slash. */
|
||
for (tem = Vcompletion_ignored_extensions;
|
||
CONSP (tem); tem = XCDR (tem))
|
||
{
|
||
int elt_len;
|
||
unsigned char *p1;
|
||
|
||
elt = XCAR (tem);
|
||
if (!STRINGP (elt))
|
||
continue;
|
||
/* Need to encode ELT, since scmp compares unibyte
|
||
strings only. */
|
||
elt = ENCODE_FILE (elt);
|
||
elt_len = SCHARS (elt) - 1; /* -1 for trailing / */
|
||
if (elt_len <= 0)
|
||
continue;
|
||
p1 = SDATA (elt);
|
||
if (p1[elt_len] != '/')
|
||
continue;
|
||
skip = len - elt_len;
|
||
if (skip < 0)
|
||
continue;
|
||
|
||
if (0 <= scmp (dp->d_name + skip, p1, elt_len))
|
||
continue;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* Compare extensions-to-be-ignored against end of this file name */
|
||
/* if name is not an exact match against specified string */
|
||
if (len > SCHARS (encoded_file))
|
||
/* and exit this for loop if a match is found */
|
||
for (tem = Vcompletion_ignored_extensions;
|
||
CONSP (tem); tem = XCDR (tem))
|
||
{
|
||
elt = XCAR (tem);
|
||
if (!STRINGP (elt)) continue;
|
||
/* Need to encode ELT, since scmp compares unibyte
|
||
strings only. */
|
||
elt = ENCODE_FILE (elt);
|
||
skip = len - SCHARS (elt);
|
||
if (skip < 0) continue;
|
||
|
||
if (0 <= scmp (dp->d_name + skip,
|
||
SDATA (elt),
|
||
SCHARS (elt)))
|
||
continue;
|
||
break;
|
||
}
|
||
}
|
||
|
||
/* If an ignored-extensions match was found,
|
||
don't process this name as a completion. */
|
||
if (CONSP (tem))
|
||
canexclude = 1;
|
||
|
||
if (!includeall && canexclude)
|
||
/* We're not including all files and this file can be excluded. */
|
||
continue;
|
||
|
||
if (includeall && !canexclude)
|
||
{ /* If we have one non-excludable file, we want to exclude the
|
||
excudable files. */
|
||
includeall = 0;
|
||
/* Throw away any previous excludable match found. */
|
||
bestmatch = Qnil;
|
||
bestmatchsize = 0;
|
||
matchcount = 0;
|
||
}
|
||
}
|
||
/* FIXME: If we move this `decode' earlier we can eliminate
|
||
the repeated ENCODE_FILE on Vcompletion_ignored_extensions. */
|
||
name = make_unibyte_string (dp->d_name, len);
|
||
name = DECODE_FILE (name);
|
||
|
||
{
|
||
Lisp_Object regexps;
|
||
Lisp_Object zero;
|
||
XSETFASTINT (zero, 0);
|
||
|
||
/* Ignore this element if it fails to match all the regexps. */
|
||
if (completion_ignore_case)
|
||
{
|
||
for (regexps = Vcompletion_regexp_list; CONSP (regexps);
|
||
regexps = XCDR (regexps))
|
||
if (fast_string_match_ignore_case (XCAR (regexps), name) < 0)
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
for (regexps = Vcompletion_regexp_list; CONSP (regexps);
|
||
regexps = XCDR (regexps))
|
||
if (fast_string_match (XCAR (regexps), name) < 0)
|
||
break;
|
||
}
|
||
|
||
if (CONSP (regexps))
|
||
continue;
|
||
}
|
||
|
||
/* This is a possible completion */
|
||
if (directoryp)
|
||
/* This completion is a directory; make it end with '/'. */
|
||
name = Ffile_name_as_directory (name);
|
||
|
||
/* Test the predicate, if any. */
|
||
if (!NILP (predicate))
|
||
{
|
||
Lisp_Object val;
|
||
struct gcpro gcpro1;
|
||
|
||
GCPRO1 (name);
|
||
val = call1 (predicate, name);
|
||
UNGCPRO;
|
||
|
||
if (NILP (val))
|
||
continue;
|
||
}
|
||
|
||
/* Suitably record this match. */
|
||
|
||
matchcount++;
|
||
|
||
if (all_flag)
|
||
bestmatch = Fcons (name, bestmatch);
|
||
else if (NILP (bestmatch))
|
||
{
|
||
bestmatch = name;
|
||
bestmatchsize = SCHARS (name);
|
||
}
|
||
else
|
||
{
|
||
Lisp_Object zero = make_number (0);
|
||
/* FIXME: This is a copy of the code in Ftry_completion. */
|
||
int compare = min (bestmatchsize, SCHARS (name));
|
||
Lisp_Object tem
|
||
= Fcompare_strings (bestmatch, zero,
|
||
make_number (compare),
|
||
name, zero,
|
||
make_number (compare),
|
||
completion_ignore_case ? Qt : Qnil);
|
||
int matchsize
|
||
= (EQ (tem, Qt) ? compare
|
||
: XINT (tem) < 0 ? - XINT (tem) - 1
|
||
: XINT (tem) - 1);
|
||
|
||
if (completion_ignore_case)
|
||
{
|
||
/* If this is an exact match except for case,
|
||
use it as the best match rather than one that is not
|
||
an exact match. This way, we get the case pattern
|
||
of the actual match. */
|
||
/* This tests that the current file is an exact match
|
||
but BESTMATCH is not (it is too long). */
|
||
if ((matchsize == SCHARS (name)
|
||
&& matchsize + !!directoryp < SCHARS (bestmatch))
|
||
||
|
||
/* If there is no exact match ignoring case,
|
||
prefer a match that does not change the case
|
||
of the input. */
|
||
/* If there is more than one exact match aside from
|
||
case, and one of them is exact including case,
|
||
prefer that one. */
|
||
/* This == checks that, of current file and BESTMATCH,
|
||
either both or neither are exact. */
|
||
(((matchsize == SCHARS (name))
|
||
==
|
||
(matchsize + !!directoryp == SCHARS (bestmatch)))
|
||
&& (tem = Fcompare_strings (name, zero,
|
||
make_number (SCHARS (file)),
|
||
file, zero,
|
||
Qnil,
|
||
Qnil),
|
||
EQ (Qt, tem))
|
||
&& (tem = Fcompare_strings (bestmatch, zero,
|
||
make_number (SCHARS (file)),
|
||
file, zero,
|
||
Qnil,
|
||
Qnil),
|
||
! EQ (Qt, tem))))
|
||
bestmatch = name;
|
||
}
|
||
bestmatchsize = matchsize;
|
||
|
||
/* If the best completion so far is reduced to the string
|
||
we're trying to complete, then we already know there's no
|
||
other completion, so there's no point looking any further. */
|
||
if (matchsize <= SCHARS (file)
|
||
&& !includeall /* A future match may allow includeall to 0. */
|
||
/* If completion-ignore-case is non-nil, don't
|
||
short-circuit because we want to find the best
|
||
possible match *including* case differences. */
|
||
&& (!completion_ignore_case || matchsize == 0)
|
||
/* The return value depends on whether it's the sole match. */
|
||
&& matchcount > 1)
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
UNGCPRO;
|
||
/* This closes the directory. */
|
||
bestmatch = unbind_to (count, bestmatch);
|
||
|
||
if (all_flag || NILP (bestmatch))
|
||
return bestmatch;
|
||
/* Return t if the supplied string is an exact match (counting case);
|
||
it does not require any change to be made. */
|
||
if (matchcount == 1 && !NILP (Fequal (bestmatch, file)))
|
||
return Qt;
|
||
bestmatch = Fsubstring (bestmatch, make_number (0),
|
||
make_number (bestmatchsize));
|
||
return bestmatch;
|
||
}
|
||
|
||
/* Compare exactly LEN chars of strings at S1 and S2,
|
||
ignoring case if appropriate.
|
||
Return -1 if strings match,
|
||
else number of chars that match at the beginning. */
|
||
|
||
static int
|
||
scmp (const unsigned char *s1, const unsigned char *s2, int len)
|
||
{
|
||
register int l = len;
|
||
|
||
if (completion_ignore_case)
|
||
{
|
||
while (l && DOWNCASE (*s1++) == DOWNCASE (*s2++))
|
||
l--;
|
||
}
|
||
else
|
||
{
|
||
while (l && *s1++ == *s2++)
|
||
l--;
|
||
}
|
||
if (l == 0)
|
||
return -1;
|
||
else
|
||
return len - l;
|
||
}
|
||
|
||
static int
|
||
file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
|
||
{
|
||
int len = NAMLEN (dp);
|
||
int pos = SCHARS (dirname);
|
||
int value;
|
||
char *fullname = (char *) alloca (len + pos + 2);
|
||
|
||
#ifdef MSDOS
|
||
/* Some fields of struct stat are *very* expensive to compute on MS-DOS,
|
||
but aren't required here. Avoid computing the following fields:
|
||
st_inode, st_size and st_nlink for directories, and the execute bits
|
||
in st_mode for non-directory files with non-standard extensions. */
|
||
|
||
unsigned short save_djstat_flags = _djstat_flags;
|
||
|
||
_djstat_flags = _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
|
||
#endif /* MSDOS */
|
||
|
||
memcpy (fullname, SDATA (dirname), pos);
|
||
if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
|
||
fullname[pos++] = DIRECTORY_SEP;
|
||
|
||
memcpy (fullname + pos, dp->d_name, len);
|
||
fullname[pos + len] = 0;
|
||
|
||
#ifdef S_IFLNK
|
||
/* We want to return success if a link points to a nonexistent file,
|
||
but we want to return the status for what the link points to,
|
||
in case it is a directory. */
|
||
value = lstat (fullname, st_addr);
|
||
stat (fullname, st_addr);
|
||
return value;
|
||
#else
|
||
value = stat (fullname, st_addr);
|
||
#ifdef MSDOS
|
||
_djstat_flags = save_djstat_flags;
|
||
#endif /* MSDOS */
|
||
return value;
|
||
#endif /* S_IFLNK */
|
||
}
|
||
|
||
Lisp_Object
|
||
make_time (time_t time)
|
||
{
|
||
return Fcons (make_number (time >> 16),
|
||
Fcons (make_number (time & 0177777), Qnil));
|
||
}
|
||
|
||
static char *
|
||
stat_uname (struct stat *st)
|
||
{
|
||
#ifdef WINDOWSNT
|
||
return st->st_uname;
|
||
#else
|
||
struct passwd *pw = (struct passwd *) getpwuid (st->st_uid);
|
||
|
||
if (pw)
|
||
return pw->pw_name;
|
||
else
|
||
return NULL;
|
||
#endif
|
||
}
|
||
|
||
static char *
|
||
stat_gname (struct stat *st)
|
||
{
|
||
#ifdef WINDOWSNT
|
||
return st->st_gname;
|
||
#else
|
||
struct group *gr = (struct group *) getgrgid (st->st_gid);
|
||
|
||
if (gr)
|
||
return gr->gr_name;
|
||
else
|
||
return NULL;
|
||
#endif
|
||
}
|
||
|
||
DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0,
|
||
doc: /* Return a list of attributes of file FILENAME.
|
||
Value is nil if specified file cannot be opened.
|
||
|
||
ID-FORMAT specifies the preferred format of attributes uid and gid (see
|
||
below) - valid values are 'string and 'integer. The latter is the
|
||
default, but we plan to change that, so you should specify a non-nil value
|
||
for ID-FORMAT if you use the returned uid or gid.
|
||
|
||
Elements of the attribute list are:
|
||
0. t for directory, string (name linked to) for symbolic link, or nil.
|
||
1. Number of links to file.
|
||
2. File uid as a string or a number. If a string value cannot be
|
||
looked up, a numeric value, either an integer or a float, is returned.
|
||
3. File gid, likewise.
|
||
4. Last access time, as a list of two integers.
|
||
First integer has high-order 16 bits of time, second has low 16 bits.
|
||
(See a note below about access time on FAT-based filesystems.)
|
||
5. Last modification time, likewise. This is the time of the last
|
||
change to the file's contents.
|
||
6. Last status change time, likewise. This is the time of last change
|
||
to the file's attributes: owner and group, access mode bits, etc.
|
||
7. Size in bytes.
|
||
This is a floating point number if the size is too large for an integer.
|
||
8. File modes, as a string of ten letters or dashes as in ls -l.
|
||
9. t if file's gid would change if file were deleted and recreated.
|
||
10. inode number. If inode number is larger than what Emacs integer
|
||
can hold, but still fits into a 32-bit number, this is a cons cell
|
||
containing two integers: first the high part, then the low 16 bits.
|
||
If the inode number is wider than 32 bits, this is of the form
|
||
(HIGH MIDDLE . LOW): first the high 24 bits, then middle 24 bits,
|
||
and finally the low 16 bits.
|
||
11. Filesystem device number. If it is larger than what the Emacs
|
||
integer can hold, this is a cons cell, similar to the inode number.
|
||
|
||
On most filesystems, the combination of the inode and the device
|
||
number uniquely identifies the file.
|
||
|
||
On MS-Windows, performance depends on `w32-get-true-file-attributes',
|
||
which see.
|
||
|
||
On some FAT-based filesystems, only the date of last access is recorded,
|
||
so last access time will always be midnight of that day. */)
|
||
(Lisp_Object filename, Lisp_Object id_format)
|
||
{
|
||
Lisp_Object values[12];
|
||
Lisp_Object encoded;
|
||
struct stat s;
|
||
#ifdef BSD4_2
|
||
Lisp_Object dirname;
|
||
struct stat sdir;
|
||
#endif /* BSD4_2 */
|
||
char modes[10];
|
||
Lisp_Object handler;
|
||
struct gcpro gcpro1;
|
||
char *uname = NULL, *gname = NULL;
|
||
|
||
filename = Fexpand_file_name (filename, Qnil);
|
||
|
||
/* If the file name has special constructs in it,
|
||
call the corresponding file handler. */
|
||
handler = Ffind_file_name_handler (filename, Qfile_attributes);
|
||
if (!NILP (handler))
|
||
{ /* Only pass the extra arg if it is used to help backward compatibility
|
||
with old file handlers which do not implement the new arg. --Stef */
|
||
if (NILP (id_format))
|
||
return call2 (handler, Qfile_attributes, filename);
|
||
else
|
||
return call3 (handler, Qfile_attributes, filename, id_format);
|
||
}
|
||
|
||
GCPRO1 (filename);
|
||
encoded = ENCODE_FILE (filename);
|
||
UNGCPRO;
|
||
|
||
if (lstat (SDATA (encoded), &s) < 0)
|
||
return Qnil;
|
||
|
||
switch (s.st_mode & S_IFMT)
|
||
{
|
||
default:
|
||
values[0] = Qnil; break;
|
||
case S_IFDIR:
|
||
values[0] = Qt; break;
|
||
#ifdef S_IFLNK
|
||
case S_IFLNK:
|
||
values[0] = Ffile_symlink_p (filename); break;
|
||
#endif
|
||
}
|
||
values[1] = make_number (s.st_nlink);
|
||
|
||
if (!(NILP (id_format) || EQ (id_format, Qinteger)))
|
||
{
|
||
BLOCK_INPUT;
|
||
uname = stat_uname (&s);
|
||
gname = stat_gname (&s);
|
||
UNBLOCK_INPUT;
|
||
}
|
||
if (uname)
|
||
values[2] = DECODE_SYSTEM (build_string (uname));
|
||
else
|
||
values[2] = make_fixnum_or_float (s.st_uid);
|
||
if (gname)
|
||
values[3] = DECODE_SYSTEM (build_string (gname));
|
||
else
|
||
values[3] = make_fixnum_or_float (s.st_gid);
|
||
|
||
values[4] = make_time (s.st_atime);
|
||
values[5] = make_time (s.st_mtime);
|
||
values[6] = make_time (s.st_ctime);
|
||
values[7] = make_fixnum_or_float (s.st_size);
|
||
/* If the size is negative, and its type is long, convert it back to
|
||
positive. */
|
||
if (s.st_size < 0 && sizeof (s.st_size) == sizeof (long))
|
||
values[7] = make_float ((double) ((unsigned long) s.st_size));
|
||
|
||
filemodestring (&s, modes);
|
||
values[8] = make_string (modes, 10);
|
||
#ifdef BSD4_2 /* file gid will be dir gid */
|
||
dirname = Ffile_name_directory (filename);
|
||
if (! NILP (dirname))
|
||
encoded = ENCODE_FILE (dirname);
|
||
if (! NILP (dirname) && stat (SDATA (encoded), &sdir) == 0)
|
||
values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
|
||
else /* if we can't tell, assume worst */
|
||
values[9] = Qt;
|
||
#else /* file gid will be egid */
|
||
values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
|
||
#endif /* not BSD4_2 */
|
||
if (!FIXNUM_OVERFLOW_P (s.st_ino))
|
||
/* Keep the most common cases as integers. */
|
||
values[10] = make_number (s.st_ino);
|
||
else if (!FIXNUM_OVERFLOW_P (s.st_ino >> 16))
|
||
/* To allow inode numbers larger than VALBITS, separate the bottom
|
||
16 bits. */
|
||
values[10] = Fcons (make_number ((EMACS_INT)(s.st_ino >> 16)),
|
||
make_number ((EMACS_INT)(s.st_ino & 0xffff)));
|
||
else
|
||
{
|
||
/* To allow inode numbers beyond 32 bits, separate into 2 24-bit
|
||
high parts and a 16-bit bottom part.
|
||
The code on the next line avoids a compiler warning on
|
||
systems where st_ino is 32 bit wide. (bug#766). */
|
||
EMACS_INT high_ino = s.st_ino >> 31 >> 1;
|
||
EMACS_INT low_ino = s.st_ino & 0xffffffff;
|
||
|
||
values[10] = Fcons (make_number (high_ino >> 8),
|
||
Fcons (make_number (((high_ino & 0xff) << 16)
|
||
+ (low_ino >> 16)),
|
||
make_number (low_ino & 0xffff)));
|
||
}
|
||
|
||
/* Likewise for device. */
|
||
if (FIXNUM_OVERFLOW_P (s.st_dev))
|
||
values[11] = Fcons (make_number (s.st_dev >> 16),
|
||
make_number (s.st_dev & 0xffff));
|
||
else
|
||
values[11] = make_number (s.st_dev);
|
||
|
||
return Flist (sizeof(values) / sizeof(values[0]), values);
|
||
}
|
||
|
||
DEFUN ("file-attributes-lessp", Ffile_attributes_lessp, Sfile_attributes_lessp, 2, 2, 0,
|
||
doc: /* Return t if first arg file attributes list is less than second.
|
||
Comparison is in lexicographic order and case is significant. */)
|
||
(Lisp_Object f1, Lisp_Object f2)
|
||
{
|
||
return Fstring_lessp (Fcar (f1), Fcar (f2));
|
||
}
|
||
|
||
void
|
||
syms_of_dired (void)
|
||
{
|
||
Qdirectory_files = intern_c_string ("directory-files");
|
||
Qdirectory_files_and_attributes = intern_c_string ("directory-files-and-attributes");
|
||
Qfile_name_completion = intern_c_string ("file-name-completion");
|
||
Qfile_name_all_completions = intern_c_string ("file-name-all-completions");
|
||
Qfile_attributes = intern_c_string ("file-attributes");
|
||
Qfile_attributes_lessp = intern_c_string ("file-attributes-lessp");
|
||
Qdefault_directory = intern_c_string ("default-directory");
|
||
|
||
staticpro (&Qdirectory_files);
|
||
staticpro (&Qdirectory_files_and_attributes);
|
||
staticpro (&Qfile_name_completion);
|
||
staticpro (&Qfile_name_all_completions);
|
||
staticpro (&Qfile_attributes);
|
||
staticpro (&Qfile_attributes_lessp);
|
||
staticpro (&Qdefault_directory);
|
||
|
||
defsubr (&Sdirectory_files);
|
||
defsubr (&Sdirectory_files_and_attributes);
|
||
defsubr (&Sfile_name_completion);
|
||
defsubr (&Sfile_name_all_completions);
|
||
defsubr (&Sfile_attributes);
|
||
defsubr (&Sfile_attributes_lessp);
|
||
|
||
DEFVAR_LISP ("completion-ignored-extensions", Vcompletion_ignored_extensions,
|
||
doc: /* Completion ignores file names ending in any string in this list.
|
||
It does not ignore them if all possible completions end in one of
|
||
these strings or when displaying a list of completions.
|
||
It ignores directory names if they match any string in this list which
|
||
ends in a slash. */);
|
||
Vcompletion_ignored_extensions = Qnil;
|
||
}
|
||
|