Merge from mainline.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 17 Mar 2011 16:32:03 +0000 (09:32 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 17 Mar 2011 16:32:03 +0000 (09:32 -0700)
1  2 
src/ChangeLog
src/buffer.c
src/emacs.c
src/keyboard.h
src/lisp.h
src/print.c

diff --combined src/ChangeLog
- 2011-03-16  Paul Eggert  <eggert@cs.ucla.edu>
 +2011-03-17  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * process.c (make_serial_process_unwind, send_process_trap):
 +      (sigchld_handler): Now static.
 +
 +      * process.c (allocate_pty): Let PTY_ITERATION declare iteration vars.
 +      That way, the code declares only the vars that it needs.
 +      * s/aix4-2.h (PTY_ITERATION): Declare iteration vars.
 +      * s/cygwin.h (PTY_ITERATION): Likewise.
 +      * s/darwin.h (PTY_ITERATION): Likewise.
 +      * s/gnu-linux.h (PTY_ITERATION): Likewise.
 +
 +      * s/irix6-5.h (PTY_OPEN): Declare stb, to loosen coupling.
 +      * process.c (allocate_pty): Don't declare stb unless it's needed.
 +
 +      * bytecode.c (MAYBE_GC): Rewrite so as not to use empty "else".
 +      (CONSTANTLIM): Remove; unused.
 +      (METER_CODE, Bscan_buffer, Bread_char, Bset_mark):
 +      Define only if needed.
 +
 +      * unexelf.c (unexec): Name an expression,
 +      to avoid gcc -Wbad-function-cast warning.
 +      Use a different way to cause a compilation error if anyone uses
 +      n rather than nn, a way that does not involve shadowing.
 +      (ELF_BSS_SECTION_NAME, OLD_PROGRAM_H): Remove; unused.
 +
 +      * deps.mk (unexalpha.o): Remove; unused.
 +
- 2011-03-15  Paul Eggert  <eggert@cs.ucla.edu>
 +      New file unexec.h, the (simple) interface for unexec (Bug#8267).
 +      * unexec.h: New file.
 +      * deps.mk (emacs.o, unexaix.o, unexcw.o, unexcoff.o, unexelf.o):
 +      (unexhp9k800.o, unexmacosx.o, unexsol.o, unexw32.o):
 +      Depend on unexec.h.
 +      * emacs.c [!defined CANNOT_DUMP]: Include unexec.h.
 +      * unexaix.c, unexcoff.c, unexcw.c, unexelf.c, unexhp9k800.c:
 +      * unexmacosx.c, unexsol.c, unexw32.c: Include unexec.h.
 +
 +      * syntax.c (Fforward_comment, scan_lists): Rename locals to avoid
 +      shadowing.
 +      (back_comment, skip_chars): Mark vars as initialized.
 +
 +      * character.h (FETCH_STRING_CHAR_ADVANCE_NO_CHECK, BUF_INC_POS):
 +      Rename locals to avoid shadowing.
 +
 +      * lread.c (read1): Rewrite so as not to use empty "else".
 +      (Fload, readevalloop, read1): Rename locals to avoid shadowing.
 +
 +      * print.c (Fredirect_debugging_output): Fix pointer signedess.
 +
 +      * lisp.h (debug_output_compilation_hack): Add decl here, to avoid
 +      warning when compiling print.c.
 +
 +      * font.c (font_unparse_fcname): Abort in an "impossible" situation
 +      instead of using an uninitialized var.
 +      (font_sort_entities): Mark var as initialized.
 +
 +      * character.h (FETCH_CHAR_ADVANCE): Rename locals to avoid shadowing.
 +
 +      * font.c (font_unparse_xlfd): Don't mix pointers to variables with
 +      pointers to constants.
 +      (font_parse_fcname): Remove unused vars.
 +      (font_delete_unmatched): Now static.
 +      (font_get_spec): Remove; unused.
 +      (font_style_to_value, font_prop_validate_style, font_unparse_fcname):
 +      (font_update_drivers, Ffont_get_glyphs, font_add_log):
 +      Rename or move locals to avoid shadowing.
 +
 +      * fns.c (require_nesting_list, require_unwind): Now static.
 +      (Ffillarray): Rename locals to avoid shadowing.
 +
 +      * floatfns.c (domain_error2): Define only if needed.
 +      (Ffrexp, Fldexp): Rename locals to avoid shadowing.
 +
 +      * alloc.c (mark_backtrace): Move decl from here ...
 +      * lisp.h: ... to here, so that it can be checked.
 +
 +      * eval.c (call_debugger, do_debug_on_call, grow_specpdl): Now static.
 +      (Fdefvar): Rewrite so as not to use empty "else".
 +      (lisp_indirect_variable): Name an expression,
 +      to avoid gcc -Wbad-function-cast warning.
 +      (Fdefvar): Rename locals to avoid shadowing.
 +
 +      * callint.c (quotify_arg, quotify_args): Now static.
 +      (Fcall_interactively): Rename locals to avoid shadowing.
 +      Use const pointer when appropriate.
 +
 +      * lisp.h (get_system_name, get_operating_system_release):
 +      Move decls here, to check interfaces.
 +      * process.c (get_operating_system_release): Move decl to lisp.h.
 +      * xrdb.c (get_system_name): Likewise.
 +      * editfns.c (init_editfns, Fuser_login_name, Fuser_uid):
 +      (Fuser_real_uid, Fuser_full_name): Remove unnecessary casts,
 +      some of which prompt warnings from gcc -Wbad-function-cast.
 +      (Fformat_time_string, Fencode_time, Finsert_char):
 +      (Ftranslate_region_internal, Fformat):
 +      Rename or remove local vars to avoid shadowing.
 +      (Ftranslate_region_internal): Mark var as initialized.
 +
- 2011-03-14  Paul Eggert  <eggert@cs.ucla.edu>
-       * buffer.c (switch_to_buffer_1): Now static.
 +      * doc.c (Fdocumentation, Fsnarf_documentation): Move locals to
 +      avoid shadowing.
 +
 +      * lisp.h (eassert): Check that the argument compiles, even if
 +      ENABLE_CHECKING is not defined.
 +
 +      * data.c (Findirect_variable): Name an expression, to avoid
 +      gcc -Wbad-function-cast warning.
 +      (default_value, arithcompare, arith_driver, arith_error): Now static.
 +      (store_symval_forwarding): Rename local to avoid shadowing.
 +      (Fmake_variable_buffer_local, Fmake_local_variable): Mark
 +      variables as initialized.
 +      (do_blv_forwarding, do_symval_forwarding): Remove; unused.
 +
 +      * alloc.c (check_cons_list): Do not define unless GC_CHECK_CONS_LIST.
 +      (Fmake_vector, Fvector, Fmake_byte_code, Fgarbage_collect):
 +      Rename locals to avoid shadowing.
 +      (mark_stack): Move local variables into the #ifdef region where
 +      they're used.
 +      (BLOCK_INPUT_ALLOC, UNBLOCK_INPUT_ALLOC): Define only if
 +      ! defined SYSTEM_MALLOC && ! defined SYNC_INPUT, as they are not
 +      needed otherwise.
 +      (CHECK_ALLOCATED): Define only if GC_CHECK_MARKED_OBJECTS.
 +      (GC_STRING_CHARS): Remove; not used.
 +      (Fmemory_limit): Cast sbrk's returned value to char *.
 +
 +      * lisp.h (check_cons_list): Declare if GC_CHECK_CONS_LIST; this
 +      avoids undefined behavior in theory.
 +
 +      * regex.c (IF_LINT): Add defn, for benefit of ../lib-src.
 +
 +      Use functions, not macros, for up- and down-casing (Bug#8254).
 +      * buffer.h (DOWNCASE_TABLE, UPCASE_TABLE, DOWNCASE, UPPERCASEP):
 +      (NOCASEP, LOWERCASEP, UPCASE, UPCASE1): Remove.  All callers changed
 +      to use the following functions instead of these macros.
 +      (downcase): Adjust to lack of DOWNCASE_TABLE.  Return int, not
 +      EMACS_INT, since callers assume the returned value fits in int.
 +      (upcase1): Likewise, for UPCASE_TABLE.
 +      (uppercasep, lowercasep, upcase): New static inline functions.
 +      * editfns.c (Fchar_equal): Remove no-longer-needed workaround for
 +      the race-condition problem in the old DOWNCASE.
 +
 +      * regex.c (CHARSET_LOOKUP_RANGE_TABLE_RAW, POP_FAILURE_REG_OR_COUNT):
 +      Rename locals to avoid shadowing.
 +      (regex_compile, re_match_2_internal): Move locals to avoid shadowing.
 +      (regex_compile, re_search_2, re_match_2_internal):
 +      Remove unused local vars.
 +      (FREE_VAR): Rewrite so as not to use empty "else",
 +      which gcc can warn about.
 +      (regex_compile, re_match_2_internal): Mark locals as initialized.
 +      (RETALLOC_IF): Define only if needed.
 +      (WORDCHAR_P): Likewise.  This one is never needed, but is used
 +      only in a comment talking about a compiler bug, so put inside
 +      the #if 0 of that comment.
 +      (CHARSET_LOOKUP_BITMAP, FAIL_STACK_FULL, RESET_FAIL_STACK):
 +      (PUSH_FAILURE_ELT, BUF_PUSH_3, STOP_ADDR_VSTRING):
 +      Remove; unused.
 +
 +      * search.c (boyer_moore): Rename locals to avoid shadowing.
 +      * character.h (FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE):
 +      (PREV_CHAR_BOUNDARY): Likewise.
 +
 +      * search.c (simple_search): Remove unused var.
 +
 +      * dired.c (compile_pattern): Move decl from here ...
 +      * lisp.h: ... to here, so that it can be checked.
 +      (struct re_registers): New forward decl.
 +
 +      * character.h (INC_POS, DEC_POS): Rename locals to avoid shadowing.
 +
 +      * indent.c (MULTIBYTE_BYTES_WIDTH): New args bytes, width.
 +      All uses changed.
 +      (MULTIBYTE_BYTES_WIDTH, scan_for_column, compute_motion):
 +      Rename locals to avoid shadowing.
 +      (Fvertical_motion): Mark locals as initialized.
 +
 +      * casefiddle.c (casify_object, casify_region): Now static.
 +      (casify_region): Mark local as initialized.
 +
 +      * cmds.c (internal_self_insert): Rename local to avoid shadowing.
 +
 +      * lisp.h (GCPRO2_VAR, GCPRO3_VAR, GCPRO4_VAR, GCPRO5_VAR, GCPRO6_VAR):
 +      New macros, so that the caller can use some names other than
 +      gcpro1, gcpro2, etc.
 +      (GCPRO2, GCPRO3, GCPRO4, GCPRO5, GCPRO6): Reimplement in terms
 +      of the new macros.
 +      (GCPRO1_VAR, UNGCPRO_VAR): Change the meaning of the second
 +      argument, for consistency with GCPRO2_VAR, etc: it is now the
 +      prefix of the variable, not the variable itself.  All uses
 +      changed.
 +      * dired.c (directory_files_internal, file_name_completion):
 +      Rename locals to avoid shadowing.
 +
 +      Fix a race condition diagnosed by gcc -Wsequence-point (Bug#8254).
 +      An expression of the form (DOWNCASE (x) == DOWNCASE (y)), found in
 +      dired.c's scmp function, had undefined behavior.
 +      * lisp.h (DOWNCASE_TABLE, UPCASE_TABLE, DOWNCASE, UPPERCASEP):
 +      (NOCASEP, LOWERCASEP, UPCASE, UPCASE1): Move from here ...
 +      * buffer.h: ... to here, because these macros use current_buffer,
 +      and the new implementation with inline functions needs to have
 +      current_buffer in scope now, rather than later when the macros
 +      are used.
 +      (downcase, upcase1): New static inline functions.
 +      (DOWNCASE, UPCASE1): Reimplement using these functions.
 +      This avoids undefined behavior in expressions like
 +      DOWNCASE (x) == DOWNCASE (y), which previously suffered
 +      from race conditions in accessing the global variables
 +      case_temp1 and case_temp2.
 +      * casetab.c (case_temp1, case_temp2): Remove; no longer needed.
 +      * lisp.h (case_temp1, case_temp2): Remove their decls.
 +      * character.h (ASCII_CHAR_P): Move from here ...
 +      * lisp.h: ... to here, so that the inline functions mentioned
 +      above can use them.
 +
 +      * dired.c (directory_files_internal_unwind): Now static.
 +
 +      * fileio.c (file_name_as_directory, directory_file_name):
 +      (barf_or_query_if_file_exists, auto_save_error, auto_save_1):
 +      Now static.
 +      (file_name_as_directory): Use const pointers when appropriate.
 +      (Fexpand_file_name): Likewise.  In particular, newdir might
 +      point at constant storage, so make it a const pointer.
 +      (Fmake_directory_internal, Fread_file_name): Remove unused vars.
 +      (Ffile_selinux_context, Fset_file_selinux_context): Fix pointer
 +      signedness issues.
 +      (Fset_file_times, Finsert_file_contents, auto_save_error):
 +      Rename locals to avoid shadowing.
 +
 +      * minibuf.c (choose_minibuf_frame_1): Now static.
 +      (Ftry_completion, Fall_completions): Rename or remove locals
 +      to avoid shadowing.
 +
 +      * marker.c (bytepos_to_charpos): Remove; unused.
 +
 +      * lisp.h (verify_bytepos, count_markers): New decls,
 +      so that gcc does not warn that these functions aren't declared.
 +
 +      * insdel.c (check_markers, make_gap_larger, make_gap_smaller):
 +      (reset_var_on_error, Fcombine_after_change_execute_1): Now static.
 +      (CHECK_MARKERS): Redo to avoid gcc -Wempty-body diagnostic.
 +      (copy_text): Remove unused local var.
 +
 +      * filelock.c (within_one_second): Now static.
 +      (lock_file_1): Rename local to avoid shadowing.
 +
 +      * buffer.c (fix_overlays_before): Mark locals as initialized.
 +      (fix_start_end_in_overlays): Likewise.  This function should be
 +      simplified by using pointers-to-pointers, but that's a different
 +      matter.
++      (switch_to_buffer_1): Now static.
 +      (Fkill_buffer, record_buffer, Fbury_buffer, Fset_buffer_multibyte):
 +      (report_overlay_modification): Rename locals to avoid shadowing.
 +
 +      * sysdep.c (system_process_attributes): Rename vars to avoid shadowing.
 +      Fix pointer signedness issue.
 +      (sys_subshell): Mark local as volatile if checking for lint,
 +      to suppress a gcc -Wclobbered warning that does not seem to be right.
 +      (MAXPATHLEN): Define only if needed.
 +
 +      * process.c (serial_open, serial_configure): Move decls from here ...
 +      * systty.h: ... to here, so that they can be checked.
 +
 +      * fns.c (get_random, seed_random): Move extern decls from here ...
 +      * lisp.h: ... to here, so that they can be checked.
 +
 +      * sysdep.c (reset_io): Now static.
 +      (wait_for_termination_signal): Remove; unused.
 +
 +      * keymap.c (keymap_parent, keymap_memberp, map_keymap_internal):
 +      (copy_keymap_item, append_key, push_text_char_description):
 +      Now static.
 +      (Fwhere_is_internal): Don't test CONSP (sequences) unnecessarily.
 +      (DENSE_TABLE_SIZE): Remove; unused.
 +      (get_keymap, access_keymap, Fdefine_key, Fwhere_is_internal):
 +      (describe_map_tree):
 +      Rename locals to avoid shadowing.
 +
 +      * keyboard.c: Declare functions static if they are not used elsewhere.
 +      (echo_char, echo_dash, cmd_error, top_level_2):
 +      (poll_for_input, handle_async_input): Now static.
 +      (read_char, kbd_buffer_get_event, make_lispy_position):
 +      (make_lispy_event, make_lispy_movement, apply_modifiers):
 +      (decode_keyboard_code, tty_read_avail_input, menu_bar_items):
 +      (parse_tool_bar_item, read_key_sequence, Fread_key_sequence):
 +      (Fread_key_sequence_vector): Rename locals to avoid shadowing.
 +      (read_key_sequence, read_char): Mark locals as initialized.
 +      (Fexit_recursive_edit, Fabort_recursive_edit): Mark with NO_RETURN.
 +
 +      * keyboard.h (make_ctrl_char): New decl.
 +      (mark_kboards): Move decl here ...
 +      * alloc.c (mark_kboards): ... from here.
 +
 +      * lisp.h (force_auto_save_soon): New decl.
 +
 +      * emacs.c (init_cmdargs): Rename local to avoid shadowing.
 +      (DEFINE_DUMMY_FUNCTION): New macro.
 +      (__do_global_ctors, __do_global_ctors_aux, __do_global_dtors, __main):
 +      Use it.
 +      (main): Add casts to avoid warnings
 +      if GCC considers string literals to be constants.
 +
 +      * lisp.h (fatal_error_signal): Add decl, since it's exported.
 +
 +      * dbusbind.c: Pointer signedness fixes.
 +      (xd_signature, xd_append_arg, xd_initialize):
 +      (Fdbus_call_method, Fdbus_call_method_asynchronously):
 +      (Fdbus_method_return_internal, Fdbus_method_error_internal):
 +      (Fdbus_send_signal, xd_read_message_1, Fdbus_register_service):
 +      (Fdbus_register_signal): Use SSDATA when the context wants char *.
 +
 +      * dbusbind.c (Fdbus_init_bus): Add cast to avoid warning
 +      if GCC considers string literals to be constants.
 +      (Fdbus_register_service, Fdbus_register_method): Remove unused vars.
 +
+ 2011-03-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+       * print.c (PRINT_CIRCLE_CANDIDATE_P): New macro.
+       (print_preprocess, print_object): New macro to fix last change.
+       * print.c (print_preprocess): Don't forget font objects.
+ 2011-03-16  Juanma Barranquero  <lekktu@gmail.com>
+       * emacs.c (USAGE3): Doc fixes.
+ 2011-03-15  Andreas Schwab  <schwab@linux-m68k.org>
+       * coding.c (detect_coding_iso_2022): Reorganize code to clarify
+       structure.
+ 2011-03-14  Juanma Barranquero  <lekktu@gmail.com>
+       * lisp.h (VWindow_system, Qfile_name_history):
+       * keyboard.h (lispy_function_keys) [WINDOWSNT]:
+       * w32term.h (w32_system_caret_hwnd, w32_system_caret_height)
+       (w32_system_caret_x, w32_system_caret_y): Declare extern.
+       * w32select.c: Don't #include "keyboard.h".
+       (run_protected): Add extern declaration for waiting_for_input.
+       * w32.c (Qlocal, noninteractive1, inhibit_window_system):
+       * w32console.c (detect_input_pending, read_input_pending)
+       (encode_terminal_code):
+       * w32fns.c (quit_char, lispy_function_keys, Qtooltip)
+       (w32_system_caret_hwnd, w32_system_caret_height, w32_system_caret_x)
+       (w32_system_caret_y, Qfile_name_history):
+       * w32font.c (w32font_driver, QCantialias, QCotf, QClang):
+       * w32inevt.c (reinvoke_input_signal, lispy_function_keys):
+       * w32menu.c (Qmenu_bar, QCtoggle, QCradio, Qoverriding_local_map)
+       (Qoverriding_terminal_local_map, Qmenu_bar_update_hook):
+       * w32proc.c (Qlocal, report_file_error):
+       * w32term.c (Vwindow_system, updating_frame):
+       * w32uniscribe.c (initialized, uniscribe_font_driver):
+       Remove unneeded extern declarations.
+ 2011-03-14  Chong Yidong  <cyd@stupidchicken.com>
+       * buffer.c (Fmake_indirect_buffer): Fix incorrect assertions.
  2011-03-13  Chong Yidong  <cyd@stupidchicken.com>
  
        * buffer.h (BUF_BEGV, BUF_BEGV_BYTE, BUF_ZV, BUF_ZV_BYTE, BUF_PT)
  
  2011-03-12  Eli Zaretskii  <eliz@gnu.org>
  
-       * termcap.c [MSDOS]: Include "msdos.h.
+       * termcap.c [MSDOS]: Include "msdos.h".
        (find_capability, tgetnum, tgetflag, tgetstr, tputs, tgetent):
        Constify `char *' arguments and their references according to
        prototypes in tparam.h.
diff --combined src/buffer.c
@@@ -611,8 -611,8 +611,8 @@@ CLONE nil means the indirect buffer's s
    /* Make sure the base buffer has markers for its narrowing.  */
    if (NILP (BVAR (b->base_buffer, pt_marker)))
      {
-       eassert (NILP (BVAR (b, begv_marker)));
-       eassert (NILP (BVAR (b, zv_marker)));
+       eassert (NILP (BVAR (b->base_buffer, begv_marker)));
+       eassert (NILP (BVAR (b->base_buffer, zv_marker)));
  
        BVAR (b->base_buffer, pt_marker) = Fmake_marker ();
        set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer,
@@@ -1464,9 -1464,9 +1464,9 @@@ with SIGHUP.  */
           don't re-kill them.  */
        if (other->base_buffer == b && !NILP (BVAR (other, name)))
          {
 -          Lisp_Object buffer;
 -          XSETBUFFER (buffer, other);
 -          Fkill_buffer (buffer);
 +          Lisp_Object buf;
 +          XSETBUFFER (buf, other);
 +          Fkill_buffer (buf);
          }
  
        UNGCPRO;
        && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
        && NILP (Fsymbol_value (intern ("auto-save-visited-file-name"))))
      {
 -      Lisp_Object tem;
 -      tem = Fsymbol_value (intern ("delete-auto-save-files"));
 -      if (! NILP (tem))
 +      Lisp_Object delete;
 +      delete = Fsymbol_value (intern ("delete-auto-save-files"));
 +      if (! NILP (delete))
        internal_delete_file (BVAR (b, auto_save_file_name));
      }
  
  void
  record_buffer (Lisp_Object buf)
  {
 -  register Lisp_Object link, prev;
 +  register Lisp_Object list, prev;
    Lisp_Object frame;
    frame = selected_frame;
  
    prev = Qnil;
 -  for (link = Vbuffer_alist; CONSP (link); link = XCDR (link))
 +  for (list = Vbuffer_alist; CONSP (list); list = XCDR (list))
      {
 -      if (EQ (XCDR (XCAR (link)), buf))
 +      if (EQ (XCDR (XCAR (list)), buf))
        break;
 -      prev = link;
 +      prev = list;
      }
  
 -  /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
 +  /* Effectively do Vbuffer_alist = Fdelq (list, Vbuffer_alist);
       we cannot use Fdelq itself here because it allows quitting.  */
  
    if (NILP (prev))
    else
      XSETCDR (prev, XCDR (XCDR (prev)));
  
 -  XSETCDR (link, Vbuffer_alist);
 -  Vbuffer_alist = link;
 +  XSETCDR (list, Vbuffer_alist);
 +  Vbuffer_alist = list;
  
    /* Effectively do a delq on buried_buffer_list.  */
  
    prev = Qnil;
 -  for (link = XFRAME (frame)->buried_buffer_list; CONSP (link);
 -       link = XCDR (link))
 +  for (list = XFRAME (frame)->buried_buffer_list; CONSP (list);
 +       list = XCDR (list))
      {
 -      if (EQ (XCAR (link), buf))
 +      if (EQ (XCAR (list), buf))
          {
            if (NILP (prev))
 -            XFRAME (frame)->buried_buffer_list = XCDR (link);
 +            XFRAME (frame)->buried_buffer_list = XCDR (list);
            else
              XSETCDR (prev, XCDR (XCDR (prev)));
            break;
          }
 -      prev = link;
 +      prev = list;
      }
  
    /* Now move this buffer to the front of frame_buffer_list also.  */
  
    prev = Qnil;
 -  for (link = frame_buffer_list (frame); CONSP (link);
 -       link = XCDR (link))
 +  for (list = frame_buffer_list (frame); CONSP (list);
 +       list = XCDR (list))
      {
 -      if (EQ (XCAR (link), buf))
 +      if (EQ (XCAR (list), buf))
        break;
 -      prev = link;
 +      prev = list;
      }
  
    /* Effectively do delq.  */
  
 -  if (CONSP (link))
 +  if (CONSP (list))
      {
        if (NILP (prev))
        set_frame_buffer_list (frame,
        else
        XSETCDR (prev, XCDR (XCDR (prev)));
  
 -      XSETCDR (link, frame_buffer_list (frame));
 -      set_frame_buffer_list (frame, link);
 +      XSETCDR (list, frame_buffer_list (frame));
 +      set_frame_buffer_list (frame, list);
      }
    else
      set_frame_buffer_list (frame, Fcons (buf, frame_buffer_list (frame)));
@@@ -1712,7 -1712,7 +1712,7 @@@ the current buffer's major mode.  */
  /* Switch to buffer BUFFER in the selected window.
     If NORECORD is non-nil, don't call record_buffer.  */
  
 -Lisp_Object
 +static Lisp_Object
  switch_to_buffer_1 (Lisp_Object buffer_or_name, Lisp_Object norecord)
  {
    register Lisp_Object buffer;
@@@ -1984,13 -1984,13 +1984,13 @@@ its frame, iconify that frame.  */
       buffer is killed.  */
    if (!NILP (BVAR (XBUFFER (buffer), name)))
      {
 -      Lisp_Object aelt, link;
 +      Lisp_Object aelt, list;
  
        aelt = Frassq (buffer, Vbuffer_alist);
 -      link = Fmemq (aelt, Vbuffer_alist);
 +      list = Fmemq (aelt, Vbuffer_alist);
        Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
 -      XSETCDR (link, Qnil);
 -      Vbuffer_alist = nconc2 (Vbuffer_alist, link);
 +      XSETCDR (list, Qnil);
 +      Vbuffer_alist = nconc2 (Vbuffer_alist, list);
  
        XFRAME (selected_frame)->buffer_list
          = Fdelq (buffer, XFRAME (selected_frame)->buffer_list);
@@@ -2335,12 -2335,12 +2335,12 @@@ current buffer is cleared.  */
          && GPT_BYTE > 1 && GPT_BYTE < Z_BYTE
          && ! CHAR_HEAD_P (*(GAP_END_ADDR)))
        {
 -        unsigned char *p = GPT_ADDR - 1;
 +        unsigned char *q = GPT_ADDR - 1;
  
 -        while (! CHAR_HEAD_P (*p) && p > BEG_ADDR) p--;
 -        if (LEADING_CODE_P (*p))
 +        while (! CHAR_HEAD_P (*q) && q > BEG_ADDR) q--;
 +        if (LEADING_CODE_P (*q))
            {
 -            EMACS_INT new_gpt = GPT_BYTE - (GPT_ADDR - p);
 +            EMACS_INT new_gpt = GPT_BYTE - (GPT_ADDR - q);
  
              move_gap_both (new_gpt, new_gpt);
            }
        ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG;
  
        {
 -      EMACS_INT pt_byte = advance_to_char_boundary (PT_BYTE);
 -      EMACS_INT pt;
 +      EMACS_INT byte = advance_to_char_boundary (PT_BYTE);
 +      EMACS_INT position;
  
 -      if (pt_byte > GPT_BYTE)
 -        pt = chars_in_text (GAP_END_ADDR, pt_byte - GPT_BYTE) + GPT;
 +      if (byte > GPT_BYTE)
 +        position = chars_in_text (GAP_END_ADDR, byte - GPT_BYTE) + GPT;
        else
 -        pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG;
 -      TEMP_SET_PT_BOTH (pt, pt_byte);
 +        position = chars_in_text (BEG_ADDR, byte - BEG_BYTE) + BEG;
 +      TEMP_SET_PT_BOTH (position, byte);
        }
  
        tail = markers = BUF_MARKERS (current_buffer);
@@@ -3398,8 -3398,7 +3398,8 @@@ voi
  fix_start_end_in_overlays (register EMACS_INT start, register EMACS_INT end)
  {
    Lisp_Object overlay;
 -  struct Lisp_Overlay *before_list, *after_list;
 +  struct Lisp_Overlay *before_list IF_LINT (= NULL);
 +  struct Lisp_Overlay *after_list IF_LINT (= NULL);
    /* These are either nil, indicating that before_list or after_list
       should be assigned, or the cons cell the cdr of which should be
       assigned.  */
@@@ -3547,7 -3546,7 +3547,7 @@@ fix_overlays_before (struct buffer *bp
    /* If parent is nil, replace overlays_before; otherwise, parent->next.  */
    struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair;
    Lisp_Object tem;
 -  EMACS_INT end;
 +  EMACS_INT end IF_LINT (= 0);
  
    /* After the insertion, the several overlays may be in incorrect
       order.  The possibility is that, in the list `overlays_before',
@@@ -4323,10 -4322,10 +4323,10 @@@ report_overlay_modification (Lisp_Objec
  
      for (i = 0; i < size;)
        {
 -      Lisp_Object prop, overlay;
 -      prop = copy[i++];
 -      overlay = copy[i++];
 -      call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3);
 +      Lisp_Object prop_i, overlay_i;
 +      prop_i = copy[i++];
 +      overlay_i = copy[i++];
 +      call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
        }
    }
    UNGCPRO;
diff --combined src/emacs.c
@@@ -141,7 -141,7 +141,7 @@@ Lisp_Object Qfile_name_handler_alist
  
  Lisp_Object Qrisky_local_variable;
  
- /* If non-zero, emacs should not attempt to use a window-specific code,
+ /* If non-zero, Emacs should not attempt to use a window-specific code,
     but instead should use the virtual terminal under which it was started.  */
  int inhibit_window_system;
  
@@@ -169,7 -169,6 +169,6 @@@ static unsigned long heap_bss_diff
  #define MAX_HEAP_BSS_DIFF (1024*1024)
  
  /* Nonzero means running Emacs without interactive terminal.  */
  int noninteractive;
  
  /* Nonzero means remove site-lisp directories from load-path.  */
@@@ -249,14 -248,14 +248,14 @@@ Display options:\n
  --border-color, -bd COLOR       main border color\n\
  --border-width, -bw WIDTH       width of main border\n\
  --color, --color=MODE           override color mode for character terminals;\n\
-                                   MODE defaults to `auto', and can also\n\
-                                   be `never', `auto', `always',\n\
+                                   MODE defaults to `auto', and\n\
+                                   can also be `never', `always',\n\
                                    or a mode name like `ansi8'\n\
  --cursor-color, -cr COLOR       color of the Emacs cursor indicating point\n\
  --font, -fn FONT                default font; must be fixed-width\n\
  --foreground-color, -fg COLOR   window foreground color\n\
  --fullheight, -fh               make the first frame high as the screen\n\
- --fullscreen, -fs               make first frame fullscreen\n\
+ --fullscreen, -fs               make the first frame fullscreen\n\
  --fullwidth, -fw                make the first frame wide as the screen\n\
  --maximized, -mm                make the first frame maximized\n\
  --geometry, -g GEOMETRY         window geometry\n\
@@@ -382,7 -381,7 +381,7 @@@ static voi
  init_cmdargs (int argc, char **argv, int skip_args)
  {
    register int i;
 -  Lisp_Object name, dir, tem;
 +  Lisp_Object name, dir, handler;
    int count = SPECPDL_INDEX ();
    Lisp_Object raw_name;
  
  
    /* Add /: to the front of the name
       if it would otherwise be treated as magic.  */
 -  tem = Ffind_file_name_handler (raw_name, Qt);
 -  if (! NILP (tem))
 +  handler = Ffind_file_name_handler (raw_name, Qt);
 +  if (! NILP (handler))
      raw_name = concat2 (build_string ("/:"), raw_name);
  
    Vinvocation_name = Ffile_name_nondirectory (raw_name);
        {
          /* Add /: to the front of the name
             if it would otherwise be treated as magic.  */
 -        tem = Ffind_file_name_handler (found, Qt);
 -        if (! NILP (tem))
 +        handler = Ffind_file_name_handler (found, Qt);
 +        if (! NILP (handler))
            found = concat2 (build_string ("/:"), found);
          Vinvocation_directory = Ffile_name_directory (found);
        }
@@@ -547,22 -546,21 +546,22 @@@ static char dump_tz[] = "UtC0"
     Provide dummy definitions to avoid error.
     (We don't have any real constructors or destructors.)  */
  #ifdef __GNUC__
 +
 +/* Define a dummy function F.  Declare F too, to pacify gcc
 +   -Wmissing-prototypes.  */
 +#define DEFINE_DUMMY_FUNCTION(f) void f (void); void f (void) {}
 +
  #ifndef GCC_CTORS_IN_LIBC
 -void __do_global_ctors (void)
 -{}
 -void __do_global_ctors_aux (void)
 -{}
 -void __do_global_dtors (void)
 -{}
 +DEFINE_DUMMY_FUNCTION (__do_global_ctors)
 +DEFINE_DUMMY_FUNCTION (__do_global_ctors_aux)
 +DEFINE_DUMMY_FUNCTION (__do_global_dtors)
  /* GNU/Linux has a bug in its library; avoid an error.  */
  #ifndef GNU_LINUX
  char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
  #endif
  char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
  #endif /* GCC_CTORS_IN_LIBC */
 -void __main (void)
 -{}
 +DEFINE_DUMMY_FUNCTION (__main)
  #endif /* __GNUC__ */
  #endif /* ORDINARY_LINK */
  
     enough information to do it right.  */
  
  static int
- argmatch (char **argv, int argc, const char *sstr, const char *lstr, int minlen, char **valptr, int *skipptr)
+ argmatch (char **argv, int argc, const char *sstr, const char *lstr,
+           int minlen, char **valptr, int *skipptr)
  {
    char *p = NULL;
    int arglen;
@@@ -949,7 -948,7 +949,7 @@@ main (int argc, char **argv
        /* Convert --script to -scriptload, un-skip it, and sort again
         so that it will be handled in proper sequence.  */
        /* FIXME broken for --script=FILE - is that supposed to work?  */
 -      argv[skip_args - 1] = "-scriptload";
 +      argv[skip_args - 1] = (char *) "-scriptload";
        skip_args -= 2;
        sort_args (argc, argv);
      }
  
        for (j = 0; j < count_before + 1; j++)
          new[j] = argv[j];
 -      new[count_before + 1] = "-d";
 +      new[count_before + 1] = (char *) "-d";
        new[count_before + 2] = displayname;
        for (j = count_before + 2; j <argc; j++)
          new[j + 1] = argv[j];
      /* Change --display to -d, when its arg is separate.  */
      else if (displayname != 0 && skip_args > count_before
             && argv[count_before + 1][1] == '-')
 -      argv[count_before + 1] = "-d";
 +      argv[count_before + 1] = (char *) "-d";
  
      if (! no_site_lisp)
        {
@@@ -2085,7 -2084,9 +2085,7 @@@ shut_down_emacs (int sig, int no_x, Lis
  \f
  #ifndef CANNOT_DUMP
  
 -/* FIXME: maybe this should go into header file, config.h seems the
 -   only one appropriate. */
 -extern int unexec (const char *, const char *);
 +#include "unexec.h"
  
  DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
         doc: /* Dump current state of Emacs into executable file FILENAME.
@@@ -2379,7 -2380,7 +2379,7 @@@ Special values
  Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
  hpux, irix, usg-unix-v) indicates some sort of Unix system.  */);
    Vsystem_type = intern_c_string (SYSTEM_TYPE);
 -  /* Above values are from SYSTEM_TYPE in src/s/*.h.  */
 +  /* The above values are from SYSTEM_TYPE in include files under src/s.  */
  
    DEFVAR_LISP ("system-configuration", Vsystem_configuration,
               doc: /* Value is string indicating configuration Emacs was built for.
diff --combined src/keyboard.h
@@@ -494,7 -494,6 +494,7 @@@ extern int input_polling_used (void)
  extern void clear_input_pending (void);
  extern int requeued_events_pending_p (void);
  extern void bind_polling_period (int);
 +extern int make_ctrl_char (int);
  extern void stuff_buffered_input (Lisp_Object);
  extern void clear_waiting_for_input (void);
  extern void swallow_events (int);
@@@ -518,4 -517,7 +518,8 @@@ extern void add_user_signal (int, cons
  extern int tty_read_avail_input (struct terminal *, int,
                                   struct input_event *);
  extern EMACS_TIME timer_check (int);
 +extern void mark_kboards (void);
+ #ifdef WINDOWSNT
+ extern const char *const lispy_function_keys[];
+ #endif
diff --combined src/lisp.h
@@@ -27,10 -27,9 +27,10 @@@ along with GNU Emacs.  If not, see <htt
     types of run time checks for Lisp objects.  */
  
  #ifdef GC_CHECK_CONS_LIST
 -#define CHECK_CONS_LIST() check_cons_list()
 +extern void check_cons_list (void);
 +#define CHECK_CONS_LIST() check_cons_list ()
  #else
 -#define CHECK_CONS_LIST() ((void)0)
 +#define CHECK_CONS_LIST() ((void) 0)
  #endif
  
  /* These are default choices for the types to use.  */
@@@ -86,7 -85,7 +86,7 @@@ extern void die (const char *, const ch
  /* Define an Emacs version of "assert", since some system ones are
     flaky.  */
  #ifndef ENABLE_CHECKING
 -#define eassert(X)    (void) 0
 +#define eassert(X) ((void) (0 && (X))) /* Check that X compiles.  */
  #else /* ENABLE_CHECKING */
  #if defined (__GNUC__) && __GNUC__ >= 2 && defined (__STDC__)
  #define eassert(cond) CHECK(cond,"assertion failed: " #cond)
@@@ -842,9 -841,6 +842,9 @@@ struct Lisp_Vecto
  
  #endif        /* not __GNUC__ */
  
 +/* Nonzero iff C is an ASCII character.  */
 +#define ASCII_CHAR_P(c) ((unsigned) (c) < 0x80)
 +
  /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
     characters.  Do not check validity of CT.  */
  #define CHAR_TABLE_REF(CT, IDX)                                       \
@@@ -2045,6 -2041,50 +2045,6 @@@ extern int pending_signals
  
  #define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
  \f
 -/* Variables used locally in the following case handling macros.  */
 -extern int case_temp1;
 -extern Lisp_Object case_temp2;
 -
 -/* Current buffer's map from characters to lower-case characters.  */
 -
 -#define DOWNCASE_TABLE BVAR (current_buffer, downcase_table)
 -
 -/* Current buffer's map from characters to upper-case characters.  */
 -
 -#define UPCASE_TABLE BVAR (current_buffer, upcase_table)
 -
 -/* Downcase a character, or make no change if that cannot be done.  */
 -
 -#define DOWNCASE(CH)                                          \
 -  ((case_temp1 = (CH),                                                \
 -    case_temp2 = CHAR_TABLE_REF (DOWNCASE_TABLE, case_temp1), \
 -    NATNUMP (case_temp2))                                     \
 -   ? XFASTINT (case_temp2) : case_temp1)
 -
 -/* 1 if CH is upper case.  */
 -
 -#define UPPERCASEP(CH) (DOWNCASE (CH) != (CH))
 -
 -/* 1 if CH is neither upper nor lower case.  */
 -
 -#define NOCASEP(CH) (UPCASE1 (CH) == (CH))
 -
 -/* 1 if CH is lower case.  */
 -
 -#define LOWERCASEP(CH) (!UPPERCASEP (CH) && !NOCASEP(CH))
 -
 -/* Upcase a character, or make no change if that cannot be done.  */
 -
 -#define UPCASE(CH) (!UPPERCASEP (CH) ? UPCASE1 (CH) : (CH))
 -
 -/* Upcase a character known to be not upper case.  */
 -
 -#define UPCASE1(CH)                                           \
 -  ((case_temp1 = (CH),                                                \
 -    case_temp2 = CHAR_TABLE_REF (UPCASE_TABLE, case_temp1),   \
 -    NATNUMP (case_temp2))                                     \
 -   ? XFASTINT (case_temp2) : case_temp1)
 -
  extern Lisp_Object Vascii_downcase_table, Vascii_upcase_table;
  extern Lisp_Object Vascii_canon_table, Vascii_eqv_table;
  \f
@@@ -2110,143 -2150,129 +2110,143 @@@ struct gcpr
                          || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
  
  
 -#define GCPRO1(varname) GCPRO1_VAR (varname, gcpro1)
 -#define UNGCPRO UNGCPRO_VAR (gcpro1)
 +#define GCPRO1(var) \
 +  GCPRO1_VAR (var, gcpro)
 +#define GCPRO2(var1, var2) \
 +  GCPRO2_VAR (var1, var2, gcpro)
 +#define GCPRO3(var1, var2, var3) \
 +  GCPRO3_VAR (var1, var2, var3, gcpro)
 +#define GCPRO4(var1, var2, var3, var4) \
 +  GCPRO4_VAR (var1, var2, var3, var4, gcpro)
 +#define GCPRO5(var1, var2, var3, var4, var5) \
 +  GCPRO5_VAR (var1, var2, var3, var4, var5, gcpro)
 +#define GCPRO6(var1, var2, var3, var4, var5, var6) \
 +  GCPRO6_VAR (var1, var2, var3, var4, var5, var6, gcpro)
 +#define UNGCPRO UNGCPRO_VAR (gcpro)
  
  #if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
  
  /* Do something silly with gcproN vars just so gcc shuts up.  */
  /* You get warnings from MIPSPro...  */
  
 -#define GCPRO1_VAR(varname, gcpro1) ((void) gcpro1)
 -#define GCPRO2(varname1, varname2)(((void) gcpro2, (void) gcpro1))
 -#define GCPRO3(varname1, varname2, varname3) \
 -  (((void) gcpro3, (void) gcpro2, (void) gcpro1))
 -#define GCPRO4(varname1, varname2, varname3, varname4) \
 -  (((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1))
 -#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
 -  (((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1))
 -#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
 -  (((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1))
 -#define UNGCPRO_VAR(gcpro1) ((void) 0)
 +#define GCPRO1_VAR(var, gcpro) ((void) gcpro##1)
 +#define GCPRO2_VAR(var1, var2, gcpro) \
 +  ((void) gcpro##2, (void) gcpro##1)
 +#define GCPRO3_VAR(var1, var2, var3, gcpro) \
 +  ((void) gcpro##3, (void) gcpro##2, (void) gcpro##1)
 +#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \
 +  ((void) gcpro##4, (void) gcpro##3, (void) gcpro##2, (void) gcpro##1)
 +#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \
 +  ((void) gcpro##5, (void) gcpro##4, (void) gcpro##3, (void) gcpro##2, \
 +   (void) gcpro##1)
 +#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \
 +  ((void) gcpro##6, (void) gcpro##5, (void) gcpro##4, (void) gcpro##3, \
 +   (void) gcpro##2, (void) gcpro##1)
 +#define UNGCPRO_VAR(gcpro) ((void) 0)
  
  #else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
  
  #ifndef DEBUG_GCPRO
  
 -#define GCPRO1_VAR(varname, gcpro1)                               \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
 -  gcprolist = &gcpro1; }
 -
 -#define GCPRO2(varname1, varname2) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcprolist = &gcpro2; }
 -
 -#define GCPRO3(varname1, varname2, varname3) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcprolist = &gcpro3; }
 -
 -#define GCPRO4(varname1, varname2, varname3, varname4) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcprolist = &gcpro4; }
 -
 -#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
 -  gcprolist = &gcpro5; }
 -
 -#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
 -  gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
 -  gcprolist = &gcpro6; }
 -
 -#define UNGCPRO_VAR(gcpro1) (gcprolist = gcpro1.next)
 +#define GCPRO1_VAR(var, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var; gcpro##1.nvars = 1; \
 +  gcprolist = &gcpro##1; }
 +
 +#define GCPRO2_VAR(var1, var2, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcprolist = &gcpro##2; }
 +
 +#define GCPRO3_VAR(var1, var2, var3, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcprolist = &gcpro##3; }
 +
 +#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcprolist = &gcpro##4; }
 +
 +#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcpro##5.next = &gcpro##4; gcpro##5.var = &var5; gcpro##5.nvars = 1; \
 +  gcprolist = &gcpro##5; }
 +
 +#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcpro##5.next = &gcpro##4; gcpro##5.var = &var5; gcpro##5.nvars = 1; \
 +  gcpro##6.next = &gcpro##5; gcpro##6.var = &var6; gcpro##6.nvars = 1; \
 +  gcprolist = &gcpro##6; }
 +
 +#define UNGCPRO_VAR(gcpro) (gcprolist = gcpro##1.next)
  
  #else
  
  extern int gcpro_level;
  
 -#define GCPRO1_VAR(varname, gcpro1)                               \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level++; \
 -  gcprolist = &gcpro1; }
 -
 -#define GCPRO2(varname1, varname2) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro2.level = gcpro_level++; \
 -  gcprolist = &gcpro2; }
 -
 -#define GCPRO3(varname1, varname2, varname3) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro3.level = gcpro_level++; \
 -  gcprolist = &gcpro3; }
 -
 -#define GCPRO4(varname1, varname2, varname3, varname4) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcpro4.level = gcpro_level++; \
 -  gcprolist = &gcpro4; }
 -
 -#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
 -  gcpro5.level = gcpro_level++; \
 -  gcprolist = &gcpro5; }
 -
 -#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
 - {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
 -  gcpro1.level = gcpro_level; \
 -  gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
 -  gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
 -  gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
 -  gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
 -  gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
 -  gcpro6.level = gcpro_level++; \
 -  gcprolist = &gcpro6; }
 -
 -#define UNGCPRO_VAR(gcpro1)           \
 - ((--gcpro_level != gcpro1.level)             \
 -  ? (abort (), 0)                             \
 -  : ((gcprolist = gcpro1.next), 0))
 +#define GCPRO1_VAR(var, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level++; \
 +  gcprolist = &gcpro##1; }
 +
 +#define GCPRO2_VAR(var1, var2, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##2.level = gcpro_level++; \
 +  gcprolist = &gcpro##2; }
 +
 +#define GCPRO3_VAR(var1, var2, var3, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##3.level = gcpro_level++; \
 +  gcprolist = &gcpro##3; }
 +
 +#define GCPRO4_VAR(var1, var2, var3, var4, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcpro##4.level = gcpro_level++; \
 +  gcprolist = &gcpro##4; }
 +
 +#define GCPRO5_VAR(var1, var2, var3, var4, var5, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcpro##5.next = &gcpro##4; gcpro##5.var = &var5; gcpro##5.nvars = 1; \
 +  gcpro##5.level = gcpro_level++; \
 +  gcprolist = &gcpro##5; }
 +
 +#define GCPRO6_VAR(var1, var2, var3, var4, var5, var6, gcpro) \
 + {gcpro##1.next = gcprolist; gcpro##1.var = &var1; gcpro##1.nvars = 1; \
 +  gcpro##1.level = gcpro_level; \
 +  gcpro##2.next = &gcpro##1; gcpro##2.var = &var2; gcpro##2.nvars = 1; \
 +  gcpro##3.next = &gcpro##2; gcpro##3.var = &var3; gcpro##3.nvars = 1; \
 +  gcpro##4.next = &gcpro##3; gcpro##4.var = &var4; gcpro##4.nvars = 1; \
 +  gcpro##5.next = &gcpro##4; gcpro##5.var = &var5; gcpro##5.nvars = 1; \
 +  gcpro##6.next = &gcpro##5; gcpro##6.var = &var6; gcpro##6.nvars = 1; \
 +  gcpro##6.level = gcpro_level++; \
 +  gcprolist = &gcpro##6; }
 +
 +#define UNGCPRO_VAR(gcpro) \
 + ((--gcpro_level != gcpro##1.level) \
 +  ? (abort (), 0) \
 +  : ((gcprolist = gcpro##1.next), 0))
  
  #endif /* DEBUG_GCPRO */
  #endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
@@@ -2581,6 -2607,7 +2581,7 @@@ extern void syms_of_insdel (void)
  
  /* Defined in dispnew.c */
  extern Lisp_Object selected_frame;
+ extern Lisp_Object Vwindow_system;
  EXFUN (Fding, 1);
  EXFUN (Fredraw_frame, 1);
  EXFUN (Fsleep_for, 2);
@@@ -2763,7 -2790,6 +2764,7 @@@ EXFUN (Fprint, 2)
  EXFUN (Ferror_message_string, 1);
  extern Lisp_Object Qstandard_output;
  extern Lisp_Object Qexternal_debugging_output;
 +extern void debug_output_compilation_hack (int);
  extern void temp_output_buffer_setup (const char *);
  extern int print_level;
  extern Lisp_Object Qprint_escape_newlines;
@@@ -2873,10 -2899,8 +2874,10 @@@ extern Lisp_Object safe_call (int, Lisp
  extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
  extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
  extern void init_eval (void);
 +extern void mark_backtrace (void);
  extern void syms_of_eval (void);
  
 +/* Defined in editfns.c */
  extern Lisp_Object Qfield;
  EXFUN (Fcurrent_message, 0);
  EXFUN (Fgoto_char, 1);
@@@ -2916,8 -2940,6 +2917,8 @@@ extern Lisp_Object make_buffer_string (
  extern Lisp_Object make_buffer_string_both (EMACS_INT, EMACS_INT, EMACS_INT,
                                            EMACS_INT, int);
  extern void init_editfns (void);
 +const char *get_system_name (void);
 +const char *get_operating_system_release (void);
  extern void syms_of_editfns (void);
  EXFUN (Fconstrain_to_field, 5);
  EXFUN (Ffield_end, 3);
@@@ -2974,14 -2996,12 +2975,14 @@@ extern EMACS_INT marker_byte_position (
  extern void clear_charpos_cache (struct buffer *);
  extern EMACS_INT charpos_to_bytepos (EMACS_INT);
  extern EMACS_INT buf_charpos_to_bytepos (struct buffer *, EMACS_INT);
 +extern EMACS_INT verify_bytepos (EMACS_INT charpos);
  extern EMACS_INT buf_bytepos_to_charpos (struct buffer *, EMACS_INT);
  extern void unchain_marker (struct Lisp_Marker *marker);
  extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
  extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, EMACS_INT, EMACS_INT);
  extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,
                                                 EMACS_INT, EMACS_INT);
 +extern int count_markers (struct buffer *);
  extern void syms_of_marker (void);
  
  /* Defined in fileio.c */
@@@ -2990,6 -3010,7 +2991,7 @@@ extern Lisp_Object Qfile_error
  extern Lisp_Object Qfile_exists_p;
  extern Lisp_Object Qfile_directory_p;
  extern Lisp_Object Qinsert_file_contents;
+ extern Lisp_Object Qfile_name_history;
  EXFUN (Ffind_file_name_handler, 2);
  EXFUN (Ffile_name_as_directory, 1);
  EXFUN (Fexpand_file_name, 2);
@@@ -3031,10 -3052,6 +3033,10 @@@ EXFUN (Fset_match_data, 2)
  EXFUN (Fmatch_beginning, 1);
  EXFUN (Fmatch_end, 1);
  extern void record_unwind_save_match_data (void);
 +struct re_registers;
 +extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
 +                                                struct re_registers *,
 +                                                Lisp_Object, int, int);
  extern int fast_string_match (Lisp_Object, Lisp_Object);
  extern int fast_c_string_match_ignore_case (Lisp_Object, const char *);
  extern int fast_string_match_ignore_case (Lisp_Object, Lisp_Object);
@@@ -3126,7 -3143,6 +3128,7 @@@ extern void cmd_error_internal (Lisp_Ob
  extern Lisp_Object command_loop_1 (void);
  extern Lisp_Object recursive_edit_1 (void);
  extern void record_auto_save (void);
 +extern void force_auto_save_soon (void);
  extern void init_keyboard (void);
  extern void syms_of_keyboard (void);
  extern void keys_of_keyboard (void);
@@@ -3179,7 -3195,6 +3181,7 @@@ extern Lisp_Object decode_env_path (con
  extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
  extern Lisp_Object Qfile_name_handler_alist;
  extern void (*fatal_error_signal_hook) (void);
 +extern SIGTYPE fatal_error_signal (int);
  EXFUN (Fkill_emacs, 1) NO_RETURN;
  #if HAVE_SETLOCALE
  void fixup_locale (void);
@@@ -3325,8 -3340,6 +3327,8 @@@ extern void child_setup_tty (int)
  extern void setup_pty (int);
  extern int set_window_size (int, int, int);
  extern void create_process (Lisp_Object, char **, Lisp_Object);
 +extern long get_random (void);
 +extern void seed_random (long);
  extern int emacs_open (const char *, int, int);
  extern int emacs_close (int);
  extern int emacs_read (int, char *, unsigned int);
diff --combined src/print.c
@@@ -854,7 -854,7 +854,7 @@@ append to existing target file.  */
      {
        file = Fexpand_file_name (file, Qnil);
        initial_stderr_stream = stderr;
 -      stderr = fopen (SDATA (file), NILP (append) ? "w" : "a");
 +      stderr = fopen (SSDATA (file), NILP (append) ? "w" : "a");
        if (stderr == NULL)
        {
          stderr = initial_stderr_stream;
@@@ -1173,6 -1173,16 +1173,16 @@@ print (Lisp_Object obj, register Lisp_O
    print_object (obj, printcharfun, escapeflag);
  }
  
+ #define PRINT_CIRCLE_CANDIDATE_P(obj)                                 \
+   (STRINGP (obj) || CONSP (obj)                                               \
+    || (VECTORLIKEP (obj)                                              \
+       && (VECTORP (obj) || COMPILEDP (obj)                            \
+         || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj)               \
+         || HASH_TABLE_P (obj) || FONTP (obj)))                        \
+    || (! NILP (Vprint_gensym)                                         \
+        && SYMBOLP (obj)                                                       \
+        && !SYMBOL_INTERNED_P (obj)))
  /* Construct Vprint_number_table according to the structure of OBJ.
     OBJ itself and all its elements will be added to Vprint_number_table
     recursively if it is a list, vector, compiled function, char-table,
@@@ -1207,12 -1217,7 +1217,7 @@@ print_preprocess (Lisp_Object obj
    halftail = obj;
  
   loop:
-   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
-       || COMPILEDP (obj) || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj)
-       || HASH_TABLE_P (obj)
-       || (! NILP (Vprint_gensym)
-         && SYMBOLP (obj)
-         && !SYMBOL_INTERNED_P (obj)))
+   if (PRINT_CIRCLE_CANDIDATE_P (obj))
      {
        if (!HASH_TABLE_P (Vprint_number_table))
        {
@@@ -1389,12 -1394,7 +1394,7 @@@ print_object (Lisp_Object obj, registe
      error ("Apparently circular structure being printed");
  
    /* Detect circularities and truncate them.  */
-   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
-       || COMPILEDP (obj) || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj)
-       || HASH_TABLE_P (obj)
-       || (! NILP (Vprint_gensym)
-         && SYMBOLP (obj)
-         && !SYMBOL_INTERNED_P (obj)))
+   if (PRINT_CIRCLE_CANDIDATE_P (obj))
      {
        if (NILP (Vprint_circle) && NILP (Vprint_gensym))
        {