Using saved parent location: http://bzr.savannah.gnu.org/r/emacs/trunk/ Now on revision 103771. ------------------------------------------------------------ revno: 103771 committer: Glenn Morris branch nick: trunk timestamp: Mon 2011-03-28 20:33:22 -0700 message: * INSTALL.BZR: Tiny re-wording. diff: === modified file 'INSTALL.BZR' --- INSTALL.BZR 2011-03-25 07:14:31 +0000 +++ INSTALL.BZR 2011-03-29 03:33:22 +0000 @@ -17,7 +17,7 @@ necessary tools. The first time you build, there are a couple of extra steps. -First, generate the `configure' script: +First, generate the `configure' script and some related files: $ ./autogen.sh ------------------------------------------------------------ revno: 103770 committer: Juanma Barranquero branch nick: trunk timestamp: Tue 2011-03-29 00:41:01 +0200 message: src/*.c: Remove some additional unused parameters. * lisp.h (multibyte_char_to_unibyte): * character.c (multibyte_char_to_unibyte): Remove parameter `rev_tbl', unused since revno:43563.1.16 (2002-03-01) and revno:84043 (2008-02-1). * character.h (CHAR_TO_BYTE8): * cmds.c (internal_self_insert): * editfns.c (general_insert_function): * keymap.c (push_key_description): * search.c (Freplace_match): * xdisp.c (message_dolog, set_message_1): All callers changed. * coding.c (encode_designation_at_bol): Remove parameter `charbuf_end', unused since revno:43563.1.17 (2002-03-01) and revno:84043 (2008-02-1). All callers changed. diff: === modified file 'src/ChangeLog' --- src/ChangeLog 2011-03-28 20:26:35 +0000 +++ src/ChangeLog 2011-03-28 22:41:01 +0000 @@ -1,3 +1,19 @@ +2011-03-28 Juanma Barranquero + + * coding.c (encode_designation_at_bol): Remove parameter `charbuf_end', + unused since revno:43563.1.17 (2002-03-01) and revno:84043 (2008-02-1). + All callers changed. + + * lisp.h (multibyte_char_to_unibyte): + * character.c (multibyte_char_to_unibyte): Remove parameter `rev_tbl', + unused since revno:43563.1.16 (2002-03-01) and revno:84043 (2008-02-1). + * character.h (CHAR_TO_BYTE8): + * cmds.c (internal_self_insert): + * editfns.c (general_insert_function): + * keymap.c (push_key_description): + * search.c (Freplace_match): + * xdisp.c (message_dolog, set_message_1): All callers changed. + 2011-03-28 Stefan Monnier * keyboard.c (safe_run_hook_funcall): New function. @@ -43,7 +59,7 @@ * nsterm.m (syms_of_nsterm): Use doc: for ns-auto-hide-menu-bar. -2011-03-27 Anders Lindgren +2011-03-27 Anders Lindgren * nsterm.m (ns_menu_bar_is_hidden): New variable. (ns_constrain_all_frames, ns_menu_bar_should_be_hidden) === modified file 'src/character.c' --- src/character.c 2011-03-08 07:49:41 +0000 +++ src/character.c 2011-03-28 22:41:01 +0000 @@ -232,13 +232,10 @@ } /* Convert ASCII or 8-bit character C to unibyte. If C is none of - them, return (C & 0xFF). - - The argument REV_TBL is now ignored. It will be removed in the - future. */ + them, return (C & 0xFF). */ int -multibyte_char_to_unibyte (int c, Lisp_Object rev_tbl) +multibyte_char_to_unibyte (int c) { if (c < 0x80) return c; === modified file 'src/character.h' --- src/character.h 2011-03-19 00:12:53 +0000 +++ src/character.h 2011-03-28 22:41:01 +0000 @@ -69,7 +69,7 @@ #define CHAR_TO_BYTE8(c) \ (CHAR_BYTE8_P (c) \ ? (c) - 0x3FFF00 \ - : multibyte_char_to_unibyte (c, Qnil)) + : multibyte_char_to_unibyte (c)) /* Return the raw 8-bit byte for character C, or -1 if C doesn't correspond to a byte. */ === modified file 'src/cmds.c' --- src/cmds.c 2011-03-23 10:06:57 +0000 +++ src/cmds.c 2011-03-28 22:41:01 +0000 @@ -352,7 +352,7 @@ { str[0] = (SINGLE_BYTE_CHAR_P (c) ? c - : multibyte_char_to_unibyte (c, Qnil)); + : multibyte_char_to_unibyte (c)); len = 1; } if (!NILP (overwrite) === modified file 'src/coding.c' --- src/coding.c 2011-03-22 16:20:45 +0000 +++ src/coding.c 2011-03-28 22:41:01 +0000 @@ -853,8 +853,7 @@ EMACS_INT, unsigned char *); static void setup_iso_safe_charsets (Lisp_Object); static unsigned char *encode_designation_at_bol (struct coding_system *, - int *, int *, - unsigned char *); + int *, unsigned char *); static int detect_eol (const unsigned char *, EMACS_INT, enum coding_category); static Lisp_Object adjust_coding_eol_type (struct coding_system *, int); @@ -4299,7 +4298,7 @@ static unsigned char * encode_designation_at_bol (struct coding_system *coding, int *charbuf, - int *charbuf_end, unsigned char *dst) + unsigned char *dst) { struct charset *charset; /* Table of charsets to be designated to each graphic register. */ @@ -4390,7 +4389,7 @@ unsigned char *dst_prev = dst; /* We have to produce designation sequences if any now. */ - dst = encode_designation_at_bol (coding, charbuf, charbuf_end, dst); + dst = encode_designation_at_bol (coding, charbuf, dst); bol_designation = 0; /* We are sure that designation sequences are all ASCII bytes. */ produced_chars += dst - dst_prev; === modified file 'src/editfns.c' --- src/editfns.c 2011-03-23 10:06:57 +0000 +++ src/editfns.c 2011-03-28 22:41:01 +0000 @@ -2226,7 +2226,7 @@ { str[0] = (ASCII_CHAR_P (XINT (val)) ? XINT (val) - : multibyte_char_to_unibyte (XINT (val), Qnil)); + : multibyte_char_to_unibyte (XINT (val))); len = 1; } (*insert_func) ((char *) str, len); === modified file 'src/keymap.c' --- src/keymap.c 2011-03-26 02:48:03 +0000 +++ src/keymap.c 2011-03-28 22:41:01 +0000 @@ -2387,7 +2387,7 @@ /* Now we are sure that C is a valid character code. */ if (NILP (BVAR (current_buffer, enable_multibyte_characters)) && ! force_multibyte) - *p++ = multibyte_char_to_unibyte (c, Qnil); + *p++ = multibyte_char_to_unibyte (c); else p += CHAR_STRING (c, (unsigned char *) p); } === modified file 'src/lisp.h' --- src/lisp.h 2011-03-28 20:26:35 +0000 +++ src/lisp.h 2011-03-28 22:41:01 +0000 @@ -2403,7 +2403,7 @@ EXFUN (Fstring, MANY); extern EMACS_INT chars_in_text (const unsigned char *, EMACS_INT); extern EMACS_INT multibyte_chars_in_text (const unsigned char *, EMACS_INT); -extern int multibyte_char_to_unibyte (int, Lisp_Object); +extern int multibyte_char_to_unibyte (int); extern int multibyte_char_to_unibyte_safe (int); extern void init_character_once (void); extern void syms_of_character (void); === modified file 'src/search.c' --- src/search.c 2011-03-28 03:29:18 +0000 +++ src/search.c 2011-03-28 22:41:01 +0000 @@ -2634,11 +2634,8 @@ EMACS_INT substed_alloc_size, substed_len; int buf_multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters)); int str_multibyte = STRING_MULTIBYTE (newtext); - Lisp_Object rev_tbl; int really_changed = 0; - rev_tbl = Qnil; - substed_alloc_size = length * 2 + 100; substed = (unsigned char *) xmalloc (substed_alloc_size + 1); substed_len = 0; @@ -2658,7 +2655,7 @@ { FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, newtext, pos, pos_byte); if (!buf_multibyte) - c = multibyte_char_to_unibyte (c, rev_tbl); + c = multibyte_char_to_unibyte (c); } else { @@ -2681,7 +2678,7 @@ FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, newtext, pos, pos_byte); if (!buf_multibyte && !ASCII_CHAR_P (c)) - c = multibyte_char_to_unibyte (c, rev_tbl); + c = multibyte_char_to_unibyte (c); } else { === modified file 'src/xdisp.c' --- src/xdisp.c 2011-03-28 03:29:18 +0000 +++ src/xdisp.c 2011-03-28 22:41:01 +0000 @@ -7962,7 +7962,7 @@ c = string_char_and_length (msg + i, &char_bytes); work[0] = (ASCII_CHAR_P (c) ? c - : multibyte_char_to_unibyte (c, Qnil)); + : multibyte_char_to_unibyte (c)); insert_1_both (work, 1, 1, 1, 0, 0); } } @@ -9223,7 +9223,7 @@ c = string_char_and_length (msg + i, &n); work[0] = (ASCII_CHAR_P (c) ? c - : multibyte_char_to_unibyte (c, Qnil)); + : multibyte_char_to_unibyte (c)); insert_1_both (work, 1, 1, 1, 0, 0); } } ------------------------------------------------------------ revno: 103769 committer: Stefan Monnier branch nick: trunk timestamp: Mon 2011-03-28 16:26:35 -0400 message: Don't reset post-command-hook to nil upon error. * src/eval.c (enum run_hooks_condition): Remove. (funcall_nil, funcall_not): New functions. (run_hook_with_args): Call each function through a `funcall' argument. Remove `cond' argument, now redundant. (Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success) (Frun_hook_with_args_until_failure): Adjust accordingly. (run_hook_wrapped_funcall, Frun_hook_wrapped): New functions. * src/keyboard.c (safe_run_hook_funcall): New function. (safe_run_hooks_1, safe_run_hooks_error, safe_run_hooks): On error, don't set the hook to nil, but remove the offending function instead. (Qcommand_hook_internal): Remove, unused. (syms_of_keyboard): Don't initialize Qcommand_hook_internal nor define Vcommand_hook_internal. * doc/lispref/commands.texi (Command Overview): post-command-hook is not reset to nil any more. diff: === modified file 'doc/lispref/ChangeLog' --- doc/lispref/ChangeLog 2011-03-21 00:20:24 +0000 +++ doc/lispref/ChangeLog 2011-03-28 20:26:35 +0000 @@ -1,3 +1,8 @@ +2011-03-28 Stefan Monnier + + * commands.texi (Command Overview): post-command-hook is not reset to + nil any more. + 2011-03-19 Stefan Monnier * strings.texi (String Conversion): Don't mention === modified file 'doc/lispref/commands.texi' --- doc/lispref/commands.texi 2011-02-05 22:30:14 +0000 +++ doc/lispref/commands.texi 2011-03-28 20:26:35 +0000 @@ -91,8 +91,9 @@ Quitting is suppressed while running @code{pre-command-hook} and @code{post-command-hook}. If an error happens while executing one of -these hooks, it terminates execution of the hook, and clears the hook -variable to @code{nil} so as to prevent an infinite loop of errors. +these hooks, it does not terminate execution of the hook; instead +the error is silenced and the function in which the error occurred +is removed from the hook. A request coming into the Emacs server (@pxref{Emacs Server,,, emacs, The GNU Emacs Manual}) runs these two hooks just as a keyboard === modified file 'etc/NEWS' --- etc/NEWS 2011-03-27 10:55:07 +0000 +++ etc/NEWS 2011-03-28 20:26:35 +0000 @@ -748,6 +748,11 @@ * Lisp changes in Emacs 24.1 +** pre/post-command-hook are not reset to nil upon error. +Instead, the offending function is removed. + +** New low-level function run-hook-wrapped. + ** byte-compile-disable-print-circle is obsolete. ** deferred-action-list and deferred-action-function are obsolete. ** Removed the stack-trace-on-error variable. === modified file 'src/ChangeLog' --- src/ChangeLog 2011-03-28 03:29:18 +0000 +++ src/ChangeLog 2011-03-28 20:26:35 +0000 @@ -1,3 +1,20 @@ +2011-03-28 Stefan Monnier + + * keyboard.c (safe_run_hook_funcall): New function. + (safe_run_hooks_1, safe_run_hooks_error, safe_run_hooks): On error, + don't set the hook to nil, but remove the offending function instead. + (Qcommand_hook_internal): Remove, unused. + (syms_of_keyboard): Don't initialize Qcommand_hook_internal nor define + Vcommand_hook_internal. + + * eval.c (enum run_hooks_condition): Remove. + (funcall_nil, funcall_not): New functions. + (run_hook_with_args): Call each function through a `funcall' argument. + Remove `cond' argument, now redundant. + (Frun_hooks, Frun_hook_with_args, Frun_hook_with_args_until_success) + (Frun_hook_with_args_until_failure): Adjust accordingly. + (run_hook_wrapped_funcall, Frun_hook_wrapped): New functions. + 2011-03-28 Juanma Barranquero * dispextern.h (string_buffer_position): Remove declaration. === modified file 'src/eval.c' --- src/eval.c 2011-03-16 07:44:19 +0000 +++ src/eval.c 2011-03-28 20:26:35 +0000 @@ -30,19 +30,19 @@ #include "xterm.h" #endif -/* This definition is duplicated in alloc.c and keyboard.c */ -/* Putting it in lisp.h makes cc bomb out! */ +/* This definition is duplicated in alloc.c and keyboard.c. */ +/* Putting it in lisp.h makes cc bomb out! */ struct backtrace { struct backtrace *next; Lisp_Object *function; - Lisp_Object *args; /* Points to vector of args. */ + Lisp_Object *args; /* Points to vector of args. */ int nargs; /* Length of vector. If nargs is UNEVALLED, args points to slot holding - list of unevalled args */ + list of unevalled args. */ char evalargs; - /* Nonzero means call value of debugger when done with this operation. */ + /* Nonzero means call value of debugger when done with this operation. */ char debug_on_exit; }; @@ -146,7 +146,7 @@ when_entered_debugger = -1; } -/* unwind-protect function used by call_debugger. */ +/* Unwind-protect function used by call_debugger. */ static Lisp_Object restore_stack_limits (Lisp_Object data) @@ -556,7 +556,7 @@ || btp->nargs == UNEVALLED)) btp = btp->next; - /* btp now points at the frame of the innermost function that isn't + /* `btp' now points at the frame of the innermost function that isn't a special form, ignoring frames for Finteractive_p and/or Fbytecode at the top. If this frame is for a built-in function (such as load or eval-region) return nil. */ @@ -564,7 +564,7 @@ if (exclude_subrs_p && SUBRP (fun)) return 0; - /* btp points to the frame of a Lisp function that called interactive-p. + /* `btp' points to the frame of a Lisp function that called interactive-p. Return t if that function was called interactively. */ if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively)) return 1; @@ -965,11 +965,11 @@ varlist = Fcar (args); - /* Make space to hold the values to give the bound variables */ + /* Make space to hold the values to give the bound variables. */ elt = Flength (varlist); SAFE_ALLOCA_LISP (temps, XFASTINT (elt)); - /* Compute the values and store them in `temps' */ + /* Compute the values and store them in `temps'. */ GCPRO2 (args, *temps); gcpro2.nvars = 0; @@ -1072,7 +1072,7 @@ /* SYM is not mentioned in ENVIRONMENT. Look at its function definition. */ if (EQ (def, Qunbound) || !CONSP (def)) - /* Not defined or definition not suitable */ + /* Not defined or definition not suitable. */ break; if (EQ (XCAR (def), Qautoload)) { @@ -1213,10 +1213,7 @@ byte_stack_list = catch->byte_stack; gcprolist = catch->gcpro; #ifdef DEBUG_GCPRO - if (gcprolist != 0) - gcpro_level = gcprolist->level + 1; - else - gcpro_level = 0; + gcpro_level = gcprolist ? gcprolist->level + 1 : gcpro_level = 0; #endif backtrace_list = catch->backlist; lisp_eval_depth = catch->lisp_eval_depth; @@ -1824,7 +1821,7 @@ ? debug_on_quit : wants_debugger (Vdebug_on_error, conditions)) && ! skip_debugger (conditions, combined_data) - /* rms: what's this for? */ + /* RMS: What's this for? */ && when_entered_debugger < num_nonmacro_input_events) { call_debugger (Fcons (Qerror, Fcons (combined_data, Qnil))); @@ -1891,7 +1888,7 @@ } -/* dump an error message; called like vprintf */ +/* Dump an error message; called like vprintf. */ void verror (const char *m, va_list ap) { @@ -1928,7 +1925,7 @@ } -/* dump an error message; called like printf */ +/* Dump an error message; called like printf. */ /* VARARGS 1 */ void @@ -2024,7 +2021,7 @@ CHECK_SYMBOL (function); CHECK_STRING (file); - /* If function is defined and not as an autoload, don't override */ + /* If function is defined and not as an autoload, don't override. */ if (!EQ (XSYMBOL (function)->function, Qunbound) && !(CONSP (XSYMBOL (function)->function) && EQ (XCAR (XSYMBOL (function)->function), Qautoload))) @@ -2159,7 +2156,7 @@ backtrace.next = backtrace_list; backtrace_list = &backtrace; - backtrace.function = &original_fun; /* This also protects them from gc */ + backtrace.function = &original_fun; /* This also protects them from gc. */ backtrace.args = &original_args; backtrace.nargs = UNEVALLED; backtrace.evalargs = 1; @@ -2169,7 +2166,7 @@ do_debug_on_call (Qt); /* At this point, only original_fun and original_args - have values that will be used below */ + have values that will be used below. */ retry: /* Optimize for no indirection. */ @@ -2190,8 +2187,9 @@ CHECK_CONS_LIST (); - if (XINT (numargs) < XSUBR (fun)->min_args || - (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs))) + if (XINT (numargs) < XSUBR (fun)->min_args + || (XSUBR (fun)->max_args >= 0 + && XSUBR (fun)->max_args < XINT (numargs))) xsignal2 (Qwrong_number_of_arguments, original_fun, numargs); else if (XSUBR (fun)->max_args == UNEVALLED) @@ -2201,7 +2199,7 @@ } else if (XSUBR (fun)->max_args == MANY) { - /* Pass a vector of evaluated arguments */ + /* Pass a vector of evaluated arguments. */ Lisp_Object *vals; register int argnum = 0; USE_SAFE_ALLOCA; @@ -2364,7 +2362,7 @@ fun = indirect_function (fun); if (EQ (fun, Qunbound)) { - /* Let funcall get the error */ + /* Let funcall get the error. */ fun = args[0]; goto funcall; } @@ -2373,11 +2371,11 @@ { if (numargs < XSUBR (fun)->min_args || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs)) - goto funcall; /* Let funcall get the error */ + goto funcall; /* Let funcall get the error. */ else if (XSUBR (fun)->max_args > numargs) { /* Avoid making funcall cons up a yet another new vector of arguments - by explicitly supplying nil's for optional values */ + by explicitly supplying nil's for optional values. */ SAFE_ALLOCA_LISP (funcall_args, 1 + XSUBR (fun)->max_args); for (i = numargs; i < XSUBR (fun)->max_args;) funcall_args[++i] = Qnil; @@ -2415,9 +2413,16 @@ /* Run hook variables in various ways. */ -enum run_hooks_condition {to_completion, until_success, until_failure}; -static Lisp_Object run_hook_with_args (int, Lisp_Object *, - enum run_hooks_condition); +Lisp_Object run_hook_with_args (int, Lisp_Object *, + Lisp_Object (*funcall) + (int nargs, Lisp_Object *args)); + +static Lisp_Object +funcall_nil (int nargs, Lisp_Object *args) +{ + Ffuncall (nargs, args); + return Qnil; +} DEFUN ("run-hooks", Frun_hooks, Srun_hooks, 0, MANY, 0, doc: /* Run each hook in HOOKS. @@ -2442,7 +2447,7 @@ for (i = 0; i < nargs; i++) { hook[0] = args[i]; - run_hook_with_args (1, hook, to_completion); + run_hook_with_args (1, hook, funcall_nil); } return Qnil; @@ -2465,7 +2470,7 @@ usage: (run-hook-with-args HOOK &rest ARGS) */) (int nargs, Lisp_Object *args) { - return run_hook_with_args (nargs, args, to_completion); + return run_hook_with_args (nargs, args, funcall_nil); } DEFUN ("run-hook-with-args-until-success", Frun_hook_with_args_until_success, @@ -2485,7 +2490,13 @@ usage: (run-hook-with-args-until-success HOOK &rest ARGS) */) (int nargs, Lisp_Object *args) { - return run_hook_with_args (nargs, args, until_success); + return run_hook_with_args (nargs, args, Ffuncall); +} + +static Lisp_Object +funcall_not (int nargs, Lisp_Object *args) +{ + return NILP (Ffuncall (nargs, args)) ? Qt : Qnil; } DEFUN ("run-hook-with-args-until-failure", Frun_hook_with_args_until_failure, @@ -2504,21 +2515,45 @@ usage: (run-hook-with-args-until-failure HOOK &rest ARGS) */) (int nargs, Lisp_Object *args) { - return run_hook_with_args (nargs, args, until_failure); -} - + return NILP (run_hook_with_args (nargs, args, funcall_not)) ? Qt : Qnil; +} + +static Lisp_Object +run_hook_wrapped_funcall (int nargs, Lisp_Object *args) +{ + Lisp_Object tmp = args[0], ret; + args[0] = args[1]; + args[1] = tmp; + ret = Ffuncall (nargs, args); + args[1] = args[0]; + args[0] = tmp; + return ret; +} + +DEFUN ("run-hook-wrapped", Frun_hook_wrapped, Srun_hook_wrapped, 2, MANY, 0, + doc: /* Run HOOK, passing each function through WRAP-FUNCTION. +I.e. instead of calling each function FUN directly with arguments ARGS, +it calls WRAP-FUNCTION with arguments FUN and ARGS. +As soon as a call to WRAP-FUNCTION returns non-nil, `run-hook-wrapped' +aborts and returns that value. +usage: (run-hook-wrapped HOOK WRAP-FUNCTION &rest ARGS) */) + (int nargs, Lisp_Object *args) +{ + return run_hook_with_args (nargs, args, run_hook_wrapped_funcall); +} + /* ARGS[0] should be a hook symbol. Call each of the functions in the hook value, passing each of them as arguments all the rest of ARGS (all NARGS - 1 elements). - COND specifies a condition to test after each call - to decide whether to stop. + FUNCALL specifies how to call each function on the hook. The caller (or its caller, etc) must gcpro all of ARGS, except that it isn't necessary to gcpro ARGS[0]. */ -static Lisp_Object -run_hook_with_args (int nargs, Lisp_Object *args, enum run_hooks_condition cond) +Lisp_Object +run_hook_with_args (int nargs, Lisp_Object *args, + Lisp_Object (*funcall) (int nargs, Lisp_Object *args)) { - Lisp_Object sym, val, ret; + Lisp_Object sym, val, ret = Qnil; struct gcpro gcpro1, gcpro2, gcpro3; /* If we are dying or still initializing, @@ -2528,14 +2563,13 @@ sym = args[0]; val = find_symbol_value (sym); - ret = (cond == until_failure ? Qt : Qnil); if (EQ (val, Qunbound) || NILP (val)) return ret; else if (!CONSP (val) || EQ (XCAR (val), Qlambda)) { args[0] = val; - return Ffuncall (nargs, args); + return funcall (nargs, args); } else { @@ -2543,9 +2577,7 @@ GCPRO3 (sym, val, global_vals); for (; - CONSP (val) && ((cond == to_completion) - || (cond == until_success ? NILP (ret) - : !NILP (ret))); + CONSP (val) && NILP (ret); val = XCDR (val)) { if (EQ (XCAR (val), Qt)) @@ -2558,30 +2590,26 @@ if (!CONSP (global_vals) || EQ (XCAR (global_vals), Qlambda)) { args[0] = global_vals; - ret = Ffuncall (nargs, args); + ret = funcall (nargs, args); } else { for (; - (CONSP (global_vals) - && (cond == to_completion - || (cond == until_success - ? NILP (ret) - : !NILP (ret)))); + CONSP (global_vals) && NILP (ret); global_vals = XCDR (global_vals)) { args[0] = XCAR (global_vals); /* In a global value, t should not occur. If it does, we must ignore it to avoid an endless loop. */ if (!EQ (args[0], Qt)) - ret = Ffuncall (nargs, args); + ret = funcall (nargs, args); } } } else { args[0] = XCAR (val); - ret = Ffuncall (nargs, args); + ret = funcall (nargs, args); } } @@ -2603,7 +2631,7 @@ Frun_hook_with_args (3, temp); } -/* Apply fn to arg */ +/* Apply fn to arg. */ Lisp_Object apply1 (Lisp_Object fn, Lisp_Object arg) { @@ -2622,7 +2650,7 @@ } } -/* Call function fn on no arguments */ +/* Call function fn on no arguments. */ Lisp_Object call0 (Lisp_Object fn) { @@ -2632,7 +2660,7 @@ RETURN_UNGCPRO (Ffuncall (1, &fn)); } -/* Call function fn with 1 argument arg1 */ +/* Call function fn with 1 argument arg1. */ /* ARGSUSED */ Lisp_Object call1 (Lisp_Object fn, Lisp_Object arg1) @@ -2647,7 +2675,7 @@ RETURN_UNGCPRO (Ffuncall (2, args)); } -/* Call function fn with 2 arguments arg1, arg2 */ +/* Call function fn with 2 arguments arg1, arg2. */ /* ARGSUSED */ Lisp_Object call2 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2) @@ -2662,7 +2690,7 @@ RETURN_UNGCPRO (Ffuncall (3, args)); } -/* Call function fn with 3 arguments arg1, arg2, arg3 */ +/* Call function fn with 3 arguments arg1, arg2, arg3. */ /* ARGSUSED */ Lisp_Object call3 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3) @@ -2678,7 +2706,7 @@ RETURN_UNGCPRO (Ffuncall (4, args)); } -/* Call function fn with 4 arguments arg1, arg2, arg3, arg4 */ +/* Call function fn with 4 arguments arg1, arg2, arg3, arg4. */ /* ARGSUSED */ Lisp_Object call4 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, @@ -2696,7 +2724,7 @@ RETURN_UNGCPRO (Ffuncall (5, args)); } -/* Call function fn with 5 arguments arg1, arg2, arg3, arg4, arg5 */ +/* Call function fn with 5 arguments arg1, arg2, arg3, arg4, arg5. */ /* ARGSUSED */ Lisp_Object call5 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, @@ -2715,7 +2743,7 @@ RETURN_UNGCPRO (Ffuncall (6, args)); } -/* Call function fn with 6 arguments arg1, arg2, arg3, arg4, arg5, arg6 */ +/* Call function fn with 6 arguments arg1, arg2, arg3, arg4, arg5, arg6. */ /* ARGSUSED */ Lisp_Object call6 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, @@ -2735,7 +2763,7 @@ RETURN_UNGCPRO (Ffuncall (7, args)); } -/* Call function fn with 7 arguments arg1, arg2, arg3, arg4, arg5, arg6, arg7 */ +/* Call function fn with 7 arguments arg1, arg2, arg3, arg4, arg5, arg6, arg7. */ /* ARGSUSED */ Lisp_Object call7 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, @@ -3079,7 +3107,7 @@ specpdl_ptr = specpdl + count; } -/* specpdl_ptr->symbol is a field which describes which variable is +/* `specpdl_ptr->symbol' is a field which describes which variable is let-bound, so it can be properly undone when we unbind_to. It can have the following two shapes: - SYMBOL : if it's a plain symbol, it means that we have let-bound @@ -3318,7 +3346,7 @@ else { tem = *backlist->function; - Fprin1 (tem, Qnil); /* This can QUIT */ + Fprin1 (tem, Qnil); /* This can QUIT. */ write_string ("(", -1); if (backlist->nargs == MANY) { @@ -3588,6 +3616,7 @@ defsubr (&Srun_hook_with_args); defsubr (&Srun_hook_with_args_until_success); defsubr (&Srun_hook_with_args_until_failure); + defsubr (&Srun_hook_wrapped); defsubr (&Sfetch_bytecode); defsubr (&Sbacktrace_debug); defsubr (&Sbacktrace); === modified file 'src/keyboard.c' --- src/keyboard.c 2011-03-27 02:27:11 +0000 +++ src/keyboard.c 2011-03-28 20:26:35 +0000 @@ -254,7 +254,6 @@ /* Hooks to run before and after each command. */ Lisp_Object Qpre_command_hook; Lisp_Object Qpost_command_hook; -Lisp_Object Qcommand_hook_internal; Lisp_Object Qdeferred_action_function; @@ -1815,20 +1814,63 @@ static Lisp_Object safe_run_hooks_1 (void) { - return Frun_hooks (1, &Vinhibit_quit); -} - -/* Subroutine for safe_run_hooks: handle an error by clearing out the hook. */ - -static Lisp_Object -safe_run_hooks_error (Lisp_Object data) -{ - Lisp_Object args[3]; - args[0] = build_string ("Error in %s: %s"); - args[1] = Vinhibit_quit; - args[2] = data; - Fmessage (3, args); - return Fset (Vinhibit_quit, Qnil); + eassert (CONSP (Vinhibit_quit)); + return call0 (XCDR (Vinhibit_quit)); +} + +/* Subroutine for safe_run_hooks: handle an error by clearing out the function + from the hook. */ + +static Lisp_Object +safe_run_hooks_error (Lisp_Object error_data) +{ + Lisp_Object hook + = CONSP (Vinhibit_quit) ? XCAR (Vinhibit_quit) : Vinhibit_quit; + Lisp_Object fun = CONSP (Vinhibit_quit) ? XCDR (Vinhibit_quit) : Qnil; + Lisp_Object args[4]; + args[0] = build_string ("Error in %s (%s): %s"); + args[1] = hook; + args[2] = fun; + args[3] = error_data; + Fmessage (4, args); + if (SYMBOLP (hook)) + { + Lisp_Object val; + int found = 0; + Lisp_Object newval = Qnil; + for (val = find_symbol_value (hook); CONSP (val); val = XCDR (val)) + if (EQ (fun, XCAR (val))) + found = 1; + else + newval = Fcons (XCAR (val), newval); + if (found) + return Fset (hook, Fnreverse (newval)); + /* Not found in the local part of the hook. Let's look at the global + part. */ + newval = Qnil; + for (val = (NILP (Fdefault_boundp (hook)) ? Qnil + : Fdefault_value (hook)); + CONSP (val); val = XCDR (val)) + if (EQ (fun, XCAR (val))) + found = 1; + else + newval = Fcons (XCAR (val), newval); + if (found) + return Fset_default (hook, Fnreverse (newval)); + } + return Qnil; +} + +static Lisp_Object +safe_run_hook_funcall (int nargs, Lisp_Object *args) +{ + eassert (nargs == 1); + if (CONSP (Vinhibit_quit)) + XSETCDR (Vinhibit_quit, args[0]); + else + Vinhibit_quit = Fcons (Vinhibit_quit, args[0]); + + return internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error); } /* If we get an error while running the hook, cause the hook variable @@ -1838,10 +1880,13 @@ void safe_run_hooks (Lisp_Object hook) { + /* FIXME: our `internal_condition_case' does not provide any way to pass data + to its body or to its handlers other than via globals such as + dynamically-bound variables ;-) */ int count = SPECPDL_INDEX (); specbind (Qinhibit_quit, hook); - internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error); + run_hook_with_args (1, &hook, safe_run_hook_funcall); unbind_to (count, Qnil); } @@ -11438,9 +11483,6 @@ Qdeferred_action_function = intern_c_string ("deferred-action-function"); staticpro (&Qdeferred_action_function); - Qcommand_hook_internal = intern_c_string ("command-hook-internal"); - staticpro (&Qcommand_hook_internal); - Qfunction_key = intern_c_string ("function-key"); staticpro (&Qfunction_key); Qmouse_click = intern_c_string ("mouse-click"); @@ -11908,22 +11950,18 @@ Qdeactivate_mark = intern_c_string ("deactivate-mark"); staticpro (&Qdeactivate_mark); - DEFVAR_LISP ("command-hook-internal", Vcommand_hook_internal, - doc: /* Temporary storage of `pre-command-hook' or `post-command-hook'. */); - Vcommand_hook_internal = Qnil; - DEFVAR_LISP ("pre-command-hook", Vpre_command_hook, doc: /* Normal hook run before each command is executed. If an unhandled error happens in running this hook, -the hook value is set to nil, since otherwise the error -might happen repeatedly and make Emacs nonfunctional. */); +the function in which the error occurred is unconditionally removed, since +otherwise the error might happen repeatedly and make Emacs nonfunctional. */); Vpre_command_hook = Qnil; DEFVAR_LISP ("post-command-hook", Vpost_command_hook, doc: /* Normal hook run after each command is executed. If an unhandled error happens in running this hook, -the hook value is set to nil, since otherwise the error -might happen repeatedly and make Emacs nonfunctional. */); +the function in which the error occurred is unconditionally removed, since +otherwise the error might happen repeatedly and make Emacs nonfunctional. */); Vpost_command_hook = Qnil; #if 0 === modified file 'src/lisp.h' --- src/lisp.h 2011-03-27 02:27:11 +0000 +++ src/lisp.h 2011-03-28 20:26:35 +0000 @@ -2278,7 +2278,7 @@ struct window; struct frame; -/* Defined in data.c */ +/* Defined in data.c. */ extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound; extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level; extern Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range; @@ -2812,7 +2812,7 @@ extern void init_lread (void); extern void syms_of_lread (void); -/* Defined in eval.c */ +/* Defined in eval.c. */ extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qdefun, Qmacro; extern Lisp_Object Qinhibit_quit; extern Lisp_Object Vautoload_queue; @@ -2830,6 +2830,9 @@ EXFUN (Frun_hook_with_args, MANY); EXFUN (Frun_hook_with_args_until_failure, MANY); extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object); +extern Lisp_Object run_hook_with_args (int nargs, Lisp_Object *args, + Lisp_Object (*funcall) + (int nargs, Lisp_Object *args)); EXFUN (Fprogn, UNEVALLED); EXFUN (Finteractive_p, 0); EXFUN (Fthrow, 2) NO_RETURN; ------------------------------------------------------------ revno: 103768 committer: Leo Liu branch nick: trunk timestamp: Mon 2011-03-28 22:34:32 +0800 message: Place empty abbrev tables after nonempty ones when editing diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-03-27 10:55:07 +0000 +++ lisp/ChangeLog 2011-03-28 14:34:32 +0000 @@ -1,3 +1,9 @@ +2011-03-28 Leo Liu + + * abbrev.el (abbrev-table-empty-p): New function. + (prepare-abbrev-list-buffer): Place empty abbrev tables after + nonempty ones. (Bug#5937) + 2011-03-27 Jan Djärv * cus-start.el (all): Add boolean ns-auto-hide-menu-bar. === modified file 'lisp/abbrev.el' --- lisp/abbrev.el 2011-03-22 15:38:40 +0000 +++ lisp/abbrev.el 2011-03-28 14:34:32 +0000 @@ -123,8 +123,13 @@ (if local (insert-abbrev-table-description (abbrev-table-name local-table) t) - (dolist (table abbrev-table-name-list) - (insert-abbrev-table-description table t))) + (let (empty-tables) + (dolist (table abbrev-table-name-list) + (if (abbrev-table-empty-p (symbol-value table)) + (push table empty-tables) + (insert-abbrev-table-description table t))) + (dolist (table (nreverse empty-tables)) + (insert-abbrev-table-description table t)))) (goto-char (point-min)) (set-buffer-modified-p nil) (edit-abbrevs-mode) @@ -420,6 +425,19 @@ (and (vectorp object) (numberp (abbrev-table-get object :abbrev-table-modiff)))) +(defun abbrev-table-empty-p (object &optional ignore-system) + "Return nil if there are no abbrev symbols in OBJECT. +If IGNORE-SYSTEM is non-nil, system definitions are ignored." + (unless (abbrev-table-p object) + (error "Non abbrev table object")) + (not (catch 'some + (mapatoms (lambda (abbrev) + (unless (or (zerop (length (symbol-name abbrev))) + (and ignore-system + (abbrev-get abbrev :system))) + (throw 'some t))) + object)))) + (defvar global-abbrev-table (make-abbrev-table) "The abbrev table whose abbrevs affect all buffers. Each buffer may also have a local abbrev table. ------------------------------------------------------------ revno: 103767 committer: Juanma Barranquero branch nick: trunk timestamp: Mon 2011-03-28 05:29:18 +0200 message: src/*.c: Remove unused parameters and other warnings. * dispextern.h (string_buffer_position): Remove declaration. * print.c (strout): Remove parameter `multibyte', unused since revno:25356 (1999-08-21). All callers changed. * search.c (boyer_moore): Remove parameters `len', `pos' and `lim', never used since function introduction in revno:20870 (1998-02-08). All callers changed. * w32.c (_wsa_errlist): Use braces for struct initializers. * xdisp.c (string_buffer_position_lim): Remove parameter `w', never used since function introduction in revno:36704 (2001-03-09). All callers changed. (string_buffer_position): Likewise. Also, make static (it's never used outside xdisp.c). (cursor_row_p): Remove parameter `w', unused since revno:32591 (2000-10-17). All callers changed. (decode_mode_spec): Remove parameter `precision', introduced during Gerd Moellmann's rewrite at revno:25013 (1999-07-21), but never used. All callers changed. diff: === modified file 'src/ChangeLog' --- src/ChangeLog 2011-03-27 10:55:07 +0000 +++ src/ChangeLog 2011-03-28 03:29:18 +0000 @@ -1,3 +1,27 @@ +2011-03-28 Juanma Barranquero + + * dispextern.h (string_buffer_position): Remove declaration. + + * print.c (strout): Remove parameter `multibyte', unused since + revno:25356 (1999-08-21). All callers changed. + + * search.c (boyer_moore): Remove parameters `len', `pos' and `lim', + never used since function introduction in revno:20870 (1998-02-08). + All callers changed. + + * w32.c (_wsa_errlist): Use braces for struct initializers. + + * xdisp.c (string_buffer_position_lim): Remove parameter `w', + never used since function introduction in revno:36704 (2001-03-09). + All callers changed. + (string_buffer_position): Likewise. Also, make static (it's never + used outside xdisp.c). + (cursor_row_p): Remove parameter `w', unused since + revno:32591 (2000-10-17). All callers changed. + (decode_mode_spec): Remove parameter `precision', introduced during + Gerd Moellmann's rewrite at revno:25013 (1999-07-21), but never used. + All callers changed. + 2011-03-27 Jan Djärv * nsterm.m (syms_of_nsterm): Use doc: for ns-auto-hide-menu-bar. === modified file 'src/dispextern.h' --- src/dispextern.h 2011-03-25 15:39:59 +0000 +++ src/dispextern.h 2011-03-28 03:29:18 +0000 @@ -2953,8 +2953,6 @@ struct glyph_row *row_containing_pos (struct window *, EMACS_INT, struct glyph_row *, struct glyph_row *, int); -EMACS_INT string_buffer_position (struct window *, Lisp_Object, - EMACS_INT); int line_bottom_y (struct it *); int display_prop_intangible_p (Lisp_Object); void resize_echo_area_exactly (void); === modified file 'src/print.c' --- src/print.c 2011-03-17 16:32:03 +0000 +++ src/print.c 2011-03-28 03:29:18 +0000 @@ -273,7 +273,7 @@ static void strout (const char *ptr, EMACS_INT size, EMACS_INT size_byte, - Lisp_Object printcharfun, int multibyte) + Lisp_Object printcharfun) { if (size < 0) size_byte = size = strlen (ptr); @@ -406,16 +406,13 @@ SAFE_ALLOCA (buffer, char *, nbytes); memcpy (buffer, SDATA (string), nbytes); - strout (buffer, chars, SBYTES (string), - printcharfun, STRING_MULTIBYTE (string)); + strout (buffer, chars, SBYTES (string), printcharfun); SAFE_FREE (); } else /* No need to copy, since output to print_buffer can't GC. */ - strout (SSDATA (string), - chars, SBYTES (string), - printcharfun, STRING_MULTIBYTE (string)); + strout (SSDATA (string), chars, SBYTES (string), printcharfun); } else { @@ -472,7 +469,7 @@ printcharfun = Vstandard_output; PRINTPREPARE; - strout (data, size, size, printcharfun, 0); + strout (data, size, size, printcharfun); PRINTFINISH; } @@ -486,7 +483,7 @@ PRINTDECLARE; PRINTPREPARE; - strout (data, size, size, printcharfun, 0); + strout (data, size, size, printcharfun); PRINTFINISH; } @@ -1404,7 +1401,7 @@ if (EQ (obj, being_printed[i])) { sprintf (buf, "#%d", i); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); return; } being_printed[print_depth] = obj; @@ -1420,7 +1417,7 @@ { /* Add a prefix #n= if OBJ has not yet been printed; that is, its status field is nil. */ sprintf (buf, "#%d=", -n); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); /* OBJ is going to be printed. Remember that fact. */ Fputhash (obj, make_number (- n), Vprint_number_table); } @@ -1428,7 +1425,7 @@ { /* Just print #n# if OBJ has already been printed. */ sprintf (buf, "#%d#", n); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); return; } } @@ -1446,7 +1443,7 @@ sprintf (buf, "%ld", (long) XINT (obj)); else abort (); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); break; case Lisp_Float: @@ -1454,7 +1451,7 @@ char pigbuf[FLOAT_TO_STRING_BUFSIZE]; float_to_string (pigbuf, XFLOAT_DATA (obj)); - strout (pigbuf, -1, -1, printcharfun, 0); + strout (pigbuf, -1, -1, printcharfun); } break; @@ -1532,7 +1529,7 @@ sprintf (outbuf, "\\x%04x", c); need_nonhex = 1; } - strout (outbuf, -1, -1, printcharfun, 0); + strout (outbuf, -1, -1, printcharfun); } else if (! multibyte && SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c) @@ -1544,7 +1541,7 @@ using octal escapes. */ char outbuf[5]; sprintf (outbuf, "\\%03o", c); - strout (outbuf, -1, -1, printcharfun, 0); + strout (outbuf, -1, -1, printcharfun); } else { @@ -1557,7 +1554,7 @@ if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || (c >= '0' && c <= '9')) - strout ("\\ ", -1, -1, printcharfun, 0); + strout ("\\ ", -1, -1, printcharfun); } if (c == '\"' || c == '\\') @@ -1645,7 +1642,7 @@ /* If deeper than spec'd depth, print placeholder. */ if (INTEGERP (Vprint_level) && print_depth > XINT (Vprint_level)) - strout ("...", -1, -1, printcharfun, 0); + strout ("...", -1, -1, printcharfun); else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj))) && (EQ (XCAR (obj), Qquote))) { @@ -1705,7 +1702,7 @@ if (i != 0 && EQ (obj, halftail)) { sprintf (buf, " . #%d", i / 2); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); goto end_of_list; } } @@ -1717,7 +1714,7 @@ Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil); if (INTEGERP (num)) { - strout (" . ", 3, 3, printcharfun, 0); + strout (" . ", 3, 3, printcharfun); print_object (obj, printcharfun, escapeflag); goto end_of_list; } @@ -1729,7 +1726,7 @@ if (print_length && i > print_length) { - strout ("...", 3, 3, printcharfun, 0); + strout ("...", 3, 3, printcharfun); goto end_of_list; } @@ -1744,7 +1741,7 @@ /* OBJ non-nil here means it's the end of a dotted list. */ if (!NILP (obj)) { - strout (" . ", 3, 3, printcharfun, 0); + strout (" . ", 3, 3, printcharfun); print_object (obj, printcharfun, escapeflag); } @@ -1758,7 +1755,7 @@ { if (escapeflag) { - strout ("#name, printcharfun); PRINTCHAR ('>'); } @@ -1779,7 +1776,7 @@ PRINTCHAR ('#'); PRINTCHAR ('&'); sprintf (buf, "%ld", (long) XBOOL_VECTOR (obj)->size); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); PRINTCHAR ('\"'); /* Don't print more characters than the specified maximum. @@ -1824,18 +1821,18 @@ } else if (SUBRP (obj)) { - strout ("#symbol_name, -1, -1, printcharfun, 0); + strout ("#symbol_name, -1, -1, printcharfun); PRINTCHAR ('>'); } else if (WINDOWP (obj)) { - strout ("#sequence_number)); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); if (!NILP (XWINDOW (obj)->buffer)) { - strout (" on ", -1, -1, printcharfun, 0); + strout (" on ", -1, -1, printcharfun); print_string (BVAR (XBUFFER (XWINDOW (obj)->buffer), name), printcharfun); } PRINTCHAR ('>'); @@ -1843,13 +1840,13 @@ else if (TERMINALP (obj)) { struct terminal *t = XTERMINAL (obj); - strout ("#id); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); if (t->name) { - strout (" on ", -1, -1, printcharfun, 0); - strout (t->name, -1, -1, printcharfun, 0); + strout (" on ", -1, -1, printcharfun); + strout (t->name, -1, -1, printcharfun); } PRINTCHAR ('>'); } @@ -1859,21 +1856,21 @@ int i; EMACS_INT real_size, size; #if 0 - strout ("#test)) { PRINTCHAR (' '); PRINTCHAR ('\''); - strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun, 0); + strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun); PRINTCHAR (' '); - strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun, 0); + strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun); PRINTCHAR (' '); sprintf (buf, "%ld/%ld", (long) h->count, (long) XVECTOR (h->next)->size); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); } sprintf (buf, " 0x%lx", (unsigned long) h); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); PRINTCHAR ('>'); #endif /* Implement a readable output, e.g.: @@ -1881,33 +1878,33 @@ /* Always print the size. */ sprintf (buf, "#s(hash-table size %ld", (long) XVECTOR (h->next)->size); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); if (!NILP (h->test)) { - strout (" test ", -1, -1, printcharfun, 0); + strout (" test ", -1, -1, printcharfun); print_object (h->test, printcharfun, escapeflag); } if (!NILP (h->weak)) { - strout (" weakness ", -1, -1, printcharfun, 0); + strout (" weakness ", -1, -1, printcharfun); print_object (h->weak, printcharfun, escapeflag); } if (!NILP (h->rehash_size)) { - strout (" rehash-size ", -1, -1, printcharfun, 0); + strout (" rehash-size ", -1, -1, printcharfun); print_object (h->rehash_size, printcharfun, escapeflag); } if (!NILP (h->rehash_threshold)) { - strout (" rehash-threshold ", -1, -1, printcharfun, 0); + strout (" rehash-threshold ", -1, -1, printcharfun); print_object (h->rehash_threshold, printcharfun, escapeflag); } - strout (" data ", -1, -1, printcharfun, 0); + strout (" data ", -1, -1, printcharfun); /* Print the data here as a plist. */ real_size = HASH_TABLE_SIZE (h); @@ -1929,7 +1926,7 @@ } if (size < real_size) - strout (" ...", 4, 4, printcharfun, 0); + strout (" ...", 4, 4, printcharfun); PRINTCHAR (')'); PRINTCHAR (')'); @@ -1938,10 +1935,10 @@ else if (BUFFERP (obj)) { if (NILP (BVAR (XBUFFER (obj), name))) - strout ("#", -1, -1, printcharfun, 0); + strout ("#", -1, -1, printcharfun); else if (escapeflag) { - strout ("#'); } @@ -1950,16 +1947,16 @@ } else if (WINDOW_CONFIGURATIONP (obj)) { - strout ("#", -1, -1, printcharfun, 0); + strout ("#", -1, -1, printcharfun); } else if (FRAMEP (obj)) { strout ((FRAME_LIVE_P (XFRAME (obj)) ? "#name, printcharfun); sprintf (buf, " 0x%lx", (unsigned long) (XFRAME (obj))); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); PRINTCHAR ('>'); } else if (FONTP (obj)) @@ -1969,9 +1966,9 @@ if (! FONT_OBJECT_P (obj)) { if (FONT_SPEC_P (obj)) - strout ("#insertion_type != 0) - strout ("(moves after insertion) ", -1, -1, printcharfun, 0); + strout ("(moves after insertion) ", -1, -1, printcharfun); if (! XMARKER (obj)->buffer) - strout ("in no buffer", -1, -1, printcharfun, 0); + strout ("in no buffer", -1, -1, printcharfun); else { sprintf (buf, "at %ld", (long)marker_position (obj)); - strout (buf, -1, -1, printcharfun, 0); - strout (" in ", -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); + strout (" in ", -1, -1, printcharfun); print_string (BVAR (XMARKER (obj)->buffer, name), printcharfun); } PRINTCHAR ('>'); break; case Lisp_Misc_Overlay: - strout ("#buffer) - strout ("in no buffer", -1, -1, printcharfun, 0); + strout ("in no buffer", -1, -1, printcharfun); else { sprintf (buf, "from %ld to %ld in ", (long)marker_position (OVERLAY_START (obj)), (long)marker_position (OVERLAY_END (obj))); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); print_string (BVAR (XMARKER (OVERLAY_START (obj))->buffer, name), printcharfun); } @@ -2082,15 +2079,15 @@ /* Remaining cases shouldn't happen in normal usage, but let's print them anyway for the benefit of the debugger. */ case Lisp_Misc_Free: - strout ("#", -1, -1, printcharfun, 0); + strout ("#", -1, -1, printcharfun); break; case Lisp_Misc_Save_Value: - strout ("#pointer, XSAVE_VALUE (obj)->integer); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); PRINTCHAR ('>'); break; @@ -2104,16 +2101,16 @@ { /* We're in trouble if this happens! Probably should just abort () */ - strout ("#size); else sprintf (buf, "(0x%02x)", (int) XTYPE (obj)); - strout (buf, -1, -1, printcharfun, 0); + strout (buf, -1, -1, printcharfun); strout (" Save your buffers immediately and please report this bug>", - -1, -1, printcharfun, 0); + -1, -1, printcharfun); } } === modified file 'src/search.c' --- src/search.c 2011-03-15 21:14:06 +0000 +++ src/search.c 2011-03-28 03:29:18 +0000 @@ -95,10 +95,9 @@ static EMACS_INT simple_search (EMACS_INT, unsigned char *, EMACS_INT, EMACS_INT, Lisp_Object, EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT); -static EMACS_INT boyer_moore (EMACS_INT, unsigned char *, EMACS_INT, EMACS_INT, - Lisp_Object, Lisp_Object, - EMACS_INT, EMACS_INT, - EMACS_INT, EMACS_INT, int); +static EMACS_INT boyer_moore (EMACS_INT, unsigned char *, EMACS_INT, + Lisp_Object, Lisp_Object, EMACS_INT, + EMACS_INT, int); static EMACS_INT search_buffer (Lisp_Object, EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT, int, Lisp_Object, Lisp_Object, int); @@ -1416,15 +1415,14 @@ } len_byte = pat - patbuf; - len = raw_pattern_size; pat = base_pat = patbuf; if (boyer_moore_ok) - return boyer_moore (n, pat, len, len_byte, trt, inverse_trt, - pos, pos_byte, lim, lim_byte, + return boyer_moore (n, pat, len_byte, trt, inverse_trt, + pos_byte, lim_byte, char_base); else - return simple_search (n, pat, len, len_byte, trt, + return simple_search (n, pat, raw_pattern_size, len_byte, trt, pos, pos_byte, lim, lim_byte); } } @@ -1636,8 +1634,8 @@ } /* Do Boyer-Moore search N times for the string BASE_PAT, - whose length is LEN/LEN_BYTE, - from buffer position POS/POS_BYTE until LIM/LIM_BYTE. + whose length is LEN_BYTE, + from buffer position POS_BYTE until LIM_BYTE. DIRECTION says which direction we search in. TRT and INVERSE_TRT are translation tables. Characters in PAT are already translated by TRT. @@ -1652,10 +1650,10 @@ static EMACS_INT boyer_moore (EMACS_INT n, unsigned char *base_pat, - EMACS_INT len, EMACS_INT len_byte, + EMACS_INT len_byte, Lisp_Object trt, Lisp_Object inverse_trt, - EMACS_INT pos, EMACS_INT pos_byte, - EMACS_INT lim, EMACS_INT lim_byte, int char_base) + EMACS_INT pos_byte, EMACS_INT lim_byte, + int char_base) { int direction = ((n > 0) ? 1 : -1); register EMACS_INT dirlen; @@ -1776,8 +1774,8 @@ stride_for_teases = BM_tab[j]; BM_tab[j] = dirlen - i; - /* A translation table is accompanied by its inverse -- see */ - /* comment following downcase_table for details */ + /* A translation table is accompanied by its inverse -- see + comment following downcase_table for details. */ if (ch >= 0) { int starting_ch = ch; === modified file 'src/w32.c' --- src/w32.c 2011-03-26 02:48:03 +0000 +++ src/w32.c 2011-03-28 03:29:18 +0000 @@ -4517,75 +4517,75 @@ int errnum; char * msg; } _wsa_errlist[] = { - WSAEINTR , "Interrupted function call", - WSAEBADF , "Bad file descriptor", - WSAEACCES , "Permission denied", - WSAEFAULT , "Bad address", - WSAEINVAL , "Invalid argument", - WSAEMFILE , "Too many open files", - - WSAEWOULDBLOCK , "Resource temporarily unavailable", - WSAEINPROGRESS , "Operation now in progress", - WSAEALREADY , "Operation already in progress", - WSAENOTSOCK , "Socket operation on non-socket", - WSAEDESTADDRREQ , "Destination address required", - WSAEMSGSIZE , "Message too long", - WSAEPROTOTYPE , "Protocol wrong type for socket", - WSAENOPROTOOPT , "Bad protocol option", - WSAEPROTONOSUPPORT , "Protocol not supported", - WSAESOCKTNOSUPPORT , "Socket type not supported", - WSAEOPNOTSUPP , "Operation not supported", - WSAEPFNOSUPPORT , "Protocol family not supported", - WSAEAFNOSUPPORT , "Address family not supported by protocol family", - WSAEADDRINUSE , "Address already in use", - WSAEADDRNOTAVAIL , "Cannot assign requested address", - WSAENETDOWN , "Network is down", - WSAENETUNREACH , "Network is unreachable", - WSAENETRESET , "Network dropped connection on reset", - WSAECONNABORTED , "Software caused connection abort", - WSAECONNRESET , "Connection reset by peer", - WSAENOBUFS , "No buffer space available", - WSAEISCONN , "Socket is already connected", - WSAENOTCONN , "Socket is not connected", - WSAESHUTDOWN , "Cannot send after socket shutdown", - WSAETOOMANYREFS , "Too many references", /* not sure */ - WSAETIMEDOUT , "Connection timed out", - WSAECONNREFUSED , "Connection refused", - WSAELOOP , "Network loop", /* not sure */ - WSAENAMETOOLONG , "Name is too long", - WSAEHOSTDOWN , "Host is down", - WSAEHOSTUNREACH , "No route to host", - WSAENOTEMPTY , "Buffer not empty", /* not sure */ - WSAEPROCLIM , "Too many processes", - WSAEUSERS , "Too many users", /* not sure */ - WSAEDQUOT , "Double quote in host name", /* really not sure */ - WSAESTALE , "Data is stale", /* not sure */ - WSAEREMOTE , "Remote error", /* not sure */ - - WSASYSNOTREADY , "Network subsystem is unavailable", - WSAVERNOTSUPPORTED , "WINSOCK.DLL version out of range", - WSANOTINITIALISED , "Winsock not initialized successfully", - WSAEDISCON , "Graceful shutdown in progress", + {WSAEINTR , "Interrupted function call"}, + {WSAEBADF , "Bad file descriptor"}, + {WSAEACCES , "Permission denied"}, + {WSAEFAULT , "Bad address"}, + {WSAEINVAL , "Invalid argument"}, + {WSAEMFILE , "Too many open files"}, + + {WSAEWOULDBLOCK , "Resource temporarily unavailable"}, + {WSAEINPROGRESS , "Operation now in progress"}, + {WSAEALREADY , "Operation already in progress"}, + {WSAENOTSOCK , "Socket operation on non-socket"}, + {WSAEDESTADDRREQ , "Destination address required"}, + {WSAEMSGSIZE , "Message too long"}, + {WSAEPROTOTYPE , "Protocol wrong type for socket"}, + {WSAENOPROTOOPT , "Bad protocol option"}, + {WSAEPROTONOSUPPORT , "Protocol not supported"}, + {WSAESOCKTNOSUPPORT , "Socket type not supported"}, + {WSAEOPNOTSUPP , "Operation not supported"}, + {WSAEPFNOSUPPORT , "Protocol family not supported"}, + {WSAEAFNOSUPPORT , "Address family not supported by protocol family"}, + {WSAEADDRINUSE , "Address already in use"}, + {WSAEADDRNOTAVAIL , "Cannot assign requested address"}, + {WSAENETDOWN , "Network is down"}, + {WSAENETUNREACH , "Network is unreachable"}, + {WSAENETRESET , "Network dropped connection on reset"}, + {WSAECONNABORTED , "Software caused connection abort"}, + {WSAECONNRESET , "Connection reset by peer"}, + {WSAENOBUFS , "No buffer space available"}, + {WSAEISCONN , "Socket is already connected"}, + {WSAENOTCONN , "Socket is not connected"}, + {WSAESHUTDOWN , "Cannot send after socket shutdown"}, + {WSAETOOMANYREFS , "Too many references"}, /* not sure */ + {WSAETIMEDOUT , "Connection timed out"}, + {WSAECONNREFUSED , "Connection refused"}, + {WSAELOOP , "Network loop"}, /* not sure */ + {WSAENAMETOOLONG , "Name is too long"}, + {WSAEHOSTDOWN , "Host is down"}, + {WSAEHOSTUNREACH , "No route to host"}, + {WSAENOTEMPTY , "Buffer not empty"}, /* not sure */ + {WSAEPROCLIM , "Too many processes"}, + {WSAEUSERS , "Too many users"}, /* not sure */ + {WSAEDQUOT , "Double quote in host name"}, /* really not sure */ + {WSAESTALE , "Data is stale"}, /* not sure */ + {WSAEREMOTE , "Remote error"}, /* not sure */ + + {WSASYSNOTREADY , "Network subsystem is unavailable"}, + {WSAVERNOTSUPPORTED , "WINSOCK.DLL version out of range"}, + {WSANOTINITIALISED , "Winsock not initialized successfully"}, + {WSAEDISCON , "Graceful shutdown in progress"}, #ifdef WSAENOMORE - WSAENOMORE , "No more operations allowed", /* not sure */ - WSAECANCELLED , "Operation cancelled", /* not sure */ - WSAEINVALIDPROCTABLE , "Invalid procedure table from service provider", - WSAEINVALIDPROVIDER , "Invalid service provider version number", - WSAEPROVIDERFAILEDINIT , "Unable to initialize a service provider", - WSASYSCALLFAILURE , "System call failure", - WSASERVICE_NOT_FOUND , "Service not found", /* not sure */ - WSATYPE_NOT_FOUND , "Class type not found", - WSA_E_NO_MORE , "No more resources available", /* really not sure */ - WSA_E_CANCELLED , "Operation already cancelled", /* really not sure */ - WSAEREFUSED , "Operation refused", /* not sure */ + {WSAENOMORE , "No more operations allowed"}, /* not sure */ + {WSAECANCELLED , "Operation cancelled"}, /* not sure */ + {WSAEINVALIDPROCTABLE , "Invalid procedure table from service provider"}, + {WSAEINVALIDPROVIDER , "Invalid service provider version number"}, + {WSAEPROVIDERFAILEDINIT , "Unable to initialize a service provider"}, + {WSASYSCALLFAILURE , "System call failure"}, + {WSASERVICE_NOT_FOUND , "Service not found"}, /* not sure */ + {WSATYPE_NOT_FOUND , "Class type not found"}, + {WSA_E_NO_MORE , "No more resources available"}, /* really not sure */ + {WSA_E_CANCELLED , "Operation already cancelled"}, /* really not sure */ + {WSAEREFUSED , "Operation refused"}, /* not sure */ #endif - WSAHOST_NOT_FOUND , "Host not found", - WSATRY_AGAIN , "Authoritative host not found during name lookup", - WSANO_RECOVERY , "Non-recoverable error during name lookup", - WSANO_DATA , "Valid name, no data record of requested type", + {WSAHOST_NOT_FOUND , "Host not found"}, + {WSATRY_AGAIN , "Authoritative host not found during name lookup"}, + {WSANO_RECOVERY , "Non-recoverable error during name lookup"}, + {WSANO_DATA , "Valid name, no data record of requested type"}, - -1, NULL + {-1, NULL} }; char * === modified file 'src/xdisp.c' --- src/xdisp.c 2011-03-26 12:20:20 +0000 +++ src/xdisp.c 2011-03-28 03:29:18 +0000 @@ -754,7 +754,7 @@ static void mark_window_display_accurate_1 (struct window *, int); static int single_display_spec_string_p (Lisp_Object, Lisp_Object); static int display_prop_string_p (Lisp_Object, Lisp_Object); -static int cursor_row_p (struct window *, struct glyph_row *); +static int cursor_row_p (struct glyph_row *); static int redisplay_mode_lines (Lisp_Object, int); static char *decode_mode_spec_coding (Lisp_Object, char *, int); @@ -823,8 +823,7 @@ static int display_mode_line (struct window *, enum face_id, Lisp_Object); static int display_mode_element (struct it *, int, int, int, Lisp_Object, Lisp_Object, int); static int store_mode_line_string (const char *, Lisp_Object, int, int, int, Lisp_Object); -static const char *decode_mode_spec (struct window *, int, int, int, - Lisp_Object *); +static const char *decode_mode_spec (struct window *, int, int, Lisp_Object *); static void display_menu_bar (struct window *); static int display_count_lines (EMACS_INT, EMACS_INT, EMACS_INT, int, EMACS_INT *); @@ -4420,20 +4419,18 @@ return 0; } -/* Look for STRING in overlays and text properties in W's buffer, - between character positions FROM and TO (excluding TO). +/* Look for STRING in overlays and text properties in the current + buffer, between character positions FROM and TO (excluding TO). BACK_P non-zero means look back (in this case, TO is supposed to be less than FROM). Value is the first character position where STRING was found, or zero if it wasn't found before hitting TO. - W's buffer must be current. - This function may only use code that doesn't eval because it is called asynchronously from note_mouse_highlight. */ static EMACS_INT -string_buffer_position_lim (struct window *w, Lisp_Object string, +string_buffer_position_lim (Lisp_Object string, EMACS_INT from, EMACS_INT to, int back_p) { Lisp_Object limit, prop, pos; @@ -4471,27 +4468,25 @@ return found ? XINT (pos) : 0; } -/* Determine which buffer position in W's buffer STRING comes from. +/* Determine which buffer position in current buffer STRING comes from. AROUND_CHARPOS is an approximate position where it could come from. Value is the buffer position or 0 if it couldn't be determined. - W's buffer must be current. - This function is necessary because we don't record buffer positions in glyphs generated from strings (to keep struct glyph small). This function may only use code that doesn't eval because it is called asynchronously from note_mouse_highlight. */ -EMACS_INT -string_buffer_position (struct window *w, Lisp_Object string, EMACS_INT around_charpos) +static EMACS_INT +string_buffer_position (Lisp_Object string, EMACS_INT around_charpos) { const int MAX_DISTANCE = 1000; - EMACS_INT found = string_buffer_position_lim (w, string, around_charpos, + EMACS_INT found = string_buffer_position_lim (string, around_charpos, around_charpos + MAX_DISTANCE, 0); if (!found) - found = string_buffer_position_lim (w, string, around_charpos, + found = string_buffer_position_lim (string, around_charpos, around_charpos - MAX_DISTANCE, 1); return found; } @@ -12731,7 +12726,7 @@ EMACS_INT tem; str = glyph->object; - tem = string_buffer_position_lim (w, str, pos, pos_after, 0); + tem = string_buffer_position_lim (str, pos, pos_after, 0); if (tem == 0 /* from overlay */ || pos <= tem) { @@ -13457,7 +13452,7 @@ && row < w->current_matrix->rows + w->current_matrix->nrows - 1 && MATRIX_ROW_START_CHARPOS (row+1) == PT - && !cursor_row_p (w, row)) + && !cursor_row_p (row)) ++row; /* If within the scroll margin, scroll. Note that @@ -13509,7 +13504,7 @@ skip forward over overlay strings. */ while (MATRIX_ROW_BOTTOM_Y (row) < last_y && MATRIX_ROW_END_CHARPOS (row) == PT - && !cursor_row_p (w, row)) + && !cursor_row_p (row)) ++row; /* If within the scroll margin, scroll. */ @@ -13605,7 +13600,7 @@ { if (MATRIX_ROW_START_CHARPOS (row) <= PT && PT <= MATRIX_ROW_END_CHARPOS (row) - && cursor_row_p (w, row)) + && cursor_row_p (row)) rv |= set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); /* As soon as we've found the first suitable row @@ -13644,7 +13639,7 @@ } while (MATRIX_ROW_BOTTOM_Y (row) < last_y && MATRIX_ROW_START_CHARPOS (row) == PT - && cursor_row_p (w, row)); + && cursor_row_p (row)); } } } @@ -16971,11 +16966,11 @@ } -/* Value is non-zero if glyph row ROW in window W should be +/* Value is non-zero if glyph row ROW should be used to hold the cursor. */ static int -cursor_row_p (struct window *w, struct glyph_row *row) +cursor_row_p (struct glyph_row *row) { int result = 1; @@ -17888,7 +17883,7 @@ && !MATRIX_ROW (it->w->desired_matrix, cvpos)->ends_at_zv_p)) && PT >= MATRIX_ROW_START_CHARPOS (row) && PT <= MATRIX_ROW_END_CHARPOS (row) - && cursor_row_p (it->w, row)) + && cursor_row_p (row)) set_cursor_from_row (it->w, row, it->w->desired_matrix, 0, 0, 0, 0); /* Highlight trailing whitespace. */ @@ -18540,7 +18535,7 @@ charpos = (STRING_MULTIBYTE (elt) ? string_byte_to_char (elt, bytepos) : bytepos); - spec = decode_mode_spec (it->w, c, field, prec, &string); + spec = decode_mode_spec (it->w, c, field, &string); multibyte = STRINGP (string) && STRING_MULTIBYTE (string); switch (mode_line_target) @@ -19211,9 +19206,8 @@ } /* Return a string for the output of a mode line %-spec for window W, - generated by character C. PRECISION >= 0 means don't return a - string longer than that value. FIELD_WIDTH > 0 means pad the - string returned with spaces to that value. Return a Lisp string in + generated by character C. FIELD_WIDTH > 0 means pad the string + returned with spaces to that value. Return a Lisp string in *STRING if the resulting string is taken from that Lisp string. Note we operate on the current buffer for most purposes, @@ -19223,7 +19217,7 @@ static const char * decode_mode_spec (struct window *w, register int c, int field_width, - int precision, Lisp_Object *string) + Lisp_Object *string) { Lisp_Object obj; struct frame *f = XFRAME (WINDOW_FRAME (w)); @@ -24324,7 +24318,7 @@ END_CHARPOS, or if they come from an overlay. */ if (EQ (glyph->object, before_string)) { - pos = string_buffer_position (w, before_string, + pos = string_buffer_position (before_string, start_charpos); /* If pos == 0, it means before_string came from an overlay, not from a buffer position. */ @@ -24333,7 +24327,7 @@ } else if (EQ (glyph->object, after_string)) { - pos = string_buffer_position (w, after_string, end_charpos); + pos = string_buffer_position (after_string, end_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } @@ -24375,7 +24369,7 @@ END_CHARPOS, or if they come from an overlay. */ if (EQ (glyph->object, before_string)) { - pos = string_buffer_position (w, before_string, start_charpos); + pos = string_buffer_position (before_string, start_charpos); /* If pos == 0, it means before_string came from an overlay, not from a buffer position. */ if (!pos || (pos >= start_charpos && pos < end_charpos)) @@ -24383,7 +24377,7 @@ } else if (EQ (glyph->object, after_string)) { - pos = string_buffer_position (w, after_string, end_charpos); + pos = string_buffer_position (after_string, end_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } @@ -24441,13 +24435,13 @@ END_CHARPOS, or if they come from an overlay. */ if (EQ (end->object, before_string)) { - pos = string_buffer_position (w, before_string, start_charpos); + pos = string_buffer_position (before_string, start_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } else if (EQ (end->object, after_string)) { - pos = string_buffer_position (w, after_string, end_charpos); + pos = string_buffer_position (after_string, end_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } @@ -24491,13 +24485,13 @@ END_CHARPOS, or if they come from an overlay. */ if (EQ (end->object, before_string)) { - pos = string_buffer_position (w, before_string, start_charpos); + pos = string_buffer_position (before_string, start_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } else if (EQ (end->object, after_string)) { - pos = string_buffer_position (w, after_string, end_charpos); + pos = string_buffer_position (after_string, end_charpos); if (!pos || (pos >= start_charpos && pos < end_charpos)) break; } @@ -25481,7 +25475,7 @@ check if the text under it has one. */ struct glyph_row *r = MATRIX_ROW (w->current_matrix, vpos); EMACS_INT start = MATRIX_ROW_START_CHARPOS (r); - pos = string_buffer_position (w, object, start); + pos = string_buffer_position (object, start); if (pos > 0) { mouse_face = get_char_property_and_overlay @@ -25591,7 +25585,7 @@ struct glyph_row *r = MATRIX_ROW (w->current_matrix, vpos); EMACS_INT start = MATRIX_ROW_START_CHARPOS (r); - EMACS_INT p = string_buffer_position (w, obj, start); + EMACS_INT p = string_buffer_position (obj, start); if (p > 0) { help = Fget_char_property (make_number (p), @@ -25647,7 +25641,7 @@ struct glyph_row *r = MATRIX_ROW (w->current_matrix, vpos); EMACS_INT start = MATRIX_ROW_START_CHARPOS (r); - EMACS_INT p = string_buffer_position (w, obj, start); + EMACS_INT p = string_buffer_position (obj, start); if (p > 0) pointer = Fget_char_property (make_number (p), Qpointer, w->buffer);